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

下载本文档

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

文档简介

1、实验一 Quartus9.0快速入门一、实验目的通过实验让学生了解,熟悉和掌握Quartus9.0开发软件的使用方法及Verilog HDL的编程方法。学习简单时序电路的设计和硬件测试。二、实验原理在LED1LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100 则表示点亮LED1,LED2,流水一次后,输出地数据应该为11111000,而此时应该点亮LED1LED3三个发光二极管,就可以实现LED流水灯。为了观察方便,流水速率最好在2Hz左右,在MagicSOPC核芯板上有一数字信号源,可选择CLOCK3的2HZ时钟信号源源作为流水灯的时钟源。三、主要实验设备计算机和Magi

2、cSOPC实验箱。四、实验内容本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在MagicSOPC试验箱上实现LED1LED8发光二极管流水灯显示。实验步骤如下:1启动Quartus II建立一个空白工程,然后命名为led_water.qpf。2新建Verilog HDL 源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。程序清单:module ledwater(led,clk); /模块名ledwateroutput7:0 led; /定义LED输出口input clk; /定义时钟输出口reg8:0 l

3、ed_r; /定义输出寄存器assign led = led_r7:0; /寄存器输出always (posedge clk) /在时钟上升沿触发进程begin led_r <= led_r <<1; /是,则输出左移一位 if(led_r = 9'd0) /循环完毕吗? led_r <= 9'b111111111; /是,则重新赋初值endendmodule3从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。4新建图形设计文件命名为led_water.bdf并保存。在空白处双击鼠标左键,将symbol对话框中li

4、braries:project下的ledwater模块放在图形文件led_water.bdf中,加入输入、输出引脚,双击各引脚符号,进行引脚命名。将与ledwater模块led7.0连接的引脚命名为led7.0,与clk连接的引脚命名为clock3。完整的顶层模块原理图如图1-1所示。图1-1 流水灯顶层模块5选择目标芯片并对相应的引脚进行锁定,在这里所选择的器件为Altera公司的CycloneII系列的EP2C35F672C8芯片,引脚锁定方法如下表所列。将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)设置方法。信号引脚信号引脚信号引脚Led0R5Led3P6Led6R6Le

5、d1P9Led4P3Led7T3Led2P7Led5R8Clock3AE146将led_water.bdf设置为顶层实体。对该工程进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。7最后确保数字源(B4区域)的JP11的短路帽是处于ON位置,JP6中CLOCK3的短路帽处于2Hz位置:拿出Z-Blaster下载电缆,并将此电缆的两端分别接到到PC机的USB接口和实验箱主板模块上的JTAG下载口(提示:下载线有小箭头指示的为第1脚,与JTAG接口的J1脚相连),打开电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在MagicSOPC试验箱上看到流水灯。8更改

6、JP6排针CLOCK3处短路帽的位置。观察流水灯的变化。注意: 选择好器件后,先编译顶层文件,后分配引脚,是比较有利的,因为编译之后,Quartus II软件会自动将所有输入.输出引脚记录下来,不需要重新输入各个引脚的的信号名。分配引脚也可以通过编辑*qsf文件(该文件可以用记事本打开)实现。五、实验总结1文本输入的文件存盘时,文件名与模块名一致,即ledwater.v。2项目名称与顶层文件名一样,即led_water.qpf。3USB接口和实验箱主板模块上的JTAG下载口(提示:下载线有小箭头指示的为第1脚,与JTAG接口的J1脚相连)。4驱动的安装:在初次使用USB-Blaster编程器前

7、,需首先安装USB驱动程序。将USB-Blaster编程器一端插入PC机的USB口,这时会弹出一个USB驱动程序对话框,根据对话框的引导,选择用户自己搜索驱动程序,假定Quartus安装在D盘,则驱动程序的路径为D:altera90sp2quartusdiversusb-blaster。安装完毕后,打开Quartus,选择编程器,单击左上角的Hardware Setup按钮,在弹出的窗口中选择USB-Blaster项,双击之,此后就能使用。六、预习及思考1思考:如何实现左流水或其他花样流水呢?自己动手试试。2reg数据类型:Verilog HDL有两大类数据类型,线网类型和寄存器类型,形式如下

