FPGA基础试验之流水灯_第1页
FPGA基础试验之流水灯_第2页
FPGA基础试验之流水灯_第3页
FPGA基础试验之流水灯_第4页
FPGA基础试验之流水灯_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合实验报告第四组组长:韩欢02081535陈洁钰02081536侯旭涛02081514高耀02081510李欣昊02081508李昊02081506FPGA根底试验之流水灯一、实验目的通过此实验进一步了解、熟悉和掌握QuartusII开发软件的使用方法及Verilog语言的编程方法。学习简单时序电路的设计分析和硬件测试。二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的流水灯分析时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具QuartusII,学会使用QuartusII对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语言描述流水灯,代码如下:moduleliushuideng(sw1,sys_clk,rst_n,led);//接口定义inputsys_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@(posedgesys_clk)beginif(!rst_n)//复位,给存放器赋初值 begin flag<=3'b0; count<=26'b0; end//else//sys_clk上升沿到来 //begin if(count==26'd20) begin count<=26'd0;//count归零,便于下次重新开始计数 if(flag==3'b111)//当flag等于2’b10时,flag归零〔实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag== flag<=3'b000; else//否那么flag加一 flag<=flag+3'b001; end else count<=count+26'd1;//当count没计数到指定值是,count执行加一操作endalways@(posedgesys_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时,时序仿真结果如下图功能仿真结果为:功能仿真没有时延。2:当swl=0时,时序仿真结果为:功能仿真结果为:FPGA根底实验之正弦波形产生一、实验目的通过此实验进一步了解、熟悉和掌握QuartusII开发软件的使用方法及Verilog语言的编程方法。学习简单时序电路的设计分析和硬件测试。二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的正弦波形产生时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具QuartusII,学会使用QuartusII对Cyclone系列FPGA的程序开发、编译与调试;4.掌握Cyclone系列FPGA的程序加载,熟练掌握将.sof文件加载到实验板的FPGA中,实现正弦波形产生。三、实验原理DDS(DirectDigitalSynthesis)是一种应用直接数字合成技术来产生信号波形的方法。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、将qoutputport勾选去掉。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的值决定了显示波形的频率及相位。五、电路符号六、设计程序Rom1modulerom1( 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)); defparam altsyncram_component.address_aclr_a="NONE",`ifdefNO_PLI altsyncram_component.init_file="boxing.rif"`else altsyncram_component.init_file="boxing.hex"`endif, altsyncram_ended_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;endmodulemodulemy_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) //synopsystranslate_off , .aclr(), .add_sub(), .cin(), .clken(), .cout(), .overflow() //synopsystranslate_on ); defparam lpm_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;endmodulemoduleadd(clk,a,b,c);inputclk;input[31:0]a;input[31:0]b;output[31:0]c;reg[31:0]c;reg[31:0]d;initialbegind<=b;endalways@(posedgeclk)beginc<=a+d;d<=c;endendmodulestranslate_off`timescale1ps/1ps//synopsystranslate_onmodulerom( 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)); defparam altsyncram_component.address_aclr_a="NONE",`ifdefNO_PLI altsyncram_component.init_file="boxing.rif"`else altsyncram_component.init_file="boxing.hex"`endif, altsyncram_ended_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仿真。熟悉软件在编译过程中出现的错误和排除这些错误。实验三开关控制灯连续闪烁一、实验目的通过此实验进一步了解、熟悉和掌握QuartusII开发软件的使用方法及Verilog语言的编程方法。和DSP的使用方法。学习简单时序电路的设计分析和硬件测试。二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际程序分析,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具QuartusII,学会使用QuartusII对Cyclone系列FPGA的程序开发、编译与调试;熟悉DSP软件的操作环境,并学会连接DSP硬件进行调试实现相应功能。4.学会在加载sof文件的根底上运行DSP程序,使得两局部同时工作,FPGA局部提供信号,使得实现灯连续闪烁的结果。三、试验要求在中断闪灯〔DSP〕中主要实现外部的开关按钮S1的触发产生中断,DSP接收到相关中断信号后,跳转到闪灯子程序中,指示灯HL4开始闪烁。即FPGA局部提供中断信号,DSP局部实现由开关控制的灯闪烁。四、实验思路中断闪灯〔CPLD〕文件夹中为FPGA局部程序,中断闪灯〔DSP〕文件夹中为DSP局部程序。中断闪灯〔CPLD〕中主要是提供DSP工作中所需要的相关信号。在中断闪灯〔DSP〕中主要实现外部的开关按钮S1的触发产生中断,DSP接收到相关中断信号后,跳转到闪灯子程序中,指示灯HL4开始闪烁。利用FPGA产生相关信号DSP的工作时钟,DSP的复位信号,指定闪烁灯的初始状态置为高阻。由开关控制产生的中断信号,经由FPGA传输到DSP中,初始程序中利用了DSP的中断0。利用DSP程序产生对应的指示灯的输入电平,初始程序中利用了DSP的flag8。五、实验步骤1:FPGA局部建立工程〔2〕建立Verilog文件,编写相关程序〔3〕将verilog文件编译为可视化电路图文件〔4〕将可视化电路图文件添加输入输出组合成电路图文件〔5〕编译语法及验证原理图〔6〕根据需要分配管脚并进行编译管脚在FPGA上的分配FPGA上的连接管脚说明clk_inPIN_1640M2系统时钟40Mreset复位信号,直接拉高clk_outPIN_320MDSP工作时钟20M由clk_in分频得到d1PIN_126FLAG8连接到灯HL5,使其处于熄灭状态dout1PIN_130DSPRESETADSP-21065L复位信号sw3PIN_4KEYRESET连接到开关S1,用于发出中断脉冲Irt0PIN_10IRQ0DSP外部中断0,外部中断信号传给DSPled[0]PIN_127FLAG9连接到灯HL4,使其处于熄灭状态led[1]PIN_128FLAG10连接到灯HL3,使其处于熄灭状态led[2]PIN_129FLAG11连接到灯HL2,使其处于熄灭状态〔7〕下载编译后得到的文件.sof〔在线方式〕,.pof〔离线方式〕。一般考虑用在线方式。中断产生2:DSP局部准备工作:1切入烧写环境2选择芯片型号连接烧写器的情况下选择Emulator,否那么可以选择simulator根据所用的仿真器连接方式选择如果使用PCI接口选择HPPCI,使用USB接口选择HPUSB建立工程选择芯片型号将文件添加进sourcefile中创立ldf文件按顺序直接到结束开始编译,先单步运行几步,然后再点击run,因为在DSP中,某些状态存放器的赋值直接全运行的话,容易发生配置错误。故而在习惯情况下,我们在起始几步采用单步运行。主要参见程序说明局部:因d1连接到FLAG8上,故在DSP程序中只能控制HL5。利用开关S1控制灯HL5的闪灭,闪灭次数在DSP程序内部设定。六、实验设计〔1〕FPGA局部通过Verilog编程实现产生DSP所需信号1:moduletry001(reset,clk_in,clk_out,d1,dout1);inputclk_in,reset;outputclk_out,d1,dout1;reg[2:0]led;regclk_out;regd1;reg[12:0]cnt;reg[9:0]cnt1;regdout1;regclkout8k;initialbegind1=1'bz;cnt=0;cnt1=0;dout1=0;endalways@(posedgeclk_in)beginif(!reset)clk_out=0;elseclk_out=~clk_out;endalways@(posedgeclk_in)begincnt=cnt+1;if(cnt<=3999)beginclkout8k=0;endelsebeginclkout8k=1;endif(cnt==7999)begincnt=0;endendalways@(posedgeclkout8k)beginif(cnt1<=1000)cnt1=cnt1+1;elsecnt1=cnt1;if(cnt1<900)begindout1=0;endelsebegindout1=1;endendendmodule2:modulekaiguan(led,sw3,irt0);inputsw3;outputled,irt0;reg[2:0]led;regirt0;initialbeginirt0=1'b1;endalways@(sw3)begincase(sw3)1'b0:beginled=3'b111;irt0=1'b0;end 1'b1: begin led=3'b111; irt0=1'b1; enddefault:led=1'bx;endcaseendendmodule对应电路符号为:图1DSP工作条件图2通过控制拨码开关来控制相关灯闪灭〔2〕DSP局部程序#defineADDR10x20000.section/PMseg_rth; //中断向量表NOP;NOP;NOP;NOP;__lib_rst1:nop;JUMPmain;//初始复位中断,当系统硬件复位时跳到该中断指定的位置。 NOP;NOP;NOP;NOP;NOP;NOP;__lib_SOVFI:RTI;RTI;RTI;RTI;__lib_TMZHI:RTI;RTI;RTI;RTI;__lib_VIRPTI:RTI;RTI;RTI;RTI;__lib_IRQ2I:RTI;RTI;RTI;RTI;__lib_IRQ1I:RTI;RTI;RTI;RTI;//外部中断,该中断接RTL8019AS给出的中断信号,表示接收到数据,该中断地有效。NOP;NOP;NOP;NOP;__lib_IRQ0I:NOP;JUMPshandeng;NOP;NOP;//注意此处的不同!!当IRQ0被触发后,进入此中断跳转到闪灯程序__lib_SPR0I:RTI;RTI;RTI;RTI;//串行口接收中断,当收到一定量数时自动跳进中断__lib_SPR1I:RTI;RTI;RTI;RTI;//不需要发数的中断,该发数程序依托于IRQ0I中断。__lib_SPT0I:RTI;RTI;RTI;RTI;__lib_SPT1I:RTI;RTI;RTI;RTI;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;__lib_EP0I:RTI;RTI;RTI;RTI;__lib_EP1I:RTI;RTI;RTI;RTI;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;__lib_CB7I:RTI;RTI;RTI;RTI;__lib_CB5I:RTI;RTI;RTI;RTI;__lib_TMZLI:RTI;RTI;RTI;RTI;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;.SECTION/PMseg_pmco; //主程序.globalmain;main:////////////////////////////中断初始化/////////////////////////////////////////nop;nop;nop;nop; nop;nop;nop;nop; nop;nop;nop;nop;BITSETMODE1IRPTEN;//全局中断使能//BITCLRMODE2IRQ0E;//电平触发中断0BITSETMODE2IRQ0E;//下降沿触发中断0;nop;nop;nop;nop;//BITCLRMODE2IRQ1E;//电平触发中断1BITSETIMASKIRQ0I;//使能外部中断0//BITSETIMASKIRQ1I;//使能外部中断1kkk:nop;nop;nop;nop; nop;nop;nop;nop; nop;nop;nop;nop; jumpkkk(db);idle;main.END:shandeng: ustat1=dm(IOCTL); //置FLAG8为输出 bitSETustat1FLG8; dm(IOCTL)=ustat1; lcntr=20,doLEDuntillce; //中断后的闪灯次数 ustat1=dm(IOSTAT); //FLAG8置零 bitclrustat1FLG8; dm(IOSTAT)=ustat1;lcntr=65535,dowait1untillce; //延时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论