资源描述:
《西工大FPGA实验报告二.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、西北工业大学《硬件描述语言语与FPGA》实验报告学院:学 号:姓 名:专业:实验时间:实验地点:指导教师:西北工业大学20年月利用状态机实现比较复杂的接口设计一、实验目的及要求1.学习运用由状态机控制的逻辑开关,设计出一个比较复杂的接口逻辑;2.在复杂设计中使用任务(task)结构,以提高程序的可读性;3.加深对可综合风格模块的认识。二、实验设备(环境)及要求预装了开发工具synplify、ModelSimSE的PC机。三、实验内容与步骤内容:利用状态机实现一个比较复杂的接口设计。步骤:1.建立工程并编写模块源码
2、;2.编写测试模块并思考状态机是如何实现复杂的接口设计的;3.布局布线并仿真;4.记录数据并完成实验报告。四、实验代码modulewriting(reset,clk,address,data,sda,ack);inputreset,clk;input[7:0]data,address;inoutsda;outputack;reglink_write;reg[3:0]state;reg[4:0]sh8out_state;reg[7:0]sh8out_buf;regfinish_F;regack;parameteridl
3、e=0,addr_write=1,data_write=2,stop_ack=3;parameterbit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;assignsda=link_write?sh8out_buf[7]:1'bz;always@(posedgeclk)beginif(!reset)beginlink_write<=0;state<=idle;finish_F<=0;sh8out_state<=idle;ack<=0;sh8out_buf<=
4、0;endelsecase(state)idle:beginlink_write<=0;finish_F<=0;sh8out_state<=idle;ack<=0;sh8out_buf<=address;state<=addr_write;endaddr_write:beginif(finish_F==0)beginshift8_out;endelsebeginsh8out_state<=idle;sh8out_buf<=data;state<=data_write;finish_F<=0;endenddata_wr
5、ite:beginif(finish_F==0)beginshift8_out;endelsebeginlink_write<=0;state<=stop_ack;finish_F<=0;ack<=1;endendstop_ack:beginack<=0;state<=idle;endendcaseendtaskshift8_out;begincase(sh8out_state)idle:beginlink_write<=1;sh8out_state<=bit7;endbit7:beginlink_write<=1;
6、sh8out_state<=bit6;sh8out_buf<=sh8out_buf<<1;endbit6:beginsh8out_state<=bit5;sh8out_buf<=sh8out_buf<<1;endbit5:beginsh8out_state<=bit4;sh8out_buf<=sh8out_buf<<1;endbit4:beginsh8out_state<=bit3;sh8out_buf<=sh8out_buf<<1;endbit3:beginsh8out_state<=bit2;sh8out_buf
7、<=sh8out_buf<<1;endbit2:beginsh8out_state<=bit1;sh8out_buf<=sh8out_buf<<1;endbit1:beginsh8out_state<=bit0;sh8out_buf<=sh8out_buf<<1;endbit0:beginlink_write<=0;finish_F<=1;endendcaseendendtaskendmodule//测试代码:`timescale1ns/100ps`defineclk_cycle50modulewritingTop;
8、regreset,clk;reg[7:0]data,address;wireack,sda;always#`clk_cycleclk=~clk;initialbeginclk=0;reset=1;data=0;address=0;#(2*`clk_cycle)reset=0;#(2*`clk_cycle)reset=1;#(100*`clk_c