数字系统设计与VHDL实验指导书_第1页
数字系统设计与VHDL实验指导书_第2页
数字系统设计与VHDL实验指导书_第3页
数字系统设计与VHDL实验指导书_第4页
数字系统设计与VHDL实验指导书_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

实验一QuartusⅡ9.0快速入门一、实验目的通过实验让学生了解,熟悉和掌握QuartusⅡ9.0开发软件的使用方法及VerilogHDL的编程方法。学习简单时序电路的设计和硬件测试。二、实验原理在LED1~LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100则表示点亮LED1,LED2,流水一次后,输出地数据应该为11111000,而此时应该点亮LED1~LED3三个发光二极管,就可以实现LED流水灯。为了观察方便,流水速率最好在2Hz左右,在MagicSOPC核芯板上有一数字信号源,可选择CLOCK3的2HZ时钟信号源源作为流水灯的时钟源。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在MagicSOPC试验箱上实现LED1~LED8发光二极管流水灯显示。实验步骤如下:1.启动QuartusII建立一个空白工程,然后命名为led_water.qpf。2.新建VerilogHDL源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。程序清单:moduleledwater(led,clk); //模块名ledwateroutput[7:0]led;//定义LED输出口inputclk;//定义时钟输出口reg[8:0]led_r;//定义输出寄存器assignled=led_r[7:0];//寄存器输出always@(posedgeclk)//在时钟上升沿触发进程beginled_r<=led_r<<1;//是,则输出左移一位if(led_r==9'd0)//循环完毕吗?led_r<=9'b111111111;//是,则重新赋初值endendmodule3.从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。4.新建图形设计文件命名为led_water.bdf并保存。在空白处双击鼠标左键,将symbol对话框中libraries:project下的ledwater模块放在图形文件led_water.bdf中,加入输入、输出引脚,双击各引脚符号,进行引脚命名。将与ledwater模块led[7..0]连接的引脚命名为led[7..0],与clk连接的引脚命名为clock3。完整的顶层模块原理图如图1-1所示。图1-1流水灯顶层模块5.选择目标芯片并对相应的引脚进行锁定,在这里所选择的器件为Altera公司的CycloneII系列的EP2C35F672C8芯片,引脚锁定方法如下信号引脚信号引脚信号引脚Led[0]R5Led[3]P6Led[6]R6Led[1]P9Led[4]P3Led[7]T3Led[2]P7Led[5]R8Clock3AE146.将led_water.bdf设置为顶层实体。对该工程进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。7.最后确保数字源(B4区域)的JP11的短路帽是处于ON位置,JP6中CLOCK3的短路帽处于2Hz位置:拿出Z-Blaster下载电缆,并将此电缆的两端分别接到到PC机的USB接口和实验箱主板模块上的JTAG下载口(提示:下载线有小箭头指示的为第1脚,与JTAG接口的J1脚相连),打开电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在MagicSOPC试验箱上看到流水灯。8.更改JP6排针CLOCK3处短路帽的位置。观察流水灯的变化。注意:选择好器件后,先编译顶层文件,后分配引脚,是比较有利的,因为编译之后,QuartusII软件会自动将所有输入.输出引脚记录下来,不需要重新输入各个引脚的的信号名。分配引脚也可以通过编辑*qsf文件(该文件可以用记事本打开)实现。五、实验总结1.文本输入的文件存盘时,文件名与模块名一致,即ledwater.v。2.项目名称与顶层文件名一样,即led_water.qpf。3.USB接口和实验箱主板模块上的JTAG下载口(提示:下载线有小箭头指示的为第1脚,与JTAG接口的J1脚相连)。4.驱动的安装:在初次使用USB-Blaster编程器前,需首先安装USB驱动程序。将USB-Blaster编程器一端插入PC机的USB口,这时会弹出一个USB驱动程序对话框,根据对话框的引导,选择用户自己搜索驱动程序,假定QuartusⅡ安装在D盘,则驱动程序的路径为D:\altera\90sp2\quartus\divers\usb-blaster。安装完毕后,打开QuartusⅡ,选择编程器,单击左上角的HardwareSetup按钮,在弹出的窗口中选择USB-Blaster项,双击之,此后就能使用。六、预习及思考1.思考:如何实现左流水或其他花样流水呢?自己动手试试。2.reg数据类型:VerilogHDL有两大类数据类型,线网类型和寄存器类型,形式如下:reg[msb:lsb]reg1,reg2....regN;msb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的:如果没有定义范围,缺省值为1位寄存器。reg型数据的默认初始值是不定值X,它可以赋正值,也可以赋负值。当一个reg型数据是一个表达式的操作数时,它的值被当做是无符号值,即正值。(如一个4位寄存器被赋值-1,则在表达式中进行运算时,其值被认为是+15。)reg型只表示被定义的信号将用在always块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样,只有在时序逻辑中它对应的才是寄存器,而在组合逻辑电路中它表示一个节点。3.按照上述工程进行编译,会出现“Warning:Foundpinsfunctioningasundefinedclocksand/ormemoryenablesInfo:Assumingnode"clock"isanundefinedclock”的警告。大概意思是说发现“clock”节点没有定义成时钟信号。消除之个警告的方法如下:(1)选择Assignments|TimingSeting命令,在弹出的对话框中的ClockSetting项选中IndividualClocks项,如图1-2所示。图1-2Clock设置页面1(2)在图1-2中按Clocks....进行设置,在弹出的对话框中按New...按钮添加节点,如图1-3所示,并按图1-3所示进行设置,图中Requiredfmax为系统需求的最大时钟频率,在这里填50MHz就可以了。图1-3Clock设置页面2(3)设置好之后一直按OK按钮保存设置,最后再进行编译,原先的Warning就会消除。以上的操作是将“clock3”加入时钟域。如时“clock3”不是一个时钟信号,可将设置属性改为“Notaclock注意:如果编译后有些Warning或Error不能消除或解决,可选中提示信息,按F1按键,打开帮助文档,QuartusII的帮助文档将列出Warning或error产生的原因及解决办法。