8、: regmsb:lsb reg1,reg2.regN;msb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的:如果没有定义范围,缺省值为1位寄存器。reg型数据的默认初始值是不定值X,它可以赋正值,也可以赋负值。当一个reg型数据是一个表达式的操作数时,它的值被当做是无符号值,即正值。(如一个4位寄存器被赋值-1,则在表达式中进行运算时,其值被认为是+15。)reg型只表示被定义的信号将用在always块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样,只有在时序逻辑中它对应的才是寄存器,而在组合逻

9、辑电路中它表示一个节点。3按照上述工程进行编译,会出现“Warning:Found pins functioning as undefined clocks and/or memory enables Info:Assuming node "clock" is an undefined clock”的警告。大概意思是说发现“clock”节点没有定义成时钟信号。消除之个警告的方法如下:(1)选择Assignments | Timing Seting 命令,在弹出的对话框中的Clock Setting 项选中Individual Clocks项,如图1-2所示。图1-2 Clo

10、ck设置页面1(2)在图1-2中按Clocks.进行设置,在弹出的对话框中按New.按钮添加节点,如图1-3所示,并按图1-3所示进行设置,图中Required fmax 为系统需求的最大时钟频率,在这里填50MHz就可以了。图1-3 Clock设置页面2(3)设置好之后一直按OK按钮保存设置,最后再进行编译,原先的Warning就会消除。以上的操作是将“clock3”加入时钟域。如时“clock3”不是一个时钟信号,可将设置属性改为“Not a clock”,也可以消除Warning。注意:如果编译后有些Warning 或Error不能消除或解决,可选中提示信息,按F1按键,打开帮助文档,Q

11、uartus II的帮助文档将列出Warning或error产生的原因及解决办法。实验二 一位全加器的设计一、实验目的通过此实验让用户逐渐料及、熟悉和掌握FPGA开发软件Quartu II的使用方法及原理图输入程序电路的方法。二、实验原理一位全加器的电路原理图如图2-1所示,真值表如表2-1所列。可根据全加器的电路原理图或真值表用Verilog HDL语言描述。图2-1 一位全加器原理图f_adder.bdf表2-1 一位全加器逻辑功能真值表ainbin cin sum cout 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0

12、 1 0 1 1 0 1 1 1 1 1 1三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1为本项工程设计建立文件夹假设本项设计的文件夹取名为adder,路径为F:adder。2建立原理图文件工程和仿真原理图编辑输入流程如下:(1)打开原理图编辑窗。打开Quartus,选菜单File | New,在弹出的New对话框中选择原理图文件编辑输入项Block Diagram/Schematic File(如图2-2所示),按OK按钮后打开原理图编辑窗口。图2-2 选择编辑文件类型(2)建立一个初始原理图。在编辑窗口中的任何一个位置上右击鼠标,将出现快捷菜单,选择其中的输入元件项Ins

13、ert | Symbol(如图2-3所示),或直接双击原理图编辑窗口,于是将弹出如图2-4所示的输入元件的对话框。在左下的Name栏键入输入引脚符号input。然后单击Symbol窗口的Ok按钮,即可将元件调入原理图编辑窗口中。(3)原理图文件存盘。选择菜单File | Save As,将此原理图文件存于刚才建立的目录F:adder中,将已设计好的原理图文件取名为h_adder.bdf(注意默认的后缀是.bdf,而且此原理图尚未完成,因为只加入了一个输入端口),并存盘在此文件夹内。(4)建立原理图文件为顶层设计的工程。然后将此文件h_adder.bdf设定为工程。(5)绘制半加器原理图。创建工

