综合实验报告第四组组长:韩欢02081535陈洁钰02081536侯旭涛02081514高耀02081510李欣昊02081508李昊02081506FPGA基础试验之流水灯一、实验目的通过此实验进一步了解、熟悉和掌握Quartus II开发软件的使用方法及Verilog 语言的编程方法。
学习简单时序电路的设计分析和硬件测试。
二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的流水灯分析时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具Quartus II,学会使用Quartus II对Cyclone系列FPGA的程序开发、编译与调试;4.掌握Cyclone系列FPGA的程序加载,熟练掌握将.sof文件加载到实验板的FPGA中,实现流水灯的效果。
三、实验原理流水灯,顾名思义就是让LED像水一样的点亮。
如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。
同样,如果使得最左边的灯先亮,然后通过移位,在其右侧的灯,从左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。
初始状态时,四个灯都不亮,每来一个时钟脉冲,CLK,计数器就加1.这样通过移位依次点亮所有的灯,就形成了流水灯。
而当四个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态。
然后,再一次流水即可。
如果是右移位,就出现向右流水的现象;反之,向左流水。
四、实验要求控制4个LED进行花式显示,根据硬件设施设计两种模式:S0:从全亮到全灭,再到全亮,依次循环;S1:从LED0开始依次点亮,为LED1亮,LED2亮,LED3亮,后再LED2亮,LED1亮,LED0亮,不停循环。
即输出为:S0时,从0000到1111不停循环转换;S1时,0111,1011,1101,1110,1101,1011,0111不断循环。
五、实验步骤(1)建立工程(2)建立Verilog文件,编写相关程序(3)将verilog文件编译为可视化电路图文件(4)将可视化电路图文件添加输入输出组合成电路图文件(5)编译语法及验证原理图(6)根据需要分配管脚并进行编译(7)下载编译后得到的文件.sof(在线方式),.pof(离线方式)。
一般考虑用在线方式。
(8)显示实验结果六、电路符号:流水灯的电路符号如下图所示。
sw1为模式选择输入。
rst_n为复位信号,接高电平,sys_clk为时钟信号输入,led[3..0]为LED显示信号输出端。
七:设计方法:采用文本编辑法,即利用verilogHDL语言描述流水灯,代码如下:module liushuideng(sw1,sys_clk,rst_n,led); //接口定义input sys_clk,rst_n,sw1; //输入:系统时钟50MHz,复位输入output [3:0] led; //输出:3个led产生流水现象,轮流点亮+reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间reg [3:0] led; //led低电平点亮reg [2:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个ledalways @(posedge sys_clk)beginif(!rst_n) //复位,给寄存器赋初值beginflag <= 3'b0;count <= 26'b0;end//else //sys_clk上升沿到来//beginif( count == 26'd20)begincount <= 26'd0; //count归零,便于下次重新开始计数if(flag == 3'b111) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)flag <= 3'b000;else //否则flag加一flag <= flag+3'b001;endelsecount <= count + 26'd1; //当count没计数到指定值是,count执行加一操作endalways @(posedge sys_clk)if(sw1==1'b1)begincase(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象3'b000: led <= 4'b0000; //点亮所有灯,都为低电平3'b001: led <= 4'b1111; //没有点亮灯,都为高电平3'b010: led <= 4'b0000; //点亮所有灯,都为低电平3'b011: led <= 4'b1111; //没有点亮灯,都为高电平3'b100: led <= 4'b0000; //点亮所有灯,都为低电平3'b101: led <= 4'b1111; //没有点亮灯,都为高电平3'b110: led <= 4'b0000; //点亮所有灯,都为低电平3'b111: led <= 4'b1111; //没有点亮灯,都为高电平default:led <= 4'b1111; //一般要设置一个缺省状态,三个led全部灭endcaseendelsebegincase(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象3'b000: led <= 4'b0111; //点亮第一个灯低电平点亮3'b001: led <= 4'b1011; 点亮第二个灯低电平点亮//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++3'b010: led <= 4'b1101; //点亮第三个灯低电平点亮3'b011: led <= 4'b1110; //点亮第四个灯低电平点亮3'b100: led <= 4'b1101; //点亮第三个灯低电平点亮3'b101: led <= 4'b1011; //点亮第二个灯低电平点亮3'b110: led <= 4'b0111; //点亮第一个灯低电平点亮3'b111: led <= 4'b1111;default:led <= 4'b1111; //一般要设置一个缺省状态,三个led全部灭endcaseendendmodule七:仿真结果:1:当swl=1时,(1)时序仿真结果如图所示(2)功能仿真结果为:功能仿真没有时延。
2:当swl=0时,(1)时序仿真结果为:(2)功能仿真结果为:FPGA基础实验之正弦波形产生一、实验目的通过此实验进一步了解、熟悉和掌握Quartus II开发软件的使用方法及Verilog语言的编程方法。
学习简单时序电路的设计分析和硬件测试。
二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的正弦波形产生时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具Quartus II,学会使用Quartus II对Cyclone系列FPGA的程序开发、编译与调试;4.掌握Cyclone系列FPGA的程序加载,熟练掌握将.sof文件加载到实验板的FPGA中,实现正弦波形产生。
三、实验原理DDS(Direct Digital Synthesis)是一种应用直接数字合成技术来产生信号波形的方法。
DDS技术建立在采样定理的基础上,它首先对需要的信号波形进行采样、量化,然后存入存储器作为待产生信号的数据查询表。
在输出信号波形时,从数据表依次读出数据,产生数字信号。
四、实验步骤1、通过matlab产生一组正弦信号:a=1:1:1023;b=127*cos((1/512)*pi*a)+128;b=round(b’);将生成的1024个在1~255之间的数存入ROM之中。
2、将产生的数据保存为sin.hex文件;IP核的产生。
3、选中单口rom添加文件名。
4、将q output port 勾选去掉。
5、添加产生的sin.hex文件到rom中。
6、根据需要分配管脚并进行编译。
7、完成rom的设置,添加输入输出端口。
8、验证结果:利用波形仿真看结果,新建波形文件。
9、双击Name下面的空白处,点击NewFolder。
10、点击list。
11、点击”>>”。
12、将输入及输出添加到仿真文件中。
13、给相应的输入进行赋值;对时钟进行赋值。
14、点击工具栏中的时钟标志。
15、对a进行赋值,选出一段然后点击工具栏中的“?”选择以16进制显示。
16、赋值完毕后,开始时序仿真。
17、选择相应的仿真文件,开始仿真,完毕后查看report18、点击按幅度为5的显示,得到相应的波形,a和b的值决定了显示波形的频率及相位。
五、电路符号六、设计程序Rom1module rom1 (address,clock,q);input [9:0] address;input clock;output [7:0] q;wire [7:0] sub_wire0;wire [7:0] q = sub_wire0[7:0];altsyncram altsyncram_component (.clock0 (clock),.address_a (address),.q_a (sub_wire0),.aclr0 (1'b0),.aclr1 (1'b0),.address_b (1'b1),.addressstall_a (1'b0),.addressstall_b (1'b0),.byteena_a (1'b1),.byteena_b (1'b1),.clock1 (1'b1),.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a ({8{1'b1}}),.data_b (1'b1),.eccstatus (),.q_b (),.rden_a (1'b1),.rden_b (1'b1),.wren_a (1'b0),.wren_b (1'b0));defparamaltsyncram_component.address_aclr_a = "NONE",`ifdef NO_PLIaltsyncram_component.init_file = "boxing.rif"`elsealtsyncram_component.init_file = "boxing.hex"`endif,altsyncram_component.intended_device_family = "Cyclone",altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",altsyncram_component.lpm_type = "altsyncram",altsyncram_component.numwords_a = 1024,altsyncram_component.operation_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "UNREGISTERED",altsyncram_component.widthad_a = 10,altsyncram_component.width_a = 8,altsyncram_component.width_byteena_a = 1;endmodulemodule my_add (clock,dataa,datab,result);input clock;input [31:0] dataa;input [31:0] datab;output [31:0] result;wire [31:0] sub_wire0;wire [31:0] result = sub_wire0[31:0];lpm_add_sub lpm_add_sub_component (.dataa (dataa),.datab (datab),.clock (clock),.result (sub_wire0)// synopsys translate_off,.aclr (),.add_sub (),.cin (),.clken (),.cout (),.overflow ()// synopsys translate_on);defparamlpm_add_sub_component.lpm_direction = "ADD",lpm_add_sub_component.lpm_hint = "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",lpm_add_sub_component.lpm_pipeline = 1,lpm_add_sub_component.lpm_representation = "UNSIGNED",lpm_add_sub_component.lpm_type = "LPM_ADD_SUB",lpm_add_sub_component.lpm_width = 32;endmodulemodule add(clk,a,b,c);input clk;input[31:0] a;input[31:0] b;output[31:0] c;reg[31:0] c;reg[31:0] d;initialbegind<=b;endalways @(posedge clk)beginc<=a+d;d<=c;endendmodules translate_off`timescale 1 ps / 1 ps// synopsys translate_onmodule rom (address,clock,q);input [9:0] address;input clock;output [7:0] q;wire [7:0] sub_wire0;wire [7:0] q = sub_wire0[7:0];altsyncram altsyncram_component (.clock0 (clock),.address_a (address),.q_a (sub_wire0),.aclr0 (1'b0),.aclr1 (1'b0),.address_b (1'b1),.addressstall_a (1'b0),.addressstall_b (1'b0),.byteena_a (1'b1),.byteena_b (1'b1),.clock1 (1'b1),.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a ({8{1'b1}}),.data_b (1'b1),.eccstatus (),.q_b (),.rden_a (1'b1),.rden_b (1'b1),.wren_a (1'b0),.wren_b (1'b0));defparamaltsyncram_component.address_aclr_a = "NONE",`ifdef NO_PLIaltsyncram_component.init_file = "boxing.rif"`elsealtsyncram_component.init_file = "boxing.hex"`endif,altsyncram_component.intended_device_family = "Cyclone",altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",altsyncram_component.lpm_type = "altsyncram",altsyncram_component.numwords_a = 1024,altsyncram_component.operation_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "UNREGISTERED",altsyncram_component.widthad_a = 10,altsyncram_component.width_a = 8,altsyncram_component.width_byteena_a = 1;endmodule七、实验结果八、实验总结经过不断的实验,最终完成了该实验的基本要求,通过该信号发生器的设计,学习和掌握了DA转换,更加熟练地使用Verilog语言描述硬件电路和信号的输出,也更加熟练的掌握语言编程过程中的数据的控制,运用quartusII仿真和调用modelsim仿真。