实验二一位全加器的设计一、实验目的通过此实验让用户逐渐料及、熟悉和掌握FPGA开发软件QuartuII的使用方法及原理图输入程序电路的方法。二、实验原理一位全加器的电路原理图如图2-1所示,真值表如表2-1所列。可根据全加器的电路原理图或真值表用VerilogHDL语言描述。图2-1一位全加器原理图f_adder.bdf表2-1一位全加器逻辑功能真值表ainbincinsumcout0000010010010101100100110101010110111111三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1.为本项工程设计建立文件夹假设本项设计的文件夹取名为adder,路径为F:\adder。2.建立原理图文件工程和仿真原理图编辑输入流程如下:(1)打开原理图编辑窗。打开QuartusⅡ,选菜单File|New,在弹出的New对话框中选择原理图文件编辑输入项BlockDiagram/SchematicFile(如图2-2所示),按OK按钮后打开原理图编辑窗口。图2-2选择编辑文件类型(2)建立一个初始原理图。在编辑窗口中的任何一个位置上右击鼠标,将出现快捷菜单,选择其中的输入元件项Insert|Symbol(如图2-3所示),或直接双击原理图编辑窗口,于是将弹出如图2-4所示的输入元件的对话框。在左下的Name栏键入输入引脚符号input。然后单击Symbol窗口的Ok按钮,即可将元件调入原理图编辑窗口中。(3)原理图文件存盘。选择菜单File|SaveAs,将此原理图文件存于刚才建立的目录F:\adder中,将已设计好的原理图文件取名为h_adder.bdf(注意默认的后缀是.bdf,而且此原理图尚未完成,因为只加入了一个输入端口),并存盘在此文件夹内。(4)建立原理图文件为顶层设计的工程。然后将此文件h_adder.bdf设定为工程。(5)绘制半加器原理图。创建工程后即进入工程管理窗,设工程名是h_adder。注意工程管理窗左上角的工程路径和工程名是:F:/adder/h_adder。双击左侧的工程名,再次进入原理图编辑窗。再双击原理图编辑窗任何位置。再次弹出如图2-4所示的输入元件的对话框。分别在Name栏键入(调入)元件名and2、xor和输出引脚output,并用单击拖动的方法,连接好的电路如图2-5所示。然后分别在input和output引脚的PINNAME上双击使其变黑色,再用键盘分别输入各引脚名:a、b、co和so。最后,作为本项工程的顶层电路原理设计图如图2-5所示。图2-3选择打开元件输入窗图2-4在元件输入对话框输入引脚图2-5半加器原理图(6)仿真测试半加器。仿真波形如图2-6所示,显然与表2-2的真值表有对应关系,半加器设计成功。表2-2半加器真值表absoco0000011010101101图2-6半加器仿真波形3.将设计项目设置成可调用的元件为了构成全加器的顶层设计,必须将以上设计的半加器h_adder.bdf设置成可调用的底层元件。方法如图2-7所示,在半加器原理图文件h_adder.bdf处于打开的情况下,选择菜单命令File|Create/Update|CreateSymbolFilesforCurrentFile,即可将当前电路图变成一个元件符号存盘(元件文件名是h_adder.bsf),以便在高层次设计中调用。图2-7将半加器封装成一个元件可以使用完全相同的方法将Verilog文本文件变成原理图中的一个元件(Symbol),实现Veriog文本设计与原理图的混合输入设计方法。转换中需要注意以下三点。(1)被转换的Verilog文本也要呈打开状态,而且必须在某工程打开状态下。(2)转换好的元件必须存在当前工程的路径文件夹中,文件后缀也默认.bdf。(3)按图2-7的方式进行转换,选择CreateSymbolFilesforCurrentFile项。4.设计全加器顶层文件为了建立全加器的顶层文件,必须另打开一个原理图编辑窗口,方法同前,即再次选择菜单File|New|BlockDiagram/SchematicFile。然后将其设置成新的工程。首先将打开的空的原理图存盘于F:\adder,文件取名为f_adder.bdf,作为本项设计的顶层文件。然后按照前面介绍的方法将顶层文件f_adder.bdf设置为工程。图2-8是f_adder.bdf的工程设置窗口,其工程名和顶层文件名都是f_adder。图2-8全加器f_adder.bdf工程设置图2-9在f_adder工程下的原理图编辑窗中加入半加器建立工程后,在新打开的原理图编辑窗口双击鼠标,在弹出的窗口(图2-9)中选择Project下的先前存入的h_adder元件,调入原理图编辑窗中。最后调出相关元件,按照图2-1进行连接。5.将设计项目进行时序仿真工程完成后即可进行全程编译。此后的所有流程都与以上介绍的方法和流程相同。图2-10是全加器工程f_adder的仿真波形。图2-10全加器工程f_adder的仿真波形6.选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为altera公司cyclone=2\*ROMANII系列的EP2C35F672C8芯片,引脚锁定方法如图2-3所列。将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。注意,SW1-SW3的IO电平应设置为2.5V。表3.8引脚锁定方法信号引脚信号引脚信号引脚信号引脚SW1L25SW3J21binP9sumR6SW2L24ainR5cinP7coutT37.最后把程序下载到FPGA器件中。拨动SW1-SW3,观察发光二极管LED1~LED3、LED7、led8的状态。五、实验总结1.总之,Verilog文本设计中可用例化语句调用原理图构成的元件,同样,原理图中也能调用文本程序构成的元件。2.总结原理图输入方法的要点。六、预习及思考1.思考:如何实现顶层文件的输入设计。2.多种形式文件的输入方法和相互调用方法。实验三4位加法计数器一、实验目的学习计数器的设计、仿真和硬件测试,进一步熟悉VerilogHDL的编程方法。二、实验原理图3-1是一个含计数使能、异步复位的4位加法计数器,图中间是4位锁存器;rst是异步清零信号,低电平有效;clk是锁存信号;当ena为‘1’时使能锁存器。图3-1含计数使能、异步复位的4位加法计数器三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1.启动QuartusII建立一个空白工程,然后命名为cnt_4b.qpf。2.新建VerilogHDL源程序文件cnt4b.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。并将cnt4b.v封装生成cnt4b.bsf元件。程序清单cnt4b.vmodulecnt4b(clk,rst,ena,dout,cout); //模块名cnt4binputclk,rst,ena; //输入信号output[3:0]dout; //计数输出outputcout; //进位输出reg[3:0]cnt; //计数器assigncout=&cnt; //进位输出assigndout=cnt; //计数器输出always@(posedgeclkornegedgerst)begin if(rst==1'b0) //异步清零,低电平有效 cnt<=4'h0; elseif(ena==1'b1) //同步使能计数,高电平有效 cnt<=cnt+1'b1;endendmodule3.建立波形仿真文件并进行仿真验证。4.数码管动态驱动程序dec17s.v清单moduledecl7s(d,seg); //模块名decl7sinput[3:0]d; //输入4位二进制码output[7:0] seg; //七段译码输出reg[7:0]seg_r; //定义数码管输出寄存器assignseg=seg_r; //输出数码管译码结果 always@(d)begin case(d) //七段译码 4'h0:seg_r=8'hc0; //显示0 4'h1:seg_r=8'hf9; //显示1 4'h2:seg_r=8'ha4; //显示2 4'h3:seg_r=8'hb0; //显示3 4'h4:seg_r=8'h99; //显示4 4'h5:seg_r=8'h92; //显示5 4'h6:seg_r=8'h82; //显示6 4'h7:seg_r=8'hf8; //显示7 4'h8:seg_r=8'h80; //显示8 4'h9:seg_r=8'h90; //显示9 4'ha:seg_r=8'h88; //显示a 4'hb:seg_r=8'h83; //显示b 4'hc:seg_r=8'hc6; //显示c 4'hd:seg_r=8'ha1; //显示d 4'he:seg_r=8'h86; //显示e 4'hf:seg_r=8'h8e; //显示f endcaseendendmodule将dec17s.v封装生成dec17s.bsf元件。5.新建图形设计文件(顶层模块)命名为cnt_4b.bdf并保存。其模块原理图如图3-2所示。图3-24位加法计数器顶层模块6.选择目标器件并对对应的引脚进行锁定,在这里所选择的器件为Atera公司Cyclonell系列的EP2C35F672C8芯片,引脚锁定方法如表3表3-1引脚锁定方法信号引脚信号引脚信号引脚信号引脚seg[0]J8seg[6]L10dig[4]J3enaL25seg[1]M3seg[7]L9dig[5]K4Led1R5seg[2]K6dig[0]L6dig[6]L3Led2P9seg[3]J6dig[1]K5dig[7]M4Led8T7seg[4]U10dig[2]G3clock0N2seg[5]N9dig[3]G4sys_rstAC13注:ena信号引脚输入应设为2.5v电平标准。7.将cnt_4b.bdf设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,知道编译成功为止。8.确保数字信号源(B4区域)的JP11的短路帽是处于ON位置,JP7中CLOCK0的短路帽处于4Hz位置;最后把程序下载到FPGA器件中。拨动拨动开关SW1,按SYS_RST按键,观察数码管和发光二极管的状态,是否与设计想符合。五、实验总结1.文本文件生成原理图元件的方法及其元件调用。2.多个源文件如何进行管理,放在同一个项目的文件夹下。六、预习及思考1.带异步复位的4位加法计数器程序always@(posedgeclockornegedgerst_n)begin if(!rst_n) cnt<=4’ else cnt<=cnt+4’end带异步复位的4位加法计数器RTL图如图3-3所示。2.带同步复位的4位加法计数器程序always@(posedgeclock)begin if(!rst_n) cnt<=4’ else cnt<=cnt+4’end带同步复位的4位加法计数器RTL图如图3-4所示。图3-3带异步复位4位加法计数器RTL图图3-4带同步复位4位加法计数器RTL图实验四数字时钟设计一、实验目的学习数字时钟的硬件设计。二、实验原理一个完整的时钟应由3部分组成:秒脉冲发生电路、计数显示部分和时钟调整部分。一个时钟的准确与否主要取决于秒时钟的精确度。为了保证计时准确对系统时钟50MHz进行了50000000分频,从而得到了1Hz的秒脉冲,至于显示部分与LED数码管原理相同,而校对电路用户可以自由发挥,如定义3个键keystart、keymon、keyadd,分别用于控制时钟的计时开始、调整功能选择和加1处理,从而完成对现在时间的调整。本实验的校时电路在此仅仅完成了暂停、清零等基本功能。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1.在QuartusII中建立了工程项目文件clock.qpf,并在该项目下新建VerilogHDL源程序文件clock..v输入程序代码并保存。完整的VerilogHDL程序参考清单3.18.2.FPGA的I/O管脚分配见表4-1。注意,时钟信号应选择clk,而不是clock。表4-1引脚锁定方法信号引脚信号引脚信号引脚信号引脚seg[0]J8dig[1]K5Led[2]P7key[3]P1seg[1]M3dig[2]G3Led[3]P6key[4]AD13seg[2]K6dig[3]G4Led[4]P3key[5]AF14seg[3]J6dig[4]J3Led[5]R8key[6]P25seg[4]U10dig[5]K4Led[6]R6key[7]P26seg[5]N9dig[6]L3Led[7]T7clock/clkB13seg[6]L10dig[7]M4key[0]C13clock0N2seg[7]L9Led[0]R5key[1]D13foutF18dig[0]L6Led[1]P9key[2]N13.对该工程文件进行全程编辑处理,若在编辑过程中发现错误,则找出并更改错误,直至编译成功为止。程序清单:clock..vmoduleclock(clk,key,dig,seg); //模块名clockinputclk; //输入时钟input[1:0]key; //输入按键output[7:0] dig; //数码管选择输出引脚output[7:0]seg; //数码管段输出引脚reg[7:0]seg_r; //定义数码管输出寄存器reg[7:0]dig_r; //定义数码管选择输出寄存器reg[3:0]disp_dat; //定义显示数据寄存器reg[24:0]count; //定义计数寄存器reg[23:0]hour; //定义现在时刻寄存器regsec,keyen; //定义标志位reg[1:0]dout1,dout2,dout3; //寄存器wire[1:0]key_done; //按键消抖输出assigndig=dig_r; //输出数码管选择assignseg=seg_r; //输出数码管译码结果 //秒信号产生部分always@(posedgeclk) //定义clock上升沿触发begin count=count+1'b1; if(count==25'd25000000) //0.5S到了吗? begin count=25'd0; //计数器清零 sec=~sec; //置位秒标志 endend//按键消抖处理部分assignkey_done=(dout1|dout2|dout3); //按键消抖输出always@(posedgecount[17])begin dout1<=key; dout2<=dout1; dout3<=dout2; endalways@(negedgekey_done[0])begin keyen=~keyen; //将琴键开关转换为乒乓开关end//数码管动态扫描显示部分always@(posedgeclk) //count[17:15]大约1ms改变一次begin case(count[17:15]) //选择扫描显示数据 3'd0:disp_dat=hour[3:0]; //秒个位 3'd1:disp_dat=hour[7:4]; //秒十位 3'd2:disp_dat=4'ha; //显示"-" 3'd3:disp_dat=hour[11:8]; //分个位 3'd4:disp_dat=hour[15:12]; //分十位 3'd5:disp_dat=4'ha; //显示"-" 3'd6:disp_dat=hour[19:16]; //时个位 3'd7:disp_dat=hour[23:20]; //时十位 endcase case(count[17:15]) //选择数码管显示位 3'd0:dig_r=8'b11111110; //选择第一个数码管显示 3'd1:dig_r=8'b11111101; //选择第二个数码管显示 3'd2:dig_r=8'b11111011; //选择第三个数码管显示 3'd3:dig_r=8'b11110111; //选择第四个数码管显示 3'd4:dig_r=8'b11101111; //选择第五个数码管显示 3'd5:dig_r=8'b11011111; //选择第六个数码管显示 3'd6:dig_r=8'b10111111; //选择第七个数码管显示 3'd7:dig_r=8'b01111111; //选择第八个数码管显示 endcase endalways@(posedgeclk)begin case(disp_dat) 4'h0:seg_r=8'hc0; //显示0 4'h1:seg_r=8'hf9; //显示1 4'h2:seg_r=8'ha4; //显示2 4'h3:seg_r=8'hb0; //显示3 4'h4:seg_r=8'h99; //显示4 4'h5:seg_r=8'h92; //显示5 4'h6:seg_r=8'h82; //显示6 4'h7:seg_r=8'hf8; //显示7 4'h8:seg_r=8'h80; //显示8 4'h9:seg_r=8'h90; //显示9 4'ha:seg_r=8'hbf; //显示- default:seg_r=8'hff; //不显示 endcase if((count[17:15]==3'd2)&sec) seg_r=8'hff;end//计时处理部分always@(negedgesecornegedgekey_done[1])//计时处理begin if(!key_done[1]) //是清零键吗? begin hour=24'h0; //是,则清零 end elseif(!keyen) begin hour[3:0]=hour[3:0]+1'b1; //秒加1 if(hour[3:0]==4'ha) begin hour[3:0]=4'h0; hour[7:4]=hour[7:4]+1'b1; //秒的十位加一 if(hour[7:4]==4'h6) begin hour[7:4]=4'h0; hour[11:8]=hour[11:8]+1'b1;//分个位加一 if(hour[11:8]==4'ha) begin hour[11:8]=4'h0; hour[15:12]=hour[15:12]+1'b1;//分十位加一 if(hour[15:12]==4'h6) begin hour[15:12]=4'h0; hour[19:16]=hour[19:16]+1'b1;//时个位加一 if(hour[19:16]==4'ha) begin hour[19:16]=4'h0; hour[23:20]=hour[23:20]+1'b1;//时十位加一 end if(hour[23:16]==8'h24) hour[23:16]=8'h0; end end end end endendendmodule4.把程序下载到FPGA器件中,观察数码管的显示状态。按下按键KEY1、KEY2观察数字钟的时间有什么变化。五、实验总结1.提高计时准确度的方法,关键是1秒时间的准确度。2.时钟信号应选择clk(与图4-1中的SYS_CLK_50M相连),即锁定引脚为B13,而不是CLOCK0、CLOCK1、CLOCK2、CLOCK3。如图4-1所示。图4-1系统时钟电路六、预习及思考自己动手把校时功能添加进去试试看。实验五交通灯控制器一、实验目的学习交通灯控制器的设计,学习简单状态机的设计和硬件测试。二、实验原理本实验设计的交通灯控制器要求实现对A、B两个方向的红、绿、黄三种灯的控制,并能实现时间显示的倒计时。因此每个方向的灯可以用一个状态机实现,状态的跳转顺序为红灯-绿灯-黄灯-红灯(另一个的状态应为绿-黄-红-绿),同时设计一个计时器,来记录每种灯的倒计时时间。最后将交通灯的状态信息输出,至数码管显示模块和交通灯显示模块。注意一个方向的红灯时间应和另一个方向的绿黄灯时间总和相等。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1.启动QuartusII建立一个空白工程,然后命名为traffic-top.qpf。2.新建VerilogHDL源程序文件traffic.v、traffic_test、traffic_top.v,输入程序代码并保存,对各个HDL文件进行综合编译,若在编译过程中发现错误,则找出并更改错误,直至编译成功为止。程序清单:交通灯程序。(1)交通灯控制器,文件traffic.v,本模块实现交通灯控制器的逻辑功能。moduletraffic(clock,rst_n,clken,lampa,lampb,acount,bcount);input clock; //系统时钟50MHzinput rst_n; //同步复位信号,低电平有效input clken; //时钟使能信号:1Hz。output [2:0] lampa; //控制A方向三盏灯的亮灭;其中lampa[2:0]分 //别控制A方向的绿灯、黄灯、红灯(低电平灯亮)output [2:0] lampb; //控制B方向三盏灯的亮灭;其中lampb[2:0]分 //别控制B方向的绿灯、黄灯、红灯(低电平灯亮)output [7:0] acount; //用于A方向灯的时间显示,8位BCD码输出output [7:0] bcount; //用于B方向灯的时间显示,8位BCD码输出reg[2:0]lampa,lampb; reg[7:0]numa,numb; //时间计数器regtempa,tempb; //防重进入标志reg[2:0]StateA,StateB; //A、B方向灯控制状态机的状态//设置各种灯的计数器的预置数parameter ared =8'h30, //30秒 ayellow =8'h5, //5秒 agreen =8'h15, //15秒 bred =8'h20, //20秒 byellow =8'h5, //5秒 bgreen =8'h25; //25秒 assignacount=numa; assignbcount=numb;//控制A方向的三种灯always@(posedgeclockornegedgerst_n) begin if(!rst_n) begin StateA<=3'h0; lampa<=3'b011; tempa<=1'b0; end elseif(clken) begin if(!tempa) begin tempa<=1'b1; //防重进入标志 case(StateA) //控制亮灯的顺序 0:beginnuma<=agreen; lampa<=3'b011; StateA<=1;end 1:beginnuma<=ayellow; lampa<=3'b101; StateA<=2;end 2:beginnuma<=ared; lampa<=3'b110; StateA<=0;end default: lampa<=3'b110; endcase end else begin //倒计时 if(numa>1) if(numa[3:0]==0) begin numa[3:0]<=4'h9; numa[7:4]<=numa[7:4]-4'h1; end else numa[3:0]<=numa[3:0]-4'h1; if(numa==2) tempa<=1'b0; end endend//控制A方向的三种灯always@(posedgeclockornegedgerst_n) begin if(!rst_n) begin lampb<=3'b110; StateB<=3'h0; tempb<=1'b0; end elseif(clken) begin if(!tempb) begin tempb<=1'b1; //防重进入标志 case(StateB) //控制亮灯的顺序 0:beginnumb<=bred; lampb<=3'b110; StateB<=1;end 1:beginnumb<=bgreen; lampb<=3'b011; StateB<=2;end 2:beginnumb<=byellow; lampb<=3'b101; StateB<=0;end default: lampb<=3'b110; endcase end else begin //倒计时 if(numb>1) if(numb[3:0]==0) begin numb[3:0]<=4'h9; numb[7:4]<=numb[7:4]-4'h1; end else numb[3:0]<=numb[3:0]-4'h1; if(numb==2) tempb<=1'b0; end endendendmodule(2)显示控制程序,文件名为traffic.v,功能:显示交通灯时间,并产生1Hz时钟使能信号。moduletraffic_test(clock,clken,rst_n,acount,bcount,seg,dig);input clock; //系统时钟(50MHz)input rst_n;output clken;input [7:0] acount;input [7:0] bcount;output [7:0] seg; //数码管段码输出output [7:0] dig; //数码管位码输出//I/O寄存器reg[7:0]seg; reg[7:0]dig; //内部寄存器reg[25:0]clk_cnt;reg[16:0]count; //时钟分频计数器reg[1:0]cnt; //数码管扫描计数器 reg[3:0]disp_dat; //数码管扫描显存 wirediv_clk; //分频时钟//产生1Hz时钟使能信号always@(posedgeclock)begin if(clken) clk_cnt<=26'h0; else clk_cnt<=clk_cnt+26'h1;endassignclken=(clk_cnt>=26'd49999999);//时钟分频进程,用于数码管扫描显示always@(posedgeclock)begin count<=count+1'b1;endassigndiv_clk=&count;//数码管扫描显示部分always@(posedgeclock) begin if(div_clk) cnt<=cnt+1'b1;endalways@(posedgeclock) begin if(div_clk) begin case(cnt) //选择扫描显示数据 2'd0:disp_dat<=acount[7:4]; //第一个数码管 2'd1:disp_dat<=acount[3:0]; //第二个数码管 2'd2:disp_dat<=bcount[7:4]; //第五个数码管 2'd3:disp_dat<=bcount[3:0]; //第六个数码管 endcase case(cnt) //选择数码管显示位 2'd0:dig<=8'b01111111; //选择第一个数码管显示 2'd1:dig<=8'b10111111; //选择第二个数码管显示 2'd2:dig<=8'b11110111; //选择第五个数码管显示 2'd3:dig<=8'b11111011; //选择第六个数码管显示 endcase endendalways@(disp_dat)begin case(disp_dat) //七段译码 4'h0:seg=8'hc0; //显示0 4'h1:seg=8'hf9; //显示1 4'h2:seg=8'ha4; //显示2 4'h3:seg=8'hb0; //显示3 4'h4:seg=8'h99; //显示4 4'h5:seg=8'h92; //显示5 4'h6:seg=8'h82; //显示6 4'h7:seg=8'hf8; //显示7 4'h8:seg=8'h80; //显示8 4'h9:seg=8'h90; //显示9 4'ha:seg=8'h88; //显示a 4'hb:seg=8'h83; //显示b 4'hc:seg=8'hc6; //显示c 4'hd:seg=8'ha1; //显示d 4'he:seg=8'h86; //显示e 4'hf:seg=8'h8e; //显示f endcaseendendmodule(3)顶层模块,文件名为traffic-top.v。moduletraffic_top(clock,rst_n,seg,dig,lampa,lampb);input clock; //系统时钟(48MHz)input rst_n; //复位信号,低电平有效output [2:0] lampa; //A方向红绿灯output [2:0] lampb; //B文向红绿灯output [7:0] seg; //数码管段码输出output [7:0] dig; //数码管位码输出//内部线网wire clken;wire [7:0] acount;wire [7:0] bcount;//交通灯控制模块traffictraffic( .clock(clock), .rst_n(rst_n), .clken(clken), .lampa(lampa), .lampb(lampb), .acount(acount), .bcount(bcount) );//显示模块traffic_testtraffic_test( .clock(clock), .clken(clken), .rst_n(rst_n), .acount(acount), .bcount(bcount), .seg(seg), .dig(dig) );endmodule3.选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司CycloneII系列的EP2C35F672C8芯片,引脚锁定方法如表表5-1引脚锁定方法信号引脚信号引脚信号引脚信号引脚seg[0]J8seg[6]L10dig[4]J3lampa[2]U6seg[1]M3seg[7]L9dig[5]K4lampb[0]T10seg[2]K6dig[0]L6dig[6]L3lampb[1]T9seg[3]J6dig[1]K5dig[7]M4lampb[2]V7seg[4]U10dig[2]G3lampa[0]U9clockB13seg[5]N9dig[3]G4lampa[1]V6rst_nAC134.设置traffic_top.v为顶层文件,对该工程文件进行全程编译处理,若在编译处理过程中发现错误,则找出更正错误,直至编译成功为止。5.把程序下载到FPGA器件中。按一下复位键SYS_RST,然后观察交通灯及数码管的显示状态。五、实验总结1.状态机的数据定义方法。2.如何画状态机。六、预习及思考1.思考:画出顶层文件的方框图。2.若顶层文件用原理图来设计,如何进行。实验六状态机的设计一、实验目的熟悉串行模数转换芯片TCL549的使用方法,掌握利用有限状态机实现一般时序逻辑分析的方法,了解一般状态机的设计与应用。二、实验原理TLC549是一个八位的串行模数转换器,AD转换时间最大17微秒,I/O时钟可达1.1MHz。如图6-1所示为TLC549的访问时序,从图中可以看由当CS/拉低时,ADC前一次的转换数据(A)的最高位A7立即出现在数据线DATEOUT上,之后的数据在时钟I/OCLOCK的下降沿改变,可在I/OCLOCK的上升沿读取数据。读完8位数据后,ADC开始转换这一次采样的信号(B),以便下一次读取。转换时片选信号CS/要置高电平。设计操作时序是要注意Tsu(CS)、Tconv及I/OCLOCK的频率几个参数。Tsu(CS)为CS/拉低到I/OCLOCK第一个时钟到来时间,至少要1.4微秒;Tconv为ADC的转换时钟,不超过17微秒,I/OCLOCK不能超过1.1MHz。其他的参数请参数数据手册。图6-1TLC访问时序由于ADC是8位的,所以采样的电压值为:V=(D/256)×Vref其中V为采样的电压值,D为ADC转换后读取的8位二进制数,Vref为参考电压值,这里是2.5V。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1.启动QuartusⅡ建立一个空白工程,然后命名为tlc549adc.qpf。2.新建VerilogHDL源程序文件adc.v,写出程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,知道编译成功为止。程序清单:TCL549ADC采样控制程序。moduleadc(clock,reset,enable,sdat_in,adc_clk,cs_n,data_ready,data_out);//I/O口声明input clock; //系统时钟input reset; //复位,高电平有效input enable; //转换使能input sdat_in; //TLC549串行数据输入output adc_clk; //TLC549I/O时钟output cs_n; //TLC549片选控制output data_ready; //指示有新的数据输出output[7:0] data_out; //AD转换数据输出//I/O寄存器reg adc_clk_r;reg cs_n_r;reg data_ready_r;reg[7:0] data_out_r; //AD转换数据输出reg sdat_in_r; //数据输出锁存//内部寄存器reg[7:0]q; //移位寄存器,用于接收或发送数据reg[2:0]adc_state; //状态机ADCreg[2:0]adc_next_state;reg[5:0]bit_count; //移位计数器reg bit_count_rst; //ADC时钟计数器全能控制reg div_clk;reg[CLK_DIV_BITS-1:0]clk_count;//时钟分频计数器regbuf1,buf2;//内部信号wireready_done; //cs_n拉低(大于1.4us)后的标志wirerec_done; //数据读取完毕的标志wireconv_done; //数据转换完毕的标志//计时器参数//以下参数值按50MHz时钟计算parameterCLK_DIV_VALUE=31;//ADC时钟计数器(大于404nS)计数值parameterCLK_DIV_BITS=5; //ADC时钟计数器位宽//状态机M1状态参数表parameteridle =3'b000, adc_ready =3'b001, adc_receive =3'b011, adc_conversion=3'b010, adc_data_load=3'b110;//I/O寄存器输出assignadc_clk=adc_clk_r;assigncs_n=cs_n_r;assigndata_out=data_out_r;assigndata_ready=data_ready_r;//同步输入数据信号always@(posedgeclock)beginsdat_in_r<=sdat_in;end//**********************************************************//时钟分频计数器always@(posedgeclock)begin if(reset==1'b1) clk_count<=5'd0; else begin if(clk_count<CLK_DIV_VALUE) begin clk_count<=clk_count+1'b1; div_clk<=1'b0; end else begin clk_count<=5'd0; div_clk<=1'b1; end endend//状态机ADCalways@(posedgeclock)beginif(reset==1'b1) adc_state<=idle;else adc_state<=adc_next_state;end//ADC状态机转换逻辑always@(adc_stateorready_doneorrec_doneorconv_doneorenable)begin cs_n_r<=1'b0; bit_count_rst<=1'b0; data_ready_r<=1'b0; case(adc_state) idle: //初始状态 begin cs_n_r<=1'b1; bit_c

温馨提示

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

评论

0/150

提交评论