14、程后即进入工程管理窗,设工程名是h_adder。注意工程管理窗左上角的工程路径和工程名是:F:/adder/h_adder。双击左侧的工程名,再次进入原理图编辑窗。再双击原理图编辑窗任何位置。再次弹出如图2-4所示的输入元件的对话框。分别在Name栏键入(调入)元件名and2、xor和输出引脚output,并用单击拖动的方法,连接好的电路如图2-5所示。然后分别在input和output引脚的PIN NAME上双击使其变黑色,再用键盘分别输入各引脚名:a、b、co和so。最后,作为本项工程的顶层电路原理设计图如图2-5所示。 图2-3 选择打开元件输入窗 图2-4 在元件输入对话框输入引脚图2

15、-5 半加器原理图(6)仿真测试半加器。仿真波形如图2-6所示,显然与表2-2的真值表有对应关系,半加器设计成功。表2-2 半加器真值表absoco0000011010101101图2-6 半加器仿真波形3将设计项目设置成可调用的元件为了构成全加器的顶层设计,必须将以上设计的半加器h_adder.bdf设置成可调用的底层元件。方法如图2-7所示,在半加器原理图文件h_adder.bdf处于打开的情况下,选择菜单命令File | Create/Update | Create Symbol Files for Current File,即可将当前电路图变成一个元件符号存盘(元件文件名是h_adde

16、r.bsf),以便在高层次设计中调用。图2-7 将半加器封装成一个元件可以使用完全相同的方法将Verilog文本文件变成原理图中的一个元件(Symbol),实现Veriog文本设计与原理图的混合输入设计方法。转换中需要注意以下三点。(1)被转换的Verilog文本也要呈打开状态,而且必须在某工程打开状态下。(2)转换好的元件必须存在当前工程的路径文件夹中,文件后缀也默认.bdf。(3)按图2-7的方式进行转换,选择Create Symbol Files for Current File项。4设计全加器顶层文件为了建立全加器的顶层文件,必须另打开一个原理图编辑窗口,方法同前,即再次选择菜单Fil

17、e | New | Block Diagram/Schematic File。然后将其设置成新的工程。首先将打开的空的原理图存盘于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元件,调入原理

18、图编辑窗中。最后调出相关元件,按照图2-1进行连接。5将设计项目进行时序仿真工程完成后即可进行全程编译。此后的所有流程都与以上介绍的方法和流程相同。图2-10是全加器工程f_adder的仿真波形。图2-10 全加器工程f_adder的仿真波形6选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为altera公司cycloneII系列的EP2C35F672C8芯片,引脚锁定方法如图2-3所列。将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。注意,SW1-SW3的IO电平应设置为2.5V。表3.8 引脚锁定方法信号引脚信号引脚信号引脚信号引脚SW1L25SW3J21binP9s

19、umR6SW2L24ainR5cinP7coutT37最后把程序下载到FPGA器件中。拨动SW1-SW3,观察发光二极管LED1LED3、LED7、led8的状态。五、实验总结1总之,Verilog文本设计中可用例化语句调用原理图构成的元件,同样,原理图中也能调用文本程序构成的元件。2总结原理图输入方法的要点。六、预习及思考1思考:如何实现顶层文件的输入设计。2多种形式文件的输入方法和相互调用方法。实验三 4位加法计数器一、实验目的学习计数器的设计、仿真和硬件测试,进一步熟悉Verilog HDL的编程方法。二、实验原理图3-1是一个含计数使能、异步复位的4位加法计数器,图中间是4位锁存器;r

20、st是异步清零信号,低电平有效;clk是锁存信号;当ena为1时使能锁存器。图3-1 含计数使能、异步复位的4位加法计数器三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1启动Quartus II 建立一个空白工程,然后命名为cnt_4b.qpf。2新建 Verilog HDL源程序文件cnt4b.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。并将cnt4b.v封装生成cnt4b.bsf元件。程序清单 cnt4b.vmodule cnt4b(clk,rst,ena,dout,cout);/模块名cnt4binput clk,rs

21、t,ena;/输入信号output3:0dout;/计数输出output cout;/进位输出reg3:0cnt;/计数器assign cout = &cnt;/进位输出assign dout = cnt;/计数器输出always (posedge clk or negedge rst)beginif(rst = 1'b0)/异步清零,低电平有效cnt <= 4'h0;else if (ena = 1'b1)/同步使能计数,高电平有效cnt <= cnt + 1'b1;endendmodule3建立波形仿真文件并进行仿真验证。4数码管动态驱动

22、程序dec17s.v清单module decl7s(d,seg);/模块名decl7sinput3:0 d;/输入4位二进制码output7:0seg;/七段译码输出reg7:0 seg_r;/定义数码管输出寄存器assign seg = seg_r;/输出数码管译码结果always (d)begincase(d)/七段译码4'h0:seg_r = 8'hc0;/显示04'h1:seg_r = 8'hf9;/显示14'h2:seg_r = 8'ha4;/显示24'h3:seg_r = 8'hb0;/显示34'h4:seg_

23、r = 8'h99;/显示44'h5:seg_r = 8'h92;/显示54'h6:seg_r = 8'h82;/显示64'h7:seg_r = 8'hf8;/显示74'h8:seg_r = 8'h80;/显示84'h9:seg_r = 8'h90;/显示94'ha:seg_r = 8'h88;/显示a4'hb:seg_r = 8'h83;/显示b4'hc:seg_r = 8'hc6;/显示c4'hd:seg_r = 8'ha1;/显示d4&#

24、39;he:seg_r = 8'h86;/显示e4'hf:seg_r = 8'h8e;/显示fendcaseendendmodule将dec17s.v封装生成dec17s.bsf元件。5新建图形设计文件(顶层模块)命名为cnt_4b.bdf并保存。其模块原理图如图3-2所示。图3-2 4位加法计数器顶层模块6选择目标器件并对对应的引脚进行锁定,在这里所选择的器件为Atera公司Cyclone ll系列的EP2C35F672C8芯片,引脚锁定方法如表3-1所列。注意ena信号是拨档开关的输入,I/O Bank 工作电压是2. 5v,所在I/O电平要设置为2.5v。将未使用

25、的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。设置方法见3.1节。表3-1 引脚锁定方法信号引脚信号引脚信号引脚信号引脚seg0J8seg6L10dig4J3enaL25seg1M3seg7L9dig5K4Led1R5seg2K6dig0L6dig6L3Led2P9seg3J6dig1K5dig7M4Led8T7seg4U10dig2G3clock0N2seg5N9dig3G4sys_rstAC13注:ena 信号引脚输入应设为2.5v电平标准。7将cnt_4b.bdf 设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,知道编译成功为止。8确保数

26、字信号源(B4 区域)的JP11的短路帽是处于ON位置,JP7中CLOCK0的短路帽处于4Hz位置;最后把程序下载到FPGA 器件中。拨动拨动开关SW1,按SYS_RST按键,观察数码管和发光二极管的状态,是否与设计想符合。五、实验总结1文本文件生成原理图元件的方法及其元件调用。2多个源文件如何进行管理,放在同一个项目的文件夹下。六、预习及思考1带异步复位的4位加法计数器程序always (posedge clock or negedge rst_n)beginif(!rst_n)cnt<=4d0;elsecnt<= cnt +4d1;end带异步复位的4位加法计数器RTL图如图3

27、-3所示。2带同步复位的4位加法计数器程序always (posedge clock)beginif(!rst_n)cnt<=4d0;elsecnt<= cnt +4d1;end带同步复位的4位加法计数器RTL图如图3-4所示。 图3-3 带异步复位4位加法计数器RTL图 图3-4 带同步复位4位加法计数器RTL图实验四 数字时钟设计一、实验目的学习数字时钟的硬件设计。二、实验原理一个完整的时钟应由3部分组成:秒脉冲发生电路、计数显示部分和时钟调整部分。一个时钟的准确与否主要取决于秒时钟的精确度。为了保证计时准确对系统时钟50MHz进行了50000000分频,从而得到了1Hz的秒脉

28、冲,至于显示部分与LED数码管原理相同,而校对电路用户可以自由发挥,如定义3个键keystart、keymon、keyadd,分别用于控制时钟的计时开始、调整功能选择和加1处理,从而完成对现在时间的调整。本实验的校时电路在此仅仅完成了暂停、清零等基本功能。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1在QuartusII中建立了工程项目文件clock.qpf,并在该项 目下新建VerilogHDL源程序文件clock.v输入程序代码并保存。完整的VerilogHDL程序参考清单3.18.2FPGA的I/O管脚分配见表4-1。注意,时钟信号应选择clk,而不是clock。表4-

29、1 引脚锁定方法信号引脚信号引脚信号引脚信号引脚seg0J8dig1K5Led2P7key3P1seg1M3dig2G3Led3P6key4AD13seg2K6dig3G4Led4P3key5AF14seg3J6dig4J3Led5R8key6P25seg4U10dig5K4Led6R6key7P26seg5N9dig6L3Led7T7clock/clkB13seg6L10dig7M4key0C13clock0N2seg7L9Led0R5key1 D13foutF18dig0L6Led1P9key2N13对该工程文件进行全程编辑处理,若在编辑过程中发现错误,则找出并更改错误,直至编译成功为止。

30、程序清单:clock.vmodule clock(clk,key,dig,seg);/模块名clockinput clk;/输入时钟input1:0 key;/输入按键output7:0dig;/数码管选择输出引脚output7:0 seg;/数码管段输出引脚reg7:0 seg_r;/定义数码管输出寄存器reg7:0 dig_r;/定义数码管选择输出寄存器reg3:0 disp_dat;/定义显示数据寄存器reg24:0count;/定义计数寄存器reg23:0hour;/定义现在时刻寄存器reg sec,keyen;/定义标志位reg1:0dout1,dout2,dout3;/寄存器wir

31、e1:0key_done;/按键消抖输出assign dig = dig_r;/输出数码管选择assign seg = seg_r;/输出数码管译码结果/秒信号产生部分always (posedge clk) /定义clock上升沿触发begincount = count + 1'b1;if(count = 25'd25000000)/0.5S到了吗?begincount = 25'd0;/计数器清零sec = sec;/置位秒标志endend/按键消抖处理部分assign key_done = (dout1 | dout2 | dout3);/按键消抖输出always

32、 (posedge count17)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endalways (negedge key_done0)beginkeyen = keyen;/将琴键开关转换为乒乓开关end/数码管动态扫描显示部分always (posedge clk) /count17:15大约1ms改变一次begincase(count17:15)/选择扫描显示数据3'd0:disp_dat = hour3:0;/秒个位3'd1:disp_dat = hour7:4;/秒十位3'd2:disp_

33、dat = 4'ha;/显示"-"3'd3:disp_dat = hour11:8;/分个位3'd4:disp_dat = hour15:12;/分十位3'd5:disp_dat = 4'ha;/显示"-"3'd6:disp_dat = hour19:16;/时个位3'd7:disp_dat = hour23:20;/时十位endcasecase(count17:15)/选择数码管显示位3'd0:dig_r = 8'b11111110;/选择第一个数码管显示3'd1:dig_

34、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;/选择第八个数码管显示endca

35、seendalways (posedge clk)begincase(disp_dat)4'h0:seg_r = 8'hc0;/显示04'h1:seg_r = 8'hf9;/显示14'h2:seg_r = 8'ha4;/显示24'h3:seg_r = 8'hb0;/显示34'h4:seg_r = 8'h99;/显示44'h5:seg_r = 8'h92;/显示54'h6:seg_r = 8'h82;/显示64'h7:seg_r = 8'hf8;/显示74'h8

36、:seg_r = 8'h80;/显示84'h9:seg_r = 8'h90;/显示94'ha:seg_r = 8'hbf;/显示-default:seg_r = 8'hff;/不显示endcaseif(count17:15= 3'd2)&sec)seg_r = 8'hff;end/计时处理部分always (negedge sec or negedge key_done1)/计时处理beginif(!key_done1)/是清零键吗?beginhour = 24'h0;/是,则清零endelse if(!keyen

37、)beginhour3:0 = hour3:0 + 1'b1;/秒加1if(hour3:0 = 4'ha)beginhour3:0 = 4'h0;hour7:4 = hour7:4 + 1'b1;/秒的十位加一if(hour7:4 = 4'h6)beginhour7:4 = 4'h0;hour11:8 = hour11:8 + 1'b1;/分个位加一if(hour11:8 = 4'ha)beginhour11:8 = 4'h0;hour15:12 = hour15:12 + 1'b1;/分十位加一if(hour15

38、:12 = 4'h6)beginhour15:12 = 4'h0;hour19:16 = hour19:16 + 1'b1;/时个位加一if(hour19:16 = 4'ha)beginhour19:16 = 4'h0;hour23:20 = hour23:20 + 1'b1;/时十位加一endif(hour23:16 = 8'h24)hour23:16 = 8'h0;endendendendend endendmodule4把程序下载到FPGA器件中,观察数码管的显示状态。按下按键KEY1、KEY2观察数字钟的时间有什么变化。五

39、、实验总结1提高计时准确度的方法,关键是1秒时间的准确度。2时钟信号应选择clk(与图4-1中的SYS_CLK_50M相连),即锁定引脚为B13,而不是CLOCK0、CLOCK1、CLOCK2、CLOCK3。如图4-1所示。图4-1 系统时钟电路六、预习及思考自己动手把校时功能添加进去试试看。实验五 交通灯控制器一、实验目的学习交通灯控制器的设计,学习简单状态机的设计和硬件测试。二、实验原理本实验设计的交通灯控制器要求实现对A、B两个方向的红、绿、黄三种灯的控制,并能实现时间显示的倒计时。因此每个方向的灯可以用一个状态机实现,状态的跳转顺序为红灯-绿灯-黄灯-红灯(另一个的状态应为绿-黄-红-

40、绿),同时设计一个计时器,来记录每种灯的倒计时时间。最后将交通灯的状态信息输出,至数码管显示模块和交通灯显示模块。注意一个方向的红灯时间应和另一个方向的绿黄灯时间总和相等。三、主要实验设备计算机和MagicSOPC实验箱。四、实验内容1启动QuartusII建立一个空白工程,然后命名为traffic-top.qpf。2新建Verilog HDL源程序文件traffic.v、traffic_test、traffic_top.v,输入程序代码并保存,对各个HDL文件进行综合编译,若在编译过程中发现错误,则找出并更改错误,直至编译成功为止。程序清单:交通灯程序。(1)交通灯控制器,文件traffic

41、.v,本模块实现交通灯控制器的逻辑功能。module traffic(clock,rst_n,clken,lampa,lampb,acount,bcount);inputclock;/系统时钟50MHzinput rst_n;/同步复位信号,低电平有效inputclken;/时钟使能信号:1Hz。output2:0lampa;/控制A方向三盏灯的亮灭;其中lampa2:0分/别控制A方向的绿灯、黄灯、红灯(低电平灯亮)output2:0lampb;/控制B方向三盏灯的亮灭;其中lampb2:0分/别控制B方向的绿灯、黄灯、红灯(低电平灯亮)output7:0acount;/用于A方向灯的时间显

42、示,8位BCD码输出output7:0bcount;/用于B方向灯的时间显示,8位BCD码输出reg2:0 lampa,lampb;reg7:0 numa,numb;/时间计数器reg tempa,tempb;/防重进入标志reg2: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秒assign a

43、count=numa;assign bcount=numb;/控制A方向的三种灯always (posedge clock or negedge rst_n)beginif(!rst_n)beginStateA <= 3'h0; lampa <= 3'b011;tempa <= 1'b0;endelse if(clken)beginif(!tempa)begintempa <= 1'b1;/防重进入标志case(StateA)/控制亮灯的顺序0: begin numa <= agreen;lampa <= 3'b011

44、;StateA <= 1; end1: begin numa <= ayellow;lampa <= 3'b101;StateA <= 2; end2: begin numa <= ared;lampa <= 3'b110; StateA <= 0; enddefault:lampa <= 3'b110;endcaseendelsebegin /倒计时if(numa>1)if(numa3:0=0) begin numa3:0<=4'h9; numa7:4<=numa7:4-4'h1; en

45、delse numa3:0<=numa3:0-4'h1; if (numa=2) tempa<=1'b0;endendend/控制A方向的三种灯always (posedge clock or negedge rst_n)beginif(!rst_n)beginlampb<=3'b110;StateB<=3'h0;tempb<=1'b0; endelse if (clken)begin if(!tempb) begin tempb<=1'b1;/防重进入标志 case (StateB)/控制亮灯的顺序0: be

46、gin numb<=bred;lampb<=3'b110;StateB<=1; end1: begin numb<=bgreen;lampb<=3'b011;StateB<=2; end2: begin numb<=byellow;lampb<=3'b101;StateB<=0; enddefault:lampb<=3'b110; endcase end else begin/倒计时 if(numb>1) if(numb3:0=0) beginnumb3:0<=4'h9; numb7

47、:4<=numb7:4-4'h1;endelse numb3:0<=numb3:0-4'h1;if(numb=2)tempb <= 1'b0; end endendendmodule(2)显示控制程序,文件名为traffic.v,功能:显示交通灯时间,并产生1Hz时钟使能信号。module traffic_test(clock,clken,rst_n,acount,bcount,seg,dig);inputclock;/系统时钟(50MHz)inputrst_n;outputclken;input7:0acount;input7:0bcount;out

48、put7:0seg;/数码管段码输出output7:0dig;/数码管位码输出/I/O寄存器reg7:0seg;reg7:0dig;/内部寄存器reg25:0clk_cnt;reg16:0count;/时钟分频计数器reg1:0 cnt;/数码管扫描计数器reg3:0disp_dat;/数码管扫描显存wire div_clk;/分频时钟/产生1Hz时钟使能信号always (posedge clock)beginif(clken)clk_cnt <= 26'h0;elseclk_cnt <= clk_cnt + 26'h1;endassign clken = (cl

49、k_cnt >= 26'd49999999);/时钟分频进程,用于数码管扫描显示always (posedge clock)begincount <= count + 1'b1;endassign div_clk = &count;/数码管扫描显示部分always (posedge clock) beginif(div_clk)cnt <= cnt + 1'b1;endalways (posedge clock) beginif(div_clk)begincase(cnt)/选择扫描显示数据2'd0:disp_dat <= aco

50、unt7:4;/第一个数码管2'd1:disp_dat <= acount3:0;/第二个数码管2'd2:disp_dat <= bcount7:4;/第五个数码管2'd3:disp_dat <= bcount3:0;/第六个数码管endcasecase(cnt)/选择数码管显示位2'd0:dig <= 8'b01111111;/选择第一个数码管显示2'd1:dig <= 8'b10111111;/选择第二个数码管显示2'd2:dig <= 8'b11110111;/选择第五个数码管显示2'd3:dig <= 8'b11111011;/选择第六个数码管显示endcaseendendalways (disp_dat)begincase(disp_dat)/七段译码

温馨提示

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

评论

0/150

提交评论