Verilog编程 怎么实现七段共阴数码管高电平点亮由全亮到全灭? 全灭的语句是什么啊? 4'

孔夫子旧书网该图书“V18正版 全国高职高专院校规划教材精品与示范系列:FPGA/CPLD应用技术(Verilog语言版)
”已经找不到了, 还有其他店铺销售此图书。Copyright(C)
孔夫子旧书网
京ICP证041501号
海淀分局备案编号您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
七段式数码管简介及其Verilog HDL 驱动编写.docx 8页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
你可能关注的文档:
··········
··········
七段式数码管就是使用七段点亮的线段来拼成常见的数字和某些字母。再加上右下角的小数点。实际上一个显示单元包含了8根控制信号线。图1
七段数码管的显示单元如上图所示,a,b,c,d,e,f,g,h对应8根控制信号线。一般数码管有8个如图1所示的显示单元,称为七段八位数码管。由此引入段码和位码的概念。段码(seg):在本文中段码对应单独的显示单元。或者说段码代表显示单元上显示的具体数值或符号。位码(sel):在本文中位码对应8个显示单元。或者说位码代表相应位置上的显示单元被选通。为什么数码管需要位码呢?因为数码管利用视觉暂留效应让人们觉得每一位上的数字一直保持着发亮。其实各个位上的显示单元是按照顺序交替亮灭的,只是频率比较高,看起来就像是一直亮着的。而位码就是用来按位循环扫描的。段码与显示内容又是怎样对应的呢?这就要说到显示原理了。每一个显示单元中可以被控制亮灭的线段其实是LED发光二极管。他们以共阴极或者共阳极的方式接入。如下图2.1和2.2。+5vGnd图2.2
共阳极图2.1
共阴极如果想显示数字0,图1中的线段a,b,c,d,e,f应当点亮,g,h应该熄灭。共阴极接入方式的话,输入端接高电平LED才会亮。abcdefgh对应的电平状态是 。编码时顺序反过来a对应最低位,h对应最高位。所以在共阴极接入方式下,显示数字0对应的段码是,即0x3f;在共阳极接入方式下,显示数字0对应的段码是,即0xc0;图2.1和2.2中的a,b,c,d,e,f,g,h称为段选线。另一边的公共端称为位选线。以此类推,以共阳极接入方式为例,段码与显示的数字对应关系如下表显示数字高电平信号低电平信号二进制编码段码(16进制)0ghabcdefbcabgedabgcdfbgcafgcdafgcdeabcabcdefgabcdfg显示字母A,B,C,D,E,F分别对应段码:8’h88, 8’h83, 8’hC6, 8’hA1, 8’h86, 8’h8E;特别的,显示单元全灭对应的段码为:8’b即是 8’hFF;至此已经可以编写驱动程序的一个模块了,就是把显示数字转成段码的模块。先来有一个总体的架构,暂时不对小数点位做处理:Seg[7:0]clkSeg7x8_driveSel[2:0]Turn_off[7:0]Data[31:0]rst段码seg和位码sel信号由FPGA引脚引出接入数码管,位码只有三位是因为数码管电路中有三八译码器,这样可以节省FPGA的引脚资源。Turn_off是一个特殊控制信号,它使得这个驱动程序功能更丰富。比如DATA以BCD码形式带来的数据是 。出于某种原因我们不想让00显示出来。就可以通过turn_off把数码管的最左边两位“关掉”。Turn_off到底是还是取决于个人偏好了。还要有一个时钟分频模块,因为SEL的扫描频率没必要过高,只要每秒25次循环就可以达到视觉暂留的要求。设计的总体思路是一个分频模块把时钟频率降低,此功能独立作为一个模块。然后根据低频来产生循环扫描的位码,此功能独立作为一个模块。然后根据位码产生段码,位码指到哪一位就判断该位是不是被turn_off关闭,如果没关闭就把BCD码对应位译成段码输出,此功能独立作为一个模块。(SEL是0的时候对应最左边的显示单元,是7的时候对应最右边的显示单元)下面用Verilog HDL进行电路描述。首先是divide模块。Clk是50MHZ。即时钟周期是20ns。数码管的位码sel扫描8次算一个循环,每秒至少要25个循环才能形成视觉暂留效应。25x8=200(可以理解为数码管的某一个显示单元亮了25次的时候,位码已经变换过200次了)也就是说位码要在1秒钟内变换200次。秒=5ms=5000us=5x106ns经上面的分析,clk_divide要大于等于5x106ns。但是也不能太大,因为扫描频率过快会使数码管亮度不足甚至根本看不出发亮。取clk_divide=5x106ns=50x105ns=2.5x20x105ns=2.5x105clk。也就是说系统时钟clk要被降低25万倍。分频的思路是用一个计数器,clk走过25万个时钟周期的时候clk_divide走过一个时钟周期。十进制数二进制数观察上表的中二进制数的规律,可以发现。Binary[0]每隔十进制数值
正在加载中,请稍后...基于小脚丫FPGA开发板和四位数码管 的数字时钟设计
1、设计要求基于小脚丫FPGA开发板和四位数码管实现的设计,要求:1)采用FPGA+按键+四位数码管实现数字时钟功能;2)时间显示格式:XX:XX:XX (时:分:秒),采用24小时制;3)四位时分秒,可以通过按键控制选择显示时分界面还是分秒界面。4)通过按键设定初始时间。5)设置在整点12点时,通过蜂鸣器响示意整点报时。蜂鸣器响维持大概5S;2、硬件连接FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。本设计用到五个个按键K1~K5,硬件设计如图1所示,五个按键分别连接到FPGA的B8、C8、A10、A11和A12引脚。图1. 按键硬件设计本设计用到一个蜂鸣器来示意整点报时,硬件设计如图1所示,蜂鸣器连接到FPGA的B2引脚。图2. 蜂鸣器硬件设计本设计用到四位数码管来显示时间,四位数码管用两个74HC595驱动,硬件设计如图1所示,74HC595的串行时钟SCK、并行时钟RCK和串行数据DIN分别连接到FPGA的N2、M1和K1引脚上。图3. 数码管驱动74HC595硬件设计3、工作原理1)使用计数器做分频处理,得到周期为1秒的脉冲信号;2)使用三个8bit的BCD码表示时钟、分钟、秒钟的值,其中高4bit表示值的十位,低4bit表示值的个位;3)正常运行时,每来一个1S脉冲信号个位加1,个位满10清零同时十位加1,当秒钟满60清零同时分钟个位加1,依次进行...直到23:59:59的下一刻全部清零;4)按键K5,模式调节,设计共分4中模式(分秒显示、分秒调节、时分显示、时分调节),按动K5依次切换模式;5)按键K2,时间调节,当数字时钟在时针调节、分针调节或秒针调节模式时,按动K2调节对应时间位;6)在调时分和调分秒两个状态,可以通过K4和K2键分别左移右移要调整的位,要调整的位会通过对应位的闪烁来示意。通过K4和 K2左右移动选择好要调整的位以后,就可以通过K1和K3来增大或调小对应的位;4、代码设计为了实现所需要的功能,我们将整个设计划分不同的模块,如图4所示。图4. 数字时钟程序设计框架4.1
五位按键消抖模块图5. 五位按键消抖模块 ?输入:五位的按键电平信息输入 ?输出:五位消抖后的脉冲输出 ?功能:将按键按下一次的电平信号,经过消抖后变成一个维持一个时钟周期的脉冲信号; ?原理:图6. 按键抖动特性FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。图7.
FPGA按键的理解示意图4.2 电子表显示控制模块。图8. 电子表显示控制模块 ?输入:五位的按键脉冲 ?输出:十六位的BCD码输出,每四个代表一个十进制数; ?原理:四位的位闪烁控制信号。某一位为一代表这位对应的数码管的一位进行闪烁显示。(在调整状态下,会让当前调整的哪一位进行闪烁。正常显示状态下seg_flash_data全为零); ?功能:主要就是一个状态机,通过检查输入的按键信息,进行显示状态切换,时间调整。四个状态分别为:显示分秒,调分秒,时分显示,调时分;当K5按键按下(key_pulse[4])时依次跳转,如图9所示。图 9. 数字时钟状态控制设计4.3 数码管译码模块图10. 数码管译码模块 ?输入:四位的BCD码数据 ?输出:八位的七段数码数据 ?功能:一个case语句,将输入的四位BCD码转化为七段数码数据; ?原理:数码管分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳极(COM)需接+5V才能使其工作。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码,共阴极(COM)需接GND才能使其工作。小脚丫拓展板上的数码管如下图所示:图11. 数码管内部电路共阴极数码管:位选为低电平(即0)选中数码管;各段选为高电平(即接+5V时)选中各数码段;由0到f的编码为:4.4 四位数码管显示控制模块。图12. 数码管显示控制模块 ?输入:四个八位的七段数码管数据和位闪烁控制信号seg_flash_data.
?输出:需要串行输出给74HC595的十六位数据; ?功能:模块就是循环的将四位七段数码数据,组合一个十六位的输出数据;4.5 74HC595驱动功能模块图13. 74HC595驱动功能模块 ?输入:十六位的位选段选数据。 1)duan_wei_data[13:0]分别对应: 2)[ X,X,H+,H-,DIG4,DIG3,DIG2,DIG1,DP,G,F,E,D,C,B,A] ; ?输出:SPI接口输出,串行输出十六位位选段选信号; ?功能:将输入的并行的十六位的位选段选数据通过SPI接口转化为串行输出; ?原理:详见Text8.数码管显示及74HC595芯片资料5、系统运行图14. 系统运行视频地址:6、资源报告
7、知识点?时钟计数分频?按键消抖处理?功能建模?波形仿真?SPI时序实现?74HC575数码管驱动原理8、参考文档Lattice MachXO2数据手册9、相关文件
Watch_system
顶层模块,将所有功能模块接口连接起来
Clock_control_module
实现数字钟的计时,调整,整点报时功能
Key_jitter
实现按键消抖
Smg_encoder_module
实现BCD码到数码管段码的转换
Seg595_control_module
循环送出每位数码管段位数据
Seg595_function_module
实现SPI时序,十六位的段位数据串行移入74HC595
电路相关文件(请在PC端查看下载)
电路城电路折扣劵获取途径:
电路城7~10折折扣劵(全场通用):对本电路进行评分获取;
电路城6折折扣劵(限购≤100元电路):申请成为卖家,上传电路,审核成功后获取。
版权声明:电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击反馈给电路城。
使用说明:直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
大家都在看:
本设计分享的是倒车系统超声测距和数码管显示设计,见附件下载其原理图/PCB/源码。该超声波测距倒车系统硬件部分采用STC89C52 单片机作为主控单片机,硬件电路主要由发射电路、接收电路、显示电路、报警电路等几部分组成;软件部分由主程序、显示子程序、超声波发射子程序、延迟子程序、计算子程序、报警程序等组成。该电路具有结构简单、操作方便、精度较高、应用广泛的特点。
来自:时间:
【冰点大促销】!本人上传所有电路优惠价啦~资料目录:代码详细注解:统一的代码风格:功能模块划分,便于复用:需要用到的器件:FPGA开发板(任意,推荐小脚丫)6位数码管(位选)按键*2旋转编码器*2
来自:时间:
基于74HC595的八位数码管显示板特点: 主要器件:共阳数码管工作电压:直流5伏8位独立数码管显示。内部有三极管驱动电路。段码串有限流电阻。 TTL电平控制,可以直接由单片机IO口控制。八位段码输入,8位位码输入。动态扫描显示。附件包含原理图和PCB图。
来自:时间:
主控芯片采用at89c51,proteus硬件仿真,通过MCP3421采集PT100温度,数码管显示通过改变仿真图中的PT100的值,MCP3421 AD转换得到电压值,通过公式计算得到温度值
来自:时间:
小脚丫身世:可编程逻辑的设计方法从根本上改变了现代数字电路的设计,不管是从最简单的与非门还是到最复杂的SoC。通过一句句硬件描述语言可编程逻辑器件FPGA帮我们实现了各种数字电路,这一切显得十分神奇又十分神秘。目前市场上有各种各样的FPGA开发板,它们不是功能太复杂,使用门槛太高就是核心芯片老旧,几乎要被淘汰。Step团队经过精心挑选,打造了小脚丫一代FPGA开发板,为大家提供一个非常酷,实用,且入门简单的学习开发平台。小脚丫特点:
食指大小,目前最小的FPGA开发板DIP40封装,大小只有52mm*18mm,即插即用,免除了设计中复杂的布线和制版,大幅降低成本。
USB供电,自带板载编程器,无需额外配置FPGA下载线,精心挑选性价比最高最适合多数电子应用的FPGA芯片LCMXO2-1200内嵌Flash模块,综合FPGA 和CPLD的优点,上电瞬时启动无需从外部重新配置FPGA。
0.5mm pitch的BGA封装省时,省心,省力,省钱,免去重新设计4层以上的板卡即可享受FPGA小巧的BGA封装产品。
免费的设计工具 ,上手容易 ,无需再到处寻找最新破解软件,实用,入门简单既可作学习数字逻辑的FPGA开发板,也可作核心功能模块适合各种DIY和原型设计小脚Y产品参数资料分享:
软件安装包:点击开始LCMXO2-1200HC-4MG132C芯片数据手册step fpga_boardSetp_FPGA_Pin
来自:时间:
猜你喜欢(实时推荐最适合你的电路)
仿了个12864大数字时钟12c887,板子和12864一样大,4个固定孔。该数字时钟以STC89C52RC为主控芯片,通过DS12CR887时钟芯片和DS18B20温度传感器在12864上实现日期、星期、时间、农历、温度等的显示。说明:附件内容包含两个版本的PCB板文件,要用的改下io定义就可以了。用1302的话还有好多IO口闲置可以再利用。。当然程序要自己找了。原理图:
来自:时间:
本设计为基于51单片机的时钟计时器,用AT89C52单片机作为主控制芯片,以及4个四位共阳LED数码管显示时、分、秒。以24小时计时方式运行,能整点提醒(蜂鸣),使用按键开关可实现时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒(蜂鸣器)的功能。采用11.597MHZ的晶振,能提高秒计时的精确性。选用的是动态扫描法来实现LED的显示。程序设计简单,并且有详细的中文注释。便于电子爱好者学习应用。程序有主调用程序、计时及秒表中断程序、显示子程序、调时与闹钟时间设定程序。简易时钟电路设计原理图:拓展应用:该设计可以在现有的资源,实现校时、闹钟、秒表、倒计时、计数器的功能。附件内容包括:时钟计时器原理图和PCB源文件,用AD软件打开;源程序(有详细的中文注释);时钟计时器元件清单;时钟计时器proteus电路仿真;带倒计时等多功能数字电子时钟参考设计(包括原理图源文件+源代码+购买地址)
来自:时间:
小脚丫STEP-MXO2 二代是一款超小巧40脚DIP结构的FPGA开发板。核心FPGA芯片选用了Lattice公司MXO2系列的4000HC产品,相比于第一代小脚丫STEP-MXO2,板上的FPGA芯片资源提升了4倍。同时板上集成了FT232编程器和按键、拨码开关、数码管、LED等多种外设资源。板上的36个FPGA IO接口都通过2.54mm通孔焊盘引出,可以和面包板配合使用。板卡尺寸为52mm X 18mm,能够灵活的嵌入到插座或者其他的系统中。
可编程逻辑类型
FPGA芯片厂商
LCMXO2系列
2016 年 08 月 11日
2016 年 08 月 30日
sljz-1773761购买了:
lttian购买了:
flex380购买了:
bg8wj-107371购买了:
superreader1购买了:
小k的布熊购买了:
lttian购买了:
Ginvan购买了:
免费下载!
您想购买此电路吗?,上传电路,审核成功后获取电路城6折折扣劵。
6折折扣劵只能购买小于100元(含100元)的电路。君,已阅读到文档的结尾了呢~~
可行性报告
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
4位七段数码管循环显示.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Verilog的135个经典设计实例
我的图书馆
Verilog的135个经典设计实例
&&& 王金明:《Verilog HDL程序设计教程》【例3.1】4位全加器
module adder4(cout,sum,ina,inb,cin);
output[3:0]
input[3:0] ina,
assign {cout,sum}=ina+inb+
【例3.2】4位计数器
module count4(out,reset,clk);
output[3:0]
input reset,
always @(posedge clk)
&&& if (reset)& out&=0;&&&&&&&&&& //同步复位
&&& else&&&&&&&& out&=out+1;&&&& //计数
【例3.3】4位全加器的仿真程序
`timescale 1ns/1ns
`include "adder4.v"
module adder_&&&&&&&&&&&&&&&&&& //测试模块的名字
reg[3:0] a,b;&&&&& //测试输入信号定义为reg型
wire[3:0]&&&&&& //测试输出信号定义为wire型
integer i,j;
adder4 adder(sum,cout,a,b,cin);& //调用测试对象
always #5 cin=~&&&&&& //设定cin的取值
a=0;b=0;cin=0;
for(i=1;i&16;i=i+1)
#10&& a=i;&&&&& //设定a的取值
&&& - 1 - 程序文本
&& initial
&& for(j=1;j&16;j=j+1)
&& #10&& b=j;&&&&& //设定b的取值
&& initial&&&&&& //定义结果显示格式
&& $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);
&& #160& $
&& endmodule
&&& 【例3.4】4位计数器的仿真程序
&& `timescale 1ns/1ns
&& `include "count4.v"
&& module coun4_
&& reg clk,&&&&&& //测试输入信号定义为reg型
&& wire[3:0]&&&&&&&&&&&& //测试输出信号定义为wire型
&& parameter DELY=100;
&& count4 mycount(out,reset,clk);&&&&&& //调用测试对象
&& always #(DELY/2) clk = ~&&&&& //产生时钟波形
&& initial
&&& begin&&&&&& //激励信号定义
&&& clk =0; reset=0;
&&& #DELY&&& reset=1;
&&& #DELY&&& reset=0;
&&& #(DELY*20) $
&& //定义结果显示格式
&& initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out);
&& endmodule
&&& 【例3.5】“与-或-非”门电路
&&& module AOI(A,B,C,D,F);&&&& //模块名为AOI(端口列表A,B,C,D,F)
&&& input A,B,C,D;&&&& //模块的输入端口为A,B,C,D
&&& output F;&&&& //模块的输出端口为F
&&& 王金明:《Verilog HDL程序设计教程》wire A,B,C,D,F;&&&&&&&&&&&&&&&&&&& //定义信号的数据类型
&&& assign& F= ~((A&B)|(C&D));& //逻辑功能描述
【例5.1】用case语句描述的4选1数据选择器
module mux4_1(out,in0,in1,in2,in3,sel);
input in0,in1,in2,in3;
input[1:0]
always @(in0 or in1 or in2 or in3 or sel)&&& //敏感信号列表
&& case(sel)
&&& 2'b00:& out=in0;
&&& 2'b01:& out=in1;
&&& 2'b10:& out=in2;
&&& 2'b11:& out=in3;
&&& default: out=2'
&& endcase
【例5.2】同步置数、同步清零的计数器
module count(out,data,load,reset,clk);
output[7:0]
input[7:0]
input load,clk,
always @(posedge clk)&&&&&&&&&&&&&&&&&& //clk上升沿触发
&&& if (!reset)&&&& out = 8'h00;&&&& //同步清0,低电平有效
&&& else if (load)&& out =&&&&& //同步预置
&&&&&&&& else&&&& out = out + 1;&&&& //计数
&endmodule
【例5.3】用always过程语句描述的简单算术逻辑单元
`define add 3'd0
`define minus 3'd1
`define band 3'd2
`define bor 3'd3
`define bnot 3'd4
&&& - 3 - 程序文本
&& module alu(out,opcode,a,b);
&& output[7:0]
&& reg[7:0]
&& input[2:0]&&&&&& //操作码
&& input[7:0] a,b;&&&&& //操作数
or a or b)&&&&& //电平敏感的always块
&&& case(opcode)
&&& `add: out = a+b;&&&&&&&&& //加操作
&&& `minus: out = a-b;&&&&&&&& //减操作
&&& `band: out = a&b;&&&&&&&& //求与
&&& `bor: out = a|b;&&&&&&&&&&& //求或
&&& `bnot: out=~a;&&&&&&&& //求反
&&& default: out=8'&&&&&&&& //未收到指令时,输出任意态
&&& endcase
&& endmodule
&&& 【例5.4】用initial过程语句对测试变量A、B、C赋值
&& `timescale 1ns/1ns
&& reg A,B,C;
&& initial
&&& A = 0;& B = 1;& C = 0;
&&& #50&&& A = 1;& B = 0;
&&& #50&&& A = 0;& C = 1;
&&& #50&&& B = 1;
&&& #50&&& B = 0;& C = 0;
&&& #50&&& $
&& endmodule
&&& 【例5.5】用begin-end串行块产生信号波形
&& `timescale 10ns/1ns
&& module wave1;
&& parameter cycle=10;
&& initial
&&& 王金明:《Verilog HDL程序设计教程》
&&& wave=0;
&& #(cycle/2)& wave=1;
&& #(cycle/2)& wave=0;
&& #(cycle/2)& wave=1;
&& #(cycle/2)& wave=0;
&& #(cycle/2)& wave=1;
&& #(cycle/2)& $
initial $monitor($time,,,"wave=%b",wave);
【例5.6】用fork-join并行块产生信号波形
`timescale 10ns/1ns
module wave2;
parameter cycle=5;
&&& wave=0;
&&& #(cycle)&&& wave=1;
&&& #(2*cycle)& wave=0;
&&& #(3*cycle)& wave=1;
&&& #(4*cycle)& wave=0;
&&& #(5*cycle)& wave=1;
&&& #(6*cycle)& $
initial $monitor($time,,,"wave=%b",wave);
【例5.7】持续赋值方式定义的2选1多路选择器
module MUX21_1(out,a,b,sel);
input a,b,
assign out=(sel==0)?a:b;
&&& //持续赋值,如果sel为0,则out=a ;否则out=b
【例5.8】阻塞赋值方式定义的2选1多路选择器
module MUX21_2(out,a,b,sel);
input a,b,
&&& - 5 - 程序文本
or b or sel)
&&& if(sel==0) out=a;&&&&&&&& //阻塞赋值
&&& else&&&&&&& out=b;
&&& endmodule
&&& 【例5.9】非阻塞赋值
&&& module non_block(c,b,a,clk);
&&& output c,b;
&&& input clk,a;
&&& reg c,b;
&&& always @(posedge clk)
&&& endmodule
&&& 【例5.10】阻塞赋值
&&& module block(c,b,a,clk);
&&& output c,b;
&&& input clk,a;
&&& reg c,b;
&&& always @(posedge clk)
&&& endmodule
&&& 【例5.11】模为60的BCD码加法计数器
&&& module count60(qout,cout,data,load,cin,reset,clk);
&&& output[7:0]
&&& input[7:0]
&&& input load,cin,clk,
&&& reg[7:0]
&&& always @(posedge clk)&&&& //clk上升沿时刻计数- 6 -
&&& 王金明:《Verilog HDL程序设计教程》begin
&&& if (reset)&&&& qout&=0;&&&& //同步复位
&&& else& if(load)&&&& qout&=&&&&& //同步置数
&&&&&&&&& else& if(cin)
&&& if(qout[3:0]==9)&&&& //低位是否为9,是则
&&& qout[3:0]&=0;&&&& //回0,并判断高位是否为5
&&& if (qout[7:4]==5)& qout[7:4]&=0;
&&& qout[7:4]&=qout[7:4]+1;&&&&& //高位不为5,则加1
&&& else&&&& //低位不为9,则加1
&&& qout[3:0]&=qout[3:0]+1;
assign cout=((qout==8'h59)&cin)?1:0;&&&& //产生进位输出信号
【例5.12】BCD码—七段数码管显示译码器
module decode4_7(decodeout,indec);
output[6:0]
input[3:0]
always @(indec)
&&& case(indec)&&&&&&&&&&&& //用case语句进行译码
&&& 4'd0:decodeout=7'b1111110;
&&& 4'd1:decodeout=7'b0110000;
&&& 4'd2:decodeout=7'b1101101;
&&& 4'd3:decodeout=7'b1111001;
&&& 4'd4:decodeout=7'b0110011;
&&& 4'd5:decodeout=7'b1011011;
&&& 4'd6:decodeout=7'b1011111;
&&& 4'd7:decodeout=7'b1110000;
&&& 4'd8:decodeout=7'b1111111;
&&& 4'd9:decodeout=7'b1111011;
&&& default: decodeout=7'
&&& endcase
&&& - 7 - 程序文本
&&& endmodule
&&& 【例5.13】用casez描述的数据选择器
&&& module mux_casez(out,a,b,c,d,select);
&&& input a,b,c,d;
&&& input[3:0]
&& always @(select or a or b or c or d)
&&& casez(select)
&&& 4'b???1: out =
&&& 4'b??1?: out =
&&& 4'b?1??: out =
&&& 4'b1???: out =
&&& endcase
&& endmodule
&&& 【例5.14】隐含锁存器举例
&&& module buried_ff(c,b,a);
&&& input b,a;
&&& always @(a or b)
&&& if((b==1)&&(a==1))& c=a&b;
&&& endmodule
&&& 【例5.15】用for语句描述的七人投票表决器
&&& module voter7(pass,vote);
&&& input[6:0]
&&& reg[2:0]
&&& always @(vote)
&&& sum=0;
&&& 王金明:《Verilog HDL程序设计教程》
&&& for(i=0;i&=6;i=i+1)&&&&& //for语句
&&& if(vote[i]) sum=sum+1;
&&& if(sum[2])& pass=1;&&&&&& //若超过4人赞成,则pass=1
&&& else&&&&&& pass=0;
【例5.16】用for语句实现2个8位数相乘
module mult_for(outcome,a,b);
parameter size=8;
input[size:1] a,b;&&&& //两个操作数
output[2*size:1]&&&& //结果
reg[2*size:1]
always @(a or b)
&&& outcome=0;
&&& for(i=1; i&= i=i+1)&&&&& //for语句
&&& if(b[i])& outcome=outcome +(a && (i-1));
【例5.17】用repeat实现8位二进制数的乘法
module mult_repeat(outcome,a,b);
parameter size=8;
input[size:1] a,b;
output[2*size:1]
reg[2*size:1] temp_a,
reg[size:1] temp_b;
always @(a or b)
&&& outcome=0;
&&& temp_a=a;
&&& temp_b=b;
&&& repeat(size)&&&&&&&&& //repeat语句,size为循环次数
&&& if(temp_b[1])&&&&&&& //如果temp_b的最低位为1,就执行下面的加法
&&& outcome=outcome+temp_a;
&&& temp_a=temp_a&&1;&&&&&&& //操作数a左移一位
&&& - 9 - 程序文本
&&& temp_b=temp_b&&1;&&&&&&& //操作数b右移一位
&&& endmodule
&&& 【例5.18】同一循环的不同实现方式
&& module loop1;&&&&&&&&&&&&& //方式1
&& initial
&&& for(i=0;i&4;i=i+1)&&&& //for语句
&&& $display(“i=%h”,i);
&& endmodule
&& module loop2;&&&& //方式2
&& initial begin
&&& while(i&4)&&&&&& //while语句
&&& $display ("i=%h",i);
&&& i=i+1;
&& endmodule
&& module loop3;&&&& //方式3
&& initial begin
&&& repeat(4)&&&& //repeat语句
&&& $display ("i=%h",i);
&&& i=i+1;
&& endmodule
&&& 【例5.19】使用了`include语句的16位加法器
&&& 王金明:《Verilog HDL程序设计教程》`include "adder.v"
module adder16(cout,sum,a,b,cin);
parameter my_size=16;
output[my_size-1:0]
input[my_size-1:0] a,b;
adder my_adder(cout,sum,a,b,cin);&&&&&&& //调用adder模块
//下面是adder模块代码
module adder(cout,sum,a,b,cin);
parameter size=16;
output[size-1:0]
input[size-1:0] a,b;
&&& assign {cout,sum}=a+b+
【例5.20】条件编译举例
module compile(out,A,B);
input A,B;
`ifdef& add&&&&&&&&&&&&&&&&&&&&&&&& //宏名为add
&&& assign out=A+B;
&&& assign out=A-B;
【例6.1】加法计数器中的进程
module count(data,clk,reset,load,cout,qout);
output[3:0]
input[3:0]
input clk,reset,
&&& - 11 - 程序文本
&&& always @(posedge clk)&&&&&&& //进程1,always过程块
&&& if (!reset)&&&& qout= 4'h00;&&&& //同步清0,低电平有效
&&& else if (load)&& qout=&&&&& //同步预置
&&& else&&&&&&&& qout=qout + 1;&&&& //加法计数
&&& assign cout=(qout==4'hf)?1:0;&&&& //进程2,用持续赋值产生进位信号
&&& endmodule
&&& 【例6.2】任务举例
&& module alutask(code,a,b,c);
&& input[1:0]
&& input[3:0] a,b;
&& output[4:0]
&& reg[4:0]
&& task my_&&&&&&&&&&&&&&&&&&&& //任务定义,注意无端口列表
&& input[3:0] a,b;&&&&&&&&&&&&&&&& //a,b,out名称的作用域范围为task任务内部
&& output[4:0]
&&& for(i=3;i&=0;i=i-1)
&&& out[i]=a[i]&b[i];&&&&&&&&&&& //按位与
&& endtask
or a or b)
&&& case(code)
&&& 2'b00: my_and(a,b,c);
&&& /* 用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c分别对应任务定义中的a,b,out */
&&& 2'b01: c=a|b;&&&&&&&&&&&&&& //或
&&& 2'b10: c=a-b;&&&&&&&&&&&&& //相减
&&& 2'b11: c=a+b;&&&&&&&& //相加
&&& endcase
&& endmodule
&&& 王金明:《Verilog HDL程序设计教程》【例6.3】测试程序
`include "alutask.v"
module alu_
reg[3:0] a,b;
parameter DELY = 100;
alutask ADD(code,a,b,c);&&&&&&&&&&&&&&&& //调用被测试模块
initial begin
&&& code=4'd0; a= 4'b0000; b= 4'b1111;
#DELY&& code=4'd0; a= 4'b0111; b= 4'b1101;
#DELY&& code=4'd1; a= 4'b0001; b= 4'b0011;
#DELY&& code=4'd2; a= 4'b1001; b= 4'b0011;
#DELY&& code=4'd3; a= 4'b0011; b= 4'b0001;
#DELY&& code=4'd3; a= 4'b0111; b= 4'b1001;
initial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c);
【例6.4】函数
function[7:0] get0;
input[7:0]
&&& count=0;
&&& for (i=0;i&=7;i=i+1)
&&& if (x[i]=1'b0)& count=count+1;
endfunction
【例6.5】用函数和case语句描述的编码器(不含优先顺序)
module code_83(din,dout);
input[7:0]
output[2:0]
&&& - 13 - 程序文本
&&& function[2:0]&&&&&&&&&&&&&&&&&& //函数定义
&&& input[7:0]&&&&&&&&&&&&&&&&&&&& //函数只有输入,输出为函数名本身
&&& casex (din)
&&& 8'b1xxx_xxxx : code = 3'h7;
&&& 8'b01xx_xxxx : code = 3'h6;
&&& 8'b001x_xxxx : code = 3'h5;
&&& 8'b0001_xxxx : code = 3'h4;
&&& 8'b0000_1xxx : code = 3'h3;
&&& 8'b0000_01xx : code = 3'h2;
&&& 8'bx : code = 3'h1;
&&& 8'bx : code = 3'h0;
&&& default: code = 3'
&&& endcase
&&& endfunction
&&& assign dout = code(din) ;&&&&&&&&&& //函数调用
&&& endmodule
&&& 【例6.6】阶乘运算函数
&& module funct(clk,n,result,reset);
&& output[31:0]
&& input[3:0]
&& input reset,
&& reg[31:0]
&& always @(posedge clk)&&&&&&&& //在clk的上升沿时执行运算
&&& if(!reset)& result&=0;&&&&&&&& //复位
&&& else& begin
&&& result &= 2 * factorial(n); //调用factorial函数
&& function[31:0]&&&&&&&& //阶乘运算函数定义(注意无端口列表)
&& input[3:0]&&&&&&&&&&&&& //函数只能定义输入端,输出端口为函数名本身
&& reg[3:0]
&&& factorial = opa ? 1 : 0;
&&& for(i= 2; i &= i = i+1)&&&&& //该句若要综合通过,opa应赋具体的数值
&&& factorial = i*&&&&&&&& //阶乘运算
&&& 王金明:《Verilog HDL程序设计教程》endfunction
【例6.7】测试程序
`define clk_cycle& 50
`include "funct.v"
module funct_
reg reset,
wire[31:0]
&& initial&&&&&&&&&&&&&&&&&&&&&& //定义激励向量
&& n=0;& reset=1;& clk=0;
&& for(n=0;n&=15;n=n+1)
&& #100& n=n;
initial $monitor($time,,,"n=%d result=%d",n,result);
&&& //定义输出显示格式
always& # `clk_cycle& clk=~&&&&&&&&&& //产生时钟信号
funct funct_try(.clk(clk),.n(n),.result(result),.reset(reset));
&&& //调用被测试模块
【例6.8】顺序执行模块1
module serial1(q,a,clk);
output q,a;
always @(posedge clk)
【例6.9】顺序执行模块2
module serial2(q,a,clk);
output q,a;
&&& - 15 - 程序文本
&&& reg q,a;
&&& always @(posedge clk)
&&& endmodule
&&& 【例6.10】并行执行模块1
&&& module paral1(q,a,clk);
&&& output q,a;
&&& reg q,a;
&&& always @(posedge clk)
&&& always @(posedge clk)
&&& endmodule
&&& 【例6.11】并行执行模块2
&&& module paral2(q,a,clk);
&&& output q,a;
&&& reg q,a;
&&& always @(posedge clk)
&&& always @(posedge clk)
&&& endmodule
&&& 【例7.1】调用门元件实现的4选1 MUX- 16 -
&&& 王金明:《Verilog HDL程序设计教程》module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2);
input in1,in2,in3,in4,cntrl1,cntrl2;
wire notcntrl1,notcntrl2,w,x,y,z;
not& notcntrl1,cntrl2),
&&& (notcntrl2,cntrl2);
and& (w,in1,notcntrl1,notcntrl2),
&&& (x,in2,notcntrl1,cntrl2),
&&& (y,in3,cntrl1,notcntrl2),
&&& (z,in4,cntrl1,cntrl2);
or& (out,w,x,y,z);
【例7.2】用case语句描述的4选1 MUX
module mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2);
input in1,in2,in3,in4,cntrl1,cntrl2;
or in2 or in3 or in4 or cntrl1 or cntrl2)
&&& case({cntrl1,cntrl2})
&&& 2'b00:out=in1;
&&& 2'b01:out=in2;
&&& 2'b10:out=in3;
&&& 2'b11:out=in4;
&&& default:out=2'
&&& endcase
【例7.3】行为描述方式实现的4位计数器
module count4(clk,clr,out);
input clk,
output[3:0]
always @(posedge clk or posedge clr)
&&& if (clr)&&& out&=0;
&&& else&&&&& out&=out+1;
&&& - 17 - 程序文本
&&& 【例7.4】数据流方式描述的4选1 MUX
&&& module mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);
&&& input in1,in2,in3,in4,cntrl1,cntrl2;
&&& assign out=(in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)|
&&& (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2);
&&& endmodule
&&& 【例7.5】用条件运算符描述的4选1 MUX
&&& module mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2);
&&& input in1,in2,in3,in4,cntrl1,cntrl2;
&&& assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1);
&&& endmodule
&&& 【例7.6】门级结构描述的2选1MUX
&&& module mux2_1a(out,a,b,sel);
&&& input a,b,
&&& not (sel_,sel);
&&& and& a1,a,sel_),
&&& (a2,b,sel);
&&& or (out,a1,a2);
&&& endmodule
&&& 【例7.7】行为描述的2选1MUX
&&& module mux2_1b(out,a,b,sel);
&&& input a,b,
&&& always @(a or b or sel)
&&& if(sel)&&&& out =
&&& else&&& out =
&&& endmodule
&&& 【例7.8】数据流描述的2选1MUX
&&& module MUX2_1c(out,a,b,sel);
&&& 王金明:《Verilog HDL程序设计教程》input a,b,
&&& assign out = sel ? b :
【例7.9】调用门元件实现的1位半加器
module half_add1(a,b,sum,cout);
input a,b;
output sum,
and& cout,a,b);
xor& sum,a,b);
【例7.10】数据流方式描述的1位半加器
module half_add2(a,b,sum,cout);
input a,b;
output sum,
assign sum=a^b;
assign cout=a&b;
【例7.11】采用行为描述的1位半加器
module half_add3(a,b,sum,cout);
input a,b;
output sum,
always @(a or b)
&&& case ({a,b})&&&&&&&&&&&&&&&&&&& //真值表描述
&&& 2'b00: begin& sum=0; cout=0;& end
&&& 2'b01: begin& sum=1; cout=0;& end
&&& 2'b10: begin& sum=1; cout=0;& end
&&& 2'b11: begin& sum=0; cout=1;& end
&&& endcase
【例7.12】采用行为描述的1位半加器
module half_add4(a,b,sum,cout);
input a,b;
output sum,
&&& - 19 - 程序文本
&&& reg sum,
&&& always @(a or b)
&&& sum= a^b;
&&& cout=a&b;
&&& endmodule
&&& 【例7.13】调用门元件实现的1位全加器
&&& module full_add1(a,b,cin,sum,cout);
&&& input a,b,
&&& output sum,
&&& wire s1,m1,m2,m3;
&&& and& m1,a,b),
&&& (m2,b,cin),
&&& (m3,a,cin);
&&& xor& s1,a,b),
&&& (sum,s1,cin);
&&& or& (cout,m1,m2,m3);
&&& endmodule
&&& 【例7.14】数据流描述的1位全加器
&&& module full_add2(a,b,cin,sum,cout);
&&& input a,b,
&&& output sum,
&&& assign sum = a ^ b ^
&&& assign cout = (a & b)|(b & cin)|(cin & a);
&&& endmodule
&&& 【例7.15】1位全加器
&&& module full_add3(a,b,cin,sum,cout);
&&& input a,b,
&&& output sum,
&&& assign {cout,sum}=a+b+
&&& endmodule
&&& 【例7.16】行为描述的1位全加器
&&& module full_add4(a,b,cin,sum,cout);
&&& input a,b,
&&& output sum,
&&& 王金明:《Verilog HDL程序设计教程》reg sum,&&&& //在always块中被赋值的变量应定义为reg型reg m1,m2,m3;
always @(a or b or cin)
&&& sum = (a ^ b) ^
&&& m1 = a &
&&& m2 = b &
&&& m3 = a &
&&& cout = (m1|m2)|m3;
【例7.17】混合描述的1位全加器
module full_add5(a,b,cin,sum,cout);
input a,b,
output sum,
reg cout,m1,m2,m3;&&&&&&&&&&&& //在always块中被赋值的变量应定义为reg型wire s1;
xor x1(s1,a,b);&&&&&&&&&&& //调用门元件
always @(a or b or cin)&&&&&&& //always块语句
&&& m1 = a &
&&& m2 = b &
&&& m3 = a &
&&& cout = (m1| m2) | m3;
assign sum = s1 ^&&&&&& //assign持续赋值语句
【例7.18】结构描述的4位级连全加器
`include "full_add1.v"
module add4_1(sum,cout,a,b,cin);
output[3:0]
input[3:0] a,b;
full_add1 f0(a[0],b[0],cin,sum[0],cin1);&&&& //级连描述
full_add1 f1(a[1],b[1],cin1,sum[1],cin2);
full_add1 f2(a[2],b[2],cin2,sum[2],cin3);
&&& - 21 - 程序文本
&& full_add1 f3(a[3],b[3],cin3,sum[3],cout);
&& endmodule
&&& 【例7.19】数据流描述的4位全加器
&& module add4_2(cout,sum,a,b,cin);
&& output[3:0]
&& input[3:0] a,b;
&& assign {cout,sum}=a+b+
&& endmodule
&&& 【例7.20】行为描述的4位全加器
&& module add4_3(cout,sum,a,b,cin);
&& output[3:0]
&& input[3:0] a,b;
&& reg[3:0]
&& always @(a or b or cin)
&&& {cout,sum}=a+b+
&& endmodule
&&& 【例8.1】$time与$realtime的区别
&&& `timescale 10ns/1ns
&&& module time_
&&& parameter delay=2.6;
&&& initial
&&& #delay& ts=1;
&&& #delay& ts=0;
&&& #delay& ts=1;
&&& #delay& ts=0;
&&& initial& $monitor($time,,,"ts=%b",ts);&& //使用函数$time- 22 -
&&& 王金明:《Verilog HDL程序设计教程》endmodule
【例8.2】$random函数的使用
`timescale 10ns/1ns
module random_
parameter delay=10;
initial $monitor($time,,,"data=%b",data);
initial begin
&&& for(i=0; i&=100; i=i+1)
&&& #delay& data=$&&&&&&&& //每次产生一个随机数
【例8.3】1位全加器进位输出UDP元件
primitive carry_udp(cout,cin,a,b);
input cin,a,b;
&& //cin& a& b& :& cout&&&&&&&&&&& //真值表
&&& 0&& 0&& 0& :&&& 0;
&&& 0&& 1&& 0& :&&& 0;
&&& 0&& 0&& 1& :&&& 0;
&&& 0&& 1&& 1& :&&& 1;
&&& 1&& 0&& 0& :&&& 0;
&&& 1&& 0&& 1& :&&& 1;
&&& 1&& 1&& 0& :&&& 1;
&&& 1&& 1&& 1& :&&& 1;
endprimitive
【例8.4】包含x态输入的1位全加器进位输出UDP元件
primitive carry_udpx1(cout,cin,a,b);
input cin,a,b;
&&& // cin& a& b& :& cout&&&& //真值表
&&& 0&& 0&& 0& :&&& 0;
&&& - 23 - 程序文本
&&& 0&& 1&& 0& :&&& 0;
&&& 0&& 0&& 1& :&&& 0;
&&& 0&& 1&& 1& :&&& 1;
&&& 1&& 0&& 0& :&&& 0;
&&& 1&& 0&& 1& :&&& 1;
&&& 1&& 1&& 0& :&&& 1;
&&& 1&& 1&& 1& :&&& 1;
&&& 0&& 0&& x& :&&& 0;&&&& //只要有两个输入为0,则进位输出肯定为0
&&& 0&& x&& 0& :&&& 0;
&&& x&& 0&& 0& :&&& 0;
&&& 1&& 1&& x& :&&& 1;&&&& //只要有两个输入为1,则进位输出肯定为1
&&& 1&& x&& 1& :&&& 1;
&&& x&& 1&& 1& :&&& 1;
&&& endtable
&&& endprimitive
&&& 【例8.5】用简缩符“?”表述的1位全加器进位输出UDP元件
&& primitive carry_udpx2(cout,cin,a,b);
&& input cin,a,b;
&&& // cin& a& b :& cout&&&&&&&&&& //真值表
&&& && 0&& 0& :&&& 0;&&&&& //只要有两个输入为0,则进位输出肯定为0
&&& 0&& ?&& 0& :&&& 0;
&&& 0&& 0&& ?& :&&& 0;
&&& && 1&& 1& :&&& 1;&&&& //只要有两个输入为1,则进位输出肯定为1
&&& 1&& ?&& 1& :&&& 1;
&&& 1&& 1&& ?& :&&& 1;
&&& endtable
&&& endprimitive
&&& 【例8.6】3选1多路选择器UDP元件
&&& primitive mux31(Y,in0,in1,in2,s2,s1);
&&& input in0,in1,in2,s2,s1;
&&& output Y;
&&& //in0 in1 in2 s2 s1 : Y
&&& 0&& ?&& ?&&& 0&& 0& :& 0;&&&& //当s2s1=00时,Y=in0
&&& 1&& ?&& ?&&& 0&& 0& :& 1;
&&& && 0&& ?&&& 0&& 1& :& 0;&&&& //当s2s1=01时,Y=in1
&&& 王金明:《Verilog HDL程序设计教程》
&&& && 1&& ?&&& 0&& 1& :& 1;
&&& && && 0&&& 1&& ?& :& 0;&&&& //当s2s1=1?时,Y=in2
&&& && && 1&&& 1&& ?& :& 1;
&&& 0&& 0&& ?&&& 0&& ?& :& 0;
&&& 1&& 1&& ?&&& 0&& ?& :& 1;
&&& 0&& ?&& 0&&& ?&& 0& :& 0;
&&& 1&& ?&& 1&&& ?&& 0& :& 1;
&&& && 0&& 0&&& ?&& 1& :& 0;
&&& && 1&& 1&&& ?&& 1& :& 1;
&&& endtable
endprimitive
【例8.7】电平敏感的1位数据锁存器UDP元件
primitive latch(Q,clk,reset,D);
input clk,reset,D;
initial Q = 1'b1;&&& //初始化
&&& // clk reset D : state : Q
&&& && 1&& ?& : ? : 0 ;& //reset=1,则不管其他端口为什么值,输出都为0
&&& 0&& 0&& 0& : ? : 0 ;& //clk=0,锁存器把D端的输入值输出
&&& 0&& 0&& 1& : ? : 1 ;
&&& 1&& 0&& ?& : ? : - ;&& //clk=1,锁存器的输出保持原值,用符号“-”表示
&&& endtable
endprimitive
【例8.8】上升沿触发的D触发器UDP元件
primitive DFF(Q,D,clk);
&& //clk& D : state : Q
&&& (01)& 0&& : ? :&& 0;&&&& //上升沿到来,输出Q=D
&&& (01)& 1&& : ? :&& 1;
&&& (0x)& 1&& : 1 :&& 1;
&&& (0x)& 0&& : 0 :&& 0;
&&& (?0)& ?&& : ? :&& -;&&&& //没有上升沿到来,输出Q保持原值
&&& && (??)& : ? :&& - ;&&&& //时钟不变,输出也不变
&&& - 25 - 程序文本
&&& endtable
&& endprimitive
&&& 【例8.9】带异步置1和异步清零的上升沿触发的D触发器UDP元件
&& primitive DFF_UDP(Q,D,clk,clr,set);
&& output Q;
&& input D,clk,clr,
&&& // clk& D&& clr& et&& state : Q
&&& (01)& 1&& 0&& 0&& : ? :&& 0;
&&& (01)& 1&& 0&& x&& : ? :&& 0;
&&& &&&& && 0&& x&& : 0 :&& 0;
&&& (01)& 0&& 0&& 0&& : ? :&& 1;
&&& (01)& 0&& x&& 0&& : ? :&& 1;
&&& &&&& && x&& 0&& : 1 :&& 1;
&&& (x1)& 1&& 0&& 0&& : 0 :&& 0;
&&& (x1)& 0&& 0&& 0&& : 1 :&& 1;
&&& (0x)& 1&& 0&& 0&& : 0 :&& 0;
&&& (0x)& 0&& 0&& 0&& : 1 :&& 1;
&&& &&&& && 1&& ?&& : ? :&& 1;&&&&&& //异步复位
&&& &&&& && 0&& 1&& : ? :&& 0;&&&&&& //异步置1
&&& n&&&& ?&& 0&& 0&& : ? :&& -;
&&& &&&& *&& ?&& ?&& : ? :&& -;
&&& &&&& && (?0) ?& : ? :&& -;
&&& &&&& && && (?0): ? :&& -;
&&& &&&& && && && : ? :&&
&&& endtable
&& endprimitive
&&& 【例8.12】延迟定义块举例
&&& module delay(out,a,b,c);
&&& input a,b,c;
&&& and a1(n1,a,b);
&&& or o1(out,c,n1);
&&& specify
&&& (a=&out)=2;
&&& (b=&out)=3;
&&& (c=&out)=1;
&&& 王金明:《Verilog HDL程序设计教程》
&&& endspecify
【例8.13】激励波形的描述
'timescale 1ns/1ns
module test1;
reg A,B,C;
&&& begin&&&&&&&&&&&&&&&&&&& //激励波形描述
&&& A = 0; B = 1; C = 0;
&&& #100 C = 1;
&&& #100 A = 1; B = 0;
&&& #100 A = 0;
&&& #100 C = 0;
&&& #100 $
initial $monitor($time,,,"A=%d B=%d C=%d",A,B,C);&&& //显示
【例8.15】用always过程块产生两个时钟信号
module test2;
reg clk1,clk2;
parameter CYCLE = 100;
&&& {clk1,clk2} = 2'b10;
&&& #(CYCLE/4)& {clk1,clk2} = 2'b01;
&&& #(CYCLE/4)& {clk1,clk2} = 2'b11;
&&& #(CYCLE/4)& {clk1,clk2} = 2'b00;
&&& #(CYCLE/4)& {clk1,clk2} = 2'b10;
initial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2);
【例8.17】存储器在仿真程序中的应用
module ROM(addr,data,oe);
output[7:0]&&&&& //数据信号
input[14:0]&&&&& //地址信号
&&&&& //读使能信号,低电平有效
&&& - 27 - 程序文本
&& reg[7:0] mem[0:255];&&&&& //存储器定义
&& parameter DELAY = 100;
&& assign #DELAY data=(oe==0) ? mem[addr] : 8'
&& initial $readmemh("rom.hex",mem);&&& //从文件中读入数据
&& endmodule
&&& 【例8.18】8位乘法器的仿真程序
&& `timescale 10ns/1ns
&& module mult_&&&&&&&&&&&&&&&&&&&& //测试模块的名字
&& reg[7:0] a,b;&&&&& //测试输入信号定义为reg型
&& wire [15:0]&&&&& //测试输出信号定义为wire型
&& integer i,j;
&& mult8 m1(out,a,b);&&&& //调用测试对象
&&& //激励波形设定
&& initial
&&& a=0;b=0;
&&& for(i=1;i&255;i=i+1)
&&& #10 a=i;
&& initial
&&& for(j=1;j&255;j=j+1)
&&& #10 b=j;
&& initial&&&&&& //定义结果显示格式
&&& $monitor($time,,,"%d * %d= %d",a,b,out);
&&& #2560& $
&& endmodule
&& module mult8(out, a, b);&&&&& //8位乘法器源代码
&& parameter size=8;
&& input[size:1] a,b;&&&& //两个操作数
&& output[2*size:1]&&&& //结果
&& assign out=a*b;&&&&&&&&&&&&&&&& //乘法运算符- 28 -
&&& 王金明:《Verilog HDL程序设计教程》endmodule
【例8.19】8位加法器的仿真程序
`timescale 1ns/1ns
module add8_&&&&&&&& //仿真模块无端口列表
reg[7:0] A,B;&&&&& //输入激励信号定义为reg型
wire[7:0] SUM;&&&&&&& //输出信号定义为wire型
parameter DELY = 100;
add8& AD1(SUM,cout,A,B,cin);&&&&& //调用测试对象
initial begin&&&& //激励波形设定
&&& A= 8'd0;&&& B= 8'd0;&&& cin=1'b0;
#DELY&&& A= 8'd100;& B= 8'd200;& cin=1'b1;
#DELY&&& A= 8'd200;& B= 8'd88;
#DELY&&& A= 8'd210;& B= 8'd18;&& cin=1'b0;
#DELY&&& A= 8'd12;&& B= 8'd12;
#DELY&&& A= 8'd100;& B= 8'd154;
#DELY&&& A= 8'd255;& B= 8'd255;& cin=1'b1;
#DELY&&& $
//输出格式定义
initial $monitor($time,,,"%d + %d + %b = {%b, %d}",A,B,cin,cout,SUM);endmodule
module add8(SUM,cout,A,B,cin);&&&& //待测试的8位加法器模块
output[7:0] SUM;
input[7:0] A,B;
assign {cout,SUM}=A+B+
【例8.20】2选1多路选择器的仿真
`timescale 1ns/1ns
module mux_
&&& - 29 - 程序文本
&& MUX2_1 m1(out,a,b,sel);&&&&&&&& //调用待测试模块
&& initial
&&& a=1'b0; b=1'b0; sel=1'b0;
&& #5&& sel=1'b1;
&& #5&& a=1'b1;& el=1'b0;
&& #5&& sel=1'b1;
&& #5&& a=1'b0; b=1'b1;& el=1'b0;
&& #5&& sel=1'b1;
&& #5&& a=1'b1; b=1'b1; sel=1'b0;
&& #5&& sel=1'b1;
&& initial $monitor($time,,,"a=%b b=%b sel=%b out=%b",a,b,sel,out);
&& endmodule
&& module MUX2_1(out,a,b,sel);&&&&&&&& //待测试的2选1MUX模块
&& input a,b,
&& not #(0.4,0.3) (sel_,sel);&&&& //#(0.4,0.3)为门延时
&& and #(0.7,0.6) (a1,a,sel_);
&& and #(0.7,0.6) (a2,b,sel);
&& or #(0.7,0.6) (out,a1,a2);
&& endmodule
&&& 【例8.21】8位计数器的仿真
&& `timescale 10ns/1ns
&& module count8_
&& reg clk,&&&&&& //输入激励信号定义为reg型
&& wire[7:0]&&&&&&&&&&& //输出信号定义为wire型
&& parameter DELY=100;
&& counter& C1(qout,reset,clk);&&&&&& //调用测试对象
&& always #(DELY/2) clk = ~&&&&& //产生时钟波形
&& initial
&& begin&&&&& //激励波形定义
&&& clk =0; reset=0;
&&& 王金明:《Verilog HDL程序设计教程》#DELY&& reset=1;
#DELY&& reset=0;
#(DELY*300)& $
&&& //结果显示
initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout);endmodule
module counter(qout,reset,clk);&&&&& //待测试的8位计数器模块
output[7:0]
input clk,
always @(posedge clk)
&& begin&&& if (reset)& qout&=0;
&&& else&&&& qout&=qout+1;
【例9.1】基本门电路的几种描述方法
(1)门级结构描述
module gate1(F,A,B,C,D);
input A,B,C,D;
nand(F1,A,B);&&&& //调用门元件
and(F2,B,C,D);
or(F,F1,F2);
(2)数据流描述
module gate2(F,A,B,C,D);
input A,B,C,D;
assign F=(A&B)|(B&C&D);&&&&& //assign持续赋值
(3)行为描述
module gate3(F,A,B,C,D);
input A,B,C,D;
&&& - 31 - 程序文本
&&& reg F;
&&& always @(A or B or C or D)&&&& //过程赋值
&&& F=(A&B)|(B&C&D);
&&& endmodule
&&& 【例9.2】用bufif1关键字描述的三态门
&& module tri_1(in,en,out);
&& input in,
&& bufif1 b1(out,in,en);&&&& //注意三态门端口的排列顺序
&& endmodule
&&& 【例9.3】用assign语句描述的三态门
&& module tri_2(out,in,en);
&& input in,
&& assign out = en ? in : '
&&& //若en=1,则out=in;若en=0,则out为高阻态
&&& endmodule
&&& 【例9.4】三态双向驱动器
&& module bidir(tri_inout,out,in,en,b);
&& inout tri_
&& input in,en,b;
&& assign tri_inout = en ? in : '
&& assign out = tri_inout ^
&& endmodule
&&& 【例9.5】三态双向驱动器
&& module bidir2(bidir,en,clk);
&& inout[7:0]
&& input en,
&& reg[7:0]
&& assign bidir= en ? temp : 8'
&& always @(posedge clk)
&&& 王金明:《Verilog HDL程序设计教程》
&&& if(en)& temp=
&&& else&&& temp=temp+1;
【例9.6】3-8译码器
module decoder_38(out,in);
output[7:0]
input[2:0]
always @(in)
&& case(in)
&&& 3'd0: out=8'b;
&&& 3'd1: out=8'b;
&&& 3'd2: out=8'b;
&&& 3'd3: out=8'b;
&&& 3'd4: out=8'b;
&&& 3'd5: out=8'b;
&&& 3'd6: out=8'b;
&&& 3'd7: out=8'b;
&& endcase
【例9.7】8-3优先编码器
module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h);
output none_
output[2:0]
input a,b,c,d,e,f,g,h;
assign {none_on,outcode}=
always @(a or b or c or d or e or f or g or h)
&&& if(h)&&&&&&& outtemp=4'b0111;
&&& else if(g)&&&&& outtemp=4'b0110;
&&& else if(f)&&&&& outtemp=4'b0101;
&&& else if(e)&&&&& outtemp=4'b0100;
&&& else if(d)&&&&& outtemp=4'b0011;
&&& else if(c)&&&&&& outtemp=4'b0010;
&&& - 33 - 程序文本
&&& else if(b)&&&&& outtemp=4'b0001;
&&& else if(a)&&&&& outtemp=4'b0000;
&&& else&&&&&&&& outtemp=4'b1000;
&&& endmodule
&&& 【例9.8】用函数定义的8-3优先编码器
&& module code_83(din, dout);
&& input[7:0]
&& output[2:0]
&& function[2:0]&&&&& //函数定义
&& input[7:0]&&&&&&&&&& //函数只有输入端口,输出为函数名本身
&& if (din[7])&&&&&& code = 3'd7;
&& else if (din[6])&&&& code = 3'd6;
&& else if (din[5])&&&& code = 3'd5;
&& else if (din[4])&&&& code = 3'd4;
&& else if (din[3])&&&& code = 3'd3;
&& else if (din[2])&&&& code = 3'd2;
&& else if (din[1])&&&& code = 3'd1;
&& else&&&&& code = 3'd0;
&& endfunction
&& assign& dout = code(din);&& //函数调用
&& endmodule
&&& 【例9.9】七段数码管译码器
&&& module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0);
&&& output a,b,c,d,e,f,g;
&&& input D3,D2,D1,D0;&&&& //输入的4位BCD码
&&& reg a,b,c,d,e,f,g;
&&& always @(D3 or D2 or D1 or D0)
&&& case({D3,D2,D1,D0})&&&&&&&&& //用case语句进行译码
&&& 4'd0: {a,b,c,d,e,f,g}=7'b1111110;
&&& 4'd1: {a,b,c,d,e,f,g}=7'b0110000;
&&& 4'd2: {a,b,c,d,e,f,g}=7'b1101101;
&&& 4'd3: {a,b,c,d,e,f,g}=7'b1111001;
&&& 4'd4: {a,b,c,d,e,f,g}=7'b0110011;
&&& 4'd5: {a,b,c,d,e,f,g}=7'b1011011;
&&& 王金明:《Verilog HDL程序设计教程》
&&& 4'd6: {a,b,c,d,e,f,g}=7'b1011111;
&&& 4'd7: {a,b,c,d,e,f,g}=7'b1110000;
&&& 4'd8: {a,b,c,d,e,f,g}=7'b1111111;
&&& 4'd9: {a,b,c,d,e,f,g}=7'b1111011;
&&& default: {a,b,c,d,e,f,g}=7'
&&& endcase
【例9.10】奇偶校验位产生器
module parity(even_bit,odd_bit,input_bus);
output even_bit,odd_
input[7:0] input_
assign odd_bit = ^ input_&&&& //产生奇校验位
assign even_bit = ~odd_&&&&& //产生偶校验位
【例9.11】用if-else语句描述的4选1 MUX
module mux_if(out,in0,in1,in2,in3,sel);
input in0,in1,in2,in3;
input[1:0]
always @(in0 or in1 or in2 or in3 or sel)
&&& if(sel==2'b00)&&&&&&&& out=in0;
&&& else if(sel==2'b01)&&& out=in1;
&&& else if(sel==2'b10)&&& out=in2;
&&& else&&&&&& out=in3;
【例9.12】用case语句描述的4选1 MUX
module mux_case(out,in0,in1,in2,in3,sel);
input in0,in1,in2,in3;
input[1:0]
always @(in0 or in1 or in2 or in3 or sel)
&&& - 35 - 程序文本
&&& case(sel)
&&& 2'b00: out=in0;
&&& 2'b01: out=in1;
&&& 2'b10: out=in2;
&&& default: out=in3;
&&& endcase
&& endmodule
&&& 【例9.13】用组合电路实现的ROM
&&& module rom(addr,data);
&&& input[3:0]
&&& output[7:0]
&&& function[7:0]
&&& input[3:0]
&&& case(addr)
&&& 0 : romout = 0;
&&& 1 : romout = 1;
&&& 2 : romout = 4;
&&& 3 : romout = 9;
&&& 4 : romout = 16;
&&& 5 : romout = 25;
&&& 6 : romout = 36;
&&& 7 : romout = 49;
&&& 8 : romout = 64;
&&& 9 : romout = 81;
&&& 10 : romout = 100;
&&& 11 : romout = 121;
&&& 12 : romout = 144;
&&& 13 : romout = 169;
&&& 14 : romout = 196;
&&& 15 : romout = 225;
&&& default : romout = 8'
&&& endcase
&&& endfunction
&&& assign data = romout(addr);
&&& endmodule
&&& 【例9.14】基本D触发器- 36 -
&&& 王金明:《Verilog HDL程序设计教程》module DFF(Q,D,CLK);
input D,CLK;
always @(posedge CLK)
&&& Q &= D;
【例9.15】带异步清0、异步置1的D触发器
module DFF1(q,qn,d,clk,set,reset);
input d,clk,set,
always @(posedge clk or negedge set or negedge reset)
&&& if (!reset) begin
&&& q &= 0;&&&&& //异步清0,低电平有效
&&& qn &= 1;
&&& else if (!set)& begin
&&& q &= 1;&&&&& //异步置1,低电平有效
&&& qn &= 0;
&&& else&&&&&& begin
&&& qn &= ~d;
【例9.16】带同步清0、同步置1的D触发器
module DFF2(q,qn,d,clk,set,reset);
input d,clk,set,
always @(posedge clk)
&&& if (reset)& begin
&&& - 37 - 程序文本
&&& q &= 0; qn &= 1;&&&& //同步清0,高电平有效
&&& else if (set) begin
&&& q &=1; qn &=0;&&&&& //同步置1,高电平有效
&&& else&&&&&& begin
&&& q &=& n &= ~d;
&&& endmodule
&&& 【例9.17】带异步清0、异步置1的JK触发器
&&& module JK_FF(CLK,J,K,Q,RS,SET);
&&& input CLK,J,K,SET,RS;
&&& output Q;
&&& reg Q;
&&& always @(posedge CLK or negedge RS or negedge SET)
&&& if(!RS)& Q &= 1'b0;
&&& else if(!SET) Q &= 1'b1;
&&& else case({J,K})
&&& 2'b00 :&& &= Q;
&&& 2'b01 :&& &= 1'b0;
&&& 2'b10 : Q &= 1'b1;
&&& 2'b11 : Q &= ~Q;
&&& default: Q&= 1'
&&& endcase
&&& endmodule
&&& 【例9.18】电平敏感的1位数据锁存器
&& module latch_1(q,d,clk);
&& input d,
&& assign q = clk ? d :&&&& //时钟信号为高电平时,将输入端数据锁存
&& endmodule
&&& 【例9.19】带置位和复位端的1位数据锁存器
&& module latch_2(q,d,clk,set,reset);
&&& 王金明:《Verilog HDL程序设计教程》input d,clk,set,
assign q = reset ? 0 : (set ? 1 : (clk ? d : q));
【例9.20】8位数据锁存器
module latch_8(qout,data,clk);
output[7:0]
input[7:0]
always @(clk or data)
&&& if (clk) qout&=
【例9.21】8位数据寄存器
module reg8(out_data,in_data,clk,clr);
output[7:0] out_
input[7:0] in_
input clk,
reg[7:0] out_
always @(posedge clk or posedge clr)
&&& if(clr)& out_data &=0;
&&& else&&&& out_data &=in_
【例9.22】8位移位寄存器
module shifter(din,clk,clr,dout);
input din,clk,
output[7:0]
always @(posedge clk)
&&& if (clr)& dout&= 8'b0;&&&& //同步清0,高电平有效
&&& dout &= dout && 1;&&&& //输出信号左移一位
&&& - 39 - 程序文本
&&& dout[0] &=&&&&& //输入信号补充到输出信号的最低位
&& endmodule
&&& 【例9.23】可变模加法/减法计数器
&& module updown_count(d,clk,clear,load,up_down,qd);
&& input[7:0]
&& input clk,clear,
&& input up_
&& output[7:0]
&& reg[7:0]
&& assign qd =
&& always @(posedge clk)
&&& if (!clear)&&&&&& cnt = 8'h00;&&&& //同步清0,低电平有效
&&& else& if (load)&&&& cnt =&&&& //同步预置
&&& else& if (up_down)& cnt = cnt + 1;&&&& //加法计数
&&& else&&&&&& cnt = cnt - 1;&&&& //减法计数
&&& endmodule
&&& 【例9.24】4位Johnson计数器(异步复位)
&& module johnson(clk,clr,out);
&& input clk,
&& output[3:0]
&& reg[3:0]
&& always @(posedge clk or posedge clr)
&&& if (clr)&&& out&= 4'h0;
&&& begin&& out&= out&& 1;
&&& out[0]&= ~out[3];
&& endmodule
&&& 【例9.25】256×8 RAM模块
&& module ram256x8(data,address,we,inclock,outclock,q);
&& input[7:0]
&&& 王金明:《Verilog HDL程序设计教程》input[7:0]
input we,inclock,
output[7:0]
lpm_ram_dq myram(.q(q),.data(data),.address(address),
&&& .we(we),.inclock(inclock),.outclock(outclock));
defparam myram.lpm_width=8;&&&& //定义数据宽度
defparam myram.lpm_widthad=8;&&&& //定义地址宽度
【例9.26】256×16 RAM块
module map_lpm_ram(dataout,datain,addr,we,inclk,outclk);
input[15:0]&&&&& //端口定义
input[7:0]
input we,inclk,
output[15:0]
&&& //lpm_ram_dq元件例化
lpm_ram_dq ram(.data(datain),.address(addr),.we(we),.inclock(inclk),
&&& .outclock(outclk),.q(dataout));
defparam ram.lpm_width=16;&&&& //参数赋值
defparam ram.lpm_widthad=8;
defparam ram.lpm_indata="REGISTERED";
defparam ram.lpm_outdata="REGISTERED";
defparam ram.lpm_file="map_lpm_ram.mif";&&&& //RAM块中的内容取自该文件endmodule
【例9.27】4位串并转换器
module serial_pal(clk,reset,en,in,out);
input clk,reset,en,
output[3:0]
always @(posedge clk)
&&& if(reset)&&&&& out&=4'h0;
&&& else if(en)&&&& out&={out,in};&&&&&&&& //使用连接运算符
【例9.28】用函数实现简单的处理器
module mpc(instr,out);
input[17:0]&&&&&&&&&&&&&&&& //instr为输入的指令
&&& - 41 - 程序文本
&& output[8:0]&&&&& //输出结果
&& reg[8:0]
&& reg[7:0] op1,op2;&&&& //从指令中提取的两个操作数
&& function[16:0] code_&&&&& //函数的定义
&& input[17:0]
&& reg add_
&& reg[7:0] code,opr1,opr2;
&&& code=instr[17:16];&&&& //输入指令instr的高2位是操作码
&&& opr1=instr[7:0];&&&&& //输入指令instr的低8位是操作数opr1
&&& case(code)
&&& 2'b00:
&&& add_func=1;
&&& opr2=instr[15:8];&&&& //从instr中取第二个操作数
&&& 2'b01:
&&& add_func=0;
&&& opr2=instr[15:8];&&&& //从instr中取第二个操作数
&&& 2'b10:
&&& add_func=1;
&&& opr2=8'd1;&&&& //第二个操作数取为1,实现+1操作
&&& default:
&&& add_func=0;
&&& opr2=8'd1;&&&&&& //实现-1操作
&&& endcase
&&& code_add={add_func,opr2,opr1};
&&& endfunction
&& always @(instr)
&&& 王金明:《Verilog HDL程序设计教程》
&&& {func,op2,op1}=code_add(instr);&&&& //调用函数
&&& if(func==1)& out=op1+op2;&&&& //实现两数相加、操作数1加1操作
&&& else&&&&&&&& out=op1-op2;&&&& //实现两数相减、操作数1减1操作
【例9.29】微处理器的测试代码
`timescale 10ns/1ns
`include "mpc.v"
module mpc_
parameter DELY=10;
mpc m1(instr,out);&&&&&&&&&&&&&&&&&& //调用待测试模块
initial begin
&&& instr=18'd0;
#DELY instr=18'b00_01111;
#DELY instr=18'b00_01111;
#DELY instr=18'b01_01111;
#DELY instr=18'b01_01111;
#DELY instr=18'b10_01111;
#DELY instr=18'b11_01111;
#DELY instr=18'b00_01111;
initial $monitor($time,,,"instr=%b out=%b",instr,out);
【例9.30】乘累加器(MAC)代码
module MAC(out,opa,opb,clk,clr);
output[15:0]
input[7:0] opa,
input clk,
wire[15:0]
function[15:0]&&&&&&& //函数定义,mult函数完成乘法操作
input[7:0] opa,&&&&&&&& //函数只能定义输入端,输出端口为函数名本身reg[15:0]
&&& - 43 - 程序文本
&&& result = opa[0]? opb : 0;
&&& for(i= 1; i &= 7; i = i+1)
&&& if(opa[i]==1)& result=result+(opb&&(i-1));
&& endfunction
&& assign sum=mult(opa,opb)+
&& always @(posedge clk or posedge clr)
&&& if(clr)& out&=0;
&&& else&&&& out&=
&& endmodule
&&& 【例9.31】乘累加器的测试代码
&& 'timescale 1ns/1ns
&& 'include "mac.v"
&& module mac_
&& reg[7:0] opa,&&&&& //测试输入信号用reg型变量
&& reg clr,
&& wire[15:0]&&&&&& //测试输出信号用wire型变量
&& parameter DELY = 100;
&& //测试对象调用
&& MAC m1(out,opa,opb,clk,clr);
&& always #(DELY) clk = ~&&&& //产生时钟波形
&& initial begin&&&&& //激励波形定义
&&& clr=1;clk=0;opa=8'd0; opb=8'd0;
&& #DELY clr=0;opa=8'd1; opb=8'd10;
&& #DELY opa=8'd2; opb=8'd10;
&& #DELY opa=8'd3; opb=8'd10;
&&& 王金明:《Verilog HDL程序设计教程》#DELY opa=8'd4; opb=8'd10;
#DELY opa=8'd5; opb=8'd10;
#DELY opa=8'd6; opb=8'd10;
#DELY opa=8'd7; opb=8'd10;
#DELY opa=8'd8; opb=8'd10;
#DELY opa=8'd9; opb=8'd10;
#DELY opa=8'd10; opb=8'd10;
&&& //结果显示
initial $monitor($time,,,"clr=%b opa=%d opb=%d out=%d",clr,opa,opb,out);endmodule
【例10.1】非流水线方式8位全加器
module adder8(cout,sum,ina,inb,cin,clk);
output[7:0]
input[7:0] ina,
input cin,
reg[7:0] tempa,tempb,
always @(posedge clk)
&&& tempa=& tempb=& tempc=&&&&&& //输入数据锁存
always @(posedge clk)
&&& {cout,sum}=tempa+tempb+
【例10.2】4级流水方式的8位全加器
module pipeline(cout,sum,ina,inb,cin,clk);
output[7:0]
input[7:0] ina,
input cin,
reg[7:0] tempa,tempb,
reg tempci,firstco,secondco,thirdco,
&&& - 45 - 程序文本
&& reg[1:0] firsts,thirda,
&& reg[3:0] seconda,secondb,
&& reg[5:0] firsta,firstb,
&& always @(posedge clk)
&&& tempa=& tempb=& tempci=&&&&& //输入数据缓存
&&& always @(posedge clk)
&&& {firstco,firsts}=tempa[1:0]+tempb[1:0]+
&&& //第一级加(低2位)
&&& firsta=tempa[7:2];&&&& //未参加计算的数据缓存
&&& firstb=tempb[7:2];
&&& always @(posedge clk)
&&& {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
&&& //第二级加(第2、3位相加)
&&& seconda=firsta[5:2];&&&& //数据缓存
&&& secondb=firstb[5:2];
&&& always @(posedge clk)
&&& {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
&&& //第三级加(第4、5位相加)
&&& thirda=seconda[3:2];&&&& //数据缓存
&&& thirdb=secondb[3:2];
&&& always @(posedge clk)
&&& {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
&&& //第四级加(高两位相加)
&&& endmodule
&&& 【例10.3】两个加法器和一个选择器的实现方式
&& module resource1(sum,a,b,c,d,sel);
&& parameter size=4;
&& output[size:0]
&&& 王金明:《Verilog HDL程序设计教程》
input[size-1:0] a,b,c,d;
reg[size:0]
always @(a or b or c or d or sel)
&&& if(sel)& um=a+b;
&&& else&&& sum=c+d;
【例10.4】两个选择器和一个加法器的实现方式
module resource2(sum,a,b,c,d,sel);
parameter size=4;
output[size-1:0]
input[size-1:0] a,b,c,d;
reg[size-1:0] atemp,
reg[size:0]
always @(a or b or c or d or sel)
&&& if(sel)& egin& atemp=a;& btemp=b;& end
&&& else&&& begin& atemp=c;& btemp=d;& end
&&& sum=atemp+
【例10.5】状态机设计的例子
module FSM(clk,clr,out,start,step2,step3);
input clk,clr,start,step2,step3;
output[2:0]
reg[1:0] state,next_
parameter&&& state0=2'b00,state1=2'b01,
&&& state2=2'b11,state3=2'b10;
&&& /*状态编码,采用格雷(Gray)编码方式*/
always @(posedge clk or posedge clr)&&&&& /*该进程定义起始状态*/
&&& if (clr) state &= state0;
&&& else state &= next_
&&& - 47 - 程序文本
&& always @(state or start or step2 or step3)&&&&& /*该进程实现状态的转换*/
&& case (state)
&&& state0: begin
&&& if (start)& next_state &=state1;
&&& else&&&&& next_state &=state0;
&&& state1: begin
&&& next_state &= state2;
&&& state2: begin
&&& if (step2)& next_state &=state3;
&&& else&&&&& next_state &=state0;
&&& state3: begin
&&& if (step3)& next_state &=state0;
&&& else&&&&& next_state &=state3;
&&& default:&&&& next_state &=state0;&&& /*default语句*/
&&& endcase
&& always @(state)&&&&&& /*该进程定义组合逻辑(FSM的输出)*/
&& case(state)
&&& state0: out=3'b001;
&&& state1: out=3'b010;
&&& state2: out=3'b100;
&&& state3: out=3'b111;
&&& default:out=3'b001;&&&&& /*default语句,避免锁存器的产生*/
&& endcase
&& endmodule
&&& 【例10.6】自动转换量程频率计控制器
&& /*信号定义:
&& clk:&&&& 输入时钟;
&&& 王金明:《Verilog HDL程序设计教程》clear:&&&& 为整个频率计的异步复位信号;
reset:&&&& 用来在量程转换开始时复位计数器;
std_f_sel: 用来选择标准时基;
cntover:&&& 代表超量程;
cntlow:&&&& 代表欠量程。
状态A,B,C,D,E,F采用一位热码编码& */
module control(std_f_sel,reset,clk,clear,cntover,cntlow);
output[1:0] std_f_
input clk,clear,cntover,
reg[1:0] std_f_
reg[5:0] present,&&&& //用于保存当前状态和次态的中间变量parameter start_fl00k=6'b000001,&&&& //状态A编码,采用1位热码
&&& fl00k_cnt=6'b000010,&&&& //状态B
&&& start_fl0k=6'b000100,&&&& //状态C
&&& fl0k_cnt=6'b001000,&&&&& //状态D
&&& start_flk=6'b010000,&&&& //状态E
&&& flk_cnt=6'b100000;&&&& //状态F
always @(posedge clk or posedge clear)
&&& if(clear)&& present&=start_fl0k;&&&& //start_fl0k为起始状态
&&& else&&&&& present&=
always @(present or cntover or cntlow)
&&& case(present)&&&&& //用case语句描述状态转换
&&& start_fl00k:&&& next&=fl00k_
&&& fl00k_cnt:
&&& if(cntlow)& next&=start_fl0k;
&&& else&&&&& next&=fl00k_
&&& start_fl0k:&&&& next&=fl0k_
&&& fl0k_cnt:
&&& if(cntlow)&&&&&& next&=start_
&&& else& if(cntover)&& next&=start_fl00k;
&&& - 49 - 程序文本
&&& else&&&&&& next&=fl0k_
&&& start_flk:&&&& next&=flk_
&&& flk_cnt:
&&& if(cntover)&&&& next&=start_fl0k;
&&& else&&&&&& next&=flk_
&&& default:next&=start_fl0k;&&&&&&& //缺省状态为起始状态
&&& endcase
&& always @(present)&&&& //该进程产生各状态下的输出
&&& case(present)
&&& start_fl00k:&&& begin&& reset=1;& std_f_sel=2'b00;& end
&&& fl00k_cnt:&&&& begin&& reset=0;& std_f_sel=2'b00;& end
&&& start_fl0k:&&&& begin&& reset=1;& std_f_sel=2'b01;& end
&&& fl0k_cnt:&&&& begin&& reset=0;& std_f_sel=2'b01;& end
&&& start_flk:&&&& begin&& reset=1;& std_f_sel=2'b11;& end
&&& flk_cnt:&&&& begin&& reset=0;& std_f_sel=2'b11;& end
&&& default:&&&& begin&& reset=1;& std_f_sel=2'b01;& end
&&& endcase
&& endmodule
&&& 【例10.7】8位全加器
&& module add8(sum,cout,b,a,cin);
&& output[7:0]
&& input[7:0] a,b;
&&& assign {cout,sum}=a+b+
&& endmodule
&&& 【例10.8】8位寄存器
&&& module reg8(qout,in,clk,clear);
&&& output[7:0]
&&& input[7:0]
&&& input clk,
&&& 王金明:《Verilog HDL程序设计教程》reg[7:0]
always @(posedge clk or posedge clear)
&&& if(clear)&& qout=0;&&&& //异步清0
&&& else&&&&&& qout=
【例10.9】累加器顶层连接文本描述
module acc(accout,cout,accin,cin,clk,clear);
output[7:0]
input[7:0]
input cin,clk,
add8 accadd8(sum,cout,accout,accin,cin);&&&& //调用add8子模块
reg8 accreg8(accout,sum,clk,clear);&&&& //调用reg8子模块
【例10.10】用`include描述的累加器
`include “add8.v”;
`include “reg8.v”;
module accn(accout,cout,accin,cin,clk,clear);
output[7:0]
input[7:0]
input cin,clk,
add8 accadd8(sum,cout,accout,accin,cin);&&&& //调用add8子模块
reg8 accreg8(accout,sum,clk,clear);&&&& //调用reg8子模块
【例10.11】阻塞赋值方式描述的移位寄存器1
module block1(Q0,Q1,Q2,Q3,din,clk);
output Q0,Q1,Q2,Q3;
input clk,
&&& - 51 - 程序文本
&&& reg Q0,Q1,Q2,Q3;
&&& always @(posedge clk)
&&& Q3=Q2;&&&&&&&& //注意赋值语句的顺序
&&& Q2=Q1;
&&& Q1=Q0;
&&& endmodule
&&& 【例10.12】阻塞赋值方式描述的移位寄存器2
&&& module block2(Q0,Q1,Q2,Q3,din,clk);
&&& output Q0,Q1,Q2,Q3;
&&& input clk,
&&& reg Q0,Q1,Q2,Q3;
&&& always @(posedge clk)
&&& Q3=Q2;
&&& Q1=Q0;&&&&&&&&&& //该句与下句的顺序与例10.11颠倒
&&& Q2=Q1;
&&& endmodule
&&& 【例10.13】阻塞赋值方式描述的移位寄存器3
&&& module block3(Q0,Q1,Q2,Q3,din,clk);
&&& output Q0,Q1,Q2,Q3;
&&& input clk,
&&& reg Q0,Q1,Q2,Q3;
&&& always @(posedge clk)
&&& Q0=&&&&&& //4条赋值语句的顺序与例10.11完全颠倒
&&& Q1=Q0;
&&& Q2=Q1;
&&& Q3=Q2;
&&& endmodule
&&& 【例10.14】非阻塞赋值方式描述的移位寄存器
&&& module block4(Q0,Q1,Q2,Q3,din,clk);
&&& 王金明:《Verilog HDL程序设计教程》output Q0,Q1,Q2,Q3;
input clk,
reg Q0,Q1,Q2,Q3;
always @(posedge clk)
&&& Q3&=Q2;
&&& Q1&=Q0;
&&& Q2&=Q1;
【例10.15】长帧同步时钟的产生
module longframe1(clk,strb);
parameter delay=8;
&&& if(counter==255)&&& counter=0;
&&& else&&&&& counter=counter+1;
&&& if(counter&=(delay-1))& strb=1;
&&& else&&&&&& strb=0;
【例10.16】引入了D触发器的长帧同步时钟的产生
module longframe2(clk,strb);
parameter delay=8;
&&& - 53 - 程序文本
&&& if(counter==255)&&& counter=0;
&&& else&&&&&& counter=counter+1;
&&& strb=&&&&&&&&& //引入一个触发器
&&& if(counter&=(delay-1))& temp=1;
&&& else&&&&&& temp=0;
&&& endmodule
&&& 【例11.1】数字跑表
&&& /*信号定义:
&&& CLK:&&&& CLK为时钟信号;
&&& CLR:&&&& 为异步复位信号;
&&& PAUSE:&&&& 为暂停信号;
&&& MSH,MSL:& 百分秒的高位和低位;
&&& SH,SL:&&&& 秒信号的高位和低位;
&&& MH,ML:&&&& 分钟信号的高位和低位。 */
&&& module paobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);
&&& input CLK,CLR;
&&& input PAUSE;
&&& output[3:0] MSH,MSL,SH,SL,MH,ML;
&&& reg[3:0] MSH,MSL,SH,SL,MH,ML;
&&& reg cn1,cn2;&&&& //cn1为百分秒向秒的进位,cn2为秒向分的进位
&&& //百分秒计数进程,每计满100,cn1产生一个进位
&&& always @(posedge CLK or posedge CLR)
&&& if(CLR)& begin&&&& //异步复位
&&& {MSH,MSL}&=8'h00;
&&& cn1&=0;
&&& else&&&&& if(!PAUSE)&&&&& //PAUSE为0时正常计数,为1时暂停计数
&&& if(MSL==9)& begin
&&& 王金明:《Verilog HDL程序设计教程》
&&& MSL&=0;
&&& if(MSH==9)
&&& begin& MSH&=0;& cn1&=1;& end
&&& else& MSH&=MSH+1;
&&& else&&&& begin
&&& MSL&=MSL+1;& cn1&=0;
//秒计数进程,每计满60,cn2产生一个进位
always @(posedge cn1 or posedge CLR)
&&& if(CLR)& egin&&&& //异步复位
&&& {SH,SL}&=8'h00;
&&& cn2&=0;
&&& else&&& if(SL==9)&&&& //低位是否为9
&&& SL&=0;
&&& if(SH==5)&& begin& SH&=0;& cn2&=1;& end
&&& else&&&&&& SH&=SH+1;
&&& begin& SL&=SL+1;& cn2&=0;& end
//分钟计数进程,每计满60,系统自动清零
always @(posedge cn2 or posedge CLR)
&&& if(CLR)
&&& begin& {MH,ML}&=8'h00;& end&&&& //异步复位
&&& else& if(ML==9) begin
&&& ML&=0;
&&& if(MH==5)&& MH&=0;
&&& else&&&&&& MH&=MH+1;
&&& else&&& ML&=ML+1;
&&& - 55 - 程序文本
&&& endmodule
&&& 【例11.2】4位数字频率计控制模块
&&& module fre_ctrl(clk,rst,count_en,count_clr,load);
&&& output count_en,count_clr,
&&& input clk,
&&& reg count_en,
&&& always @(posedge clk)
&&& if(rst)& egin& count_en=0;& load=1;& end
&&& else&&& begin
&&& count_en=~count_
&&& load=~count_&&&&& //load信号的产生
&&& assign& count_clr=~clk&&&&&& //count_clr信号的产生
&&& endmodule
&&& 【例11.3】4位数字频率计计数子模块
&&& module count10(out,cout,en,clr,clk);
&&& output[3:0]
&&& input en,clr,
&&& reg[3:0]
&&& always @(posedge clk or posedge clr)
&&& if (clr)& out = 0;&&&& //异步清0
&&& else&& if(en)
&&& if(out==9)& out=0;
&&& else&&&&&& out = out+1;
&&& assign& cout =((out==9)&en)?1:0;&&&& //产生进位信号
&&& endmodule
&&& 【例11.4】频率计锁存器模块
&&& module latch_16(qo,din,load);
&&& output[15:0]
&&& 王金明:《Verilog HDL程序设计教程》input[15:0]
always @(posedge load)
&&& begin& qo=& end
【例11.5】交通灯控制器
/* 信号定义与说明:
CLK:&& 为同步时钟;
EN:&&&& 使能信号,为1的话,则控制器开始工作;
LAMPA: 控制A方向四盏灯的亮灭;其中,LAMPA0~LAMPA3,分别控制A方向的
&&& 左拐灯、绿灯、黄灯和红灯;
LAMPB: 控制B方向四盏灯的亮灭;其中,LAMPB0 ~ LAMPB3,分别控制B方向的
&&& 左拐灯、绿灯、黄灯和红灯;
ACOUNT: 用于A方向灯的时间显示,8位,可驱动两个数码管;
BCOUNT: 用于B方向灯的时间显示,8位,可驱动两个数码管。 */
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT);
output[7:0] ACOUNT,BCOUNT;
output[3:0] LAMPA,LAMPB;
input CLK,EN;
reg[7:0] numa,
reg tempa,
reg[2:0] counta,
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,
reg[3:0] LAMPA,LAMPB;
always @(EN)
&begin&&&&&&&&&&&&&&&&&&&&&& //设置各种灯的计数器的预置数
&&& ared&&& &=8'd55;&&&& //55秒
&&& ayellow &=8'd5;&&&&& //5秒
&&& agreen &=8'd40;&&&& //40秒
&&& aleft&& &=8'd15;&&&& //15秒
&&& bred&&& &=8'd65;&&&& //65秒
&&& byellow &=8'd5;&&&&& //5秒
&&& bleft&& &=8'd15;&&&& //15秒
&&& bgreen &=8'd30;&&&& //30秒
&&& - 57 - 程序文本
&&& assign& ACOUNT=
&&& assign& BCOUNT=
&&& always @(posedge CLK)&&&&&&& //该进程控制A方向的四种灯
&&& if(EN)
&&& if(!tempa)
&&& tempa&=1;
&&& case(counta)&&&&&&&& //控制亮灯的顺序
&&& 0:& begin numa&=&&&& LAMPA&=2; counta&=1; end
&&& 1:& begin numa&=&&& LAMPA&=4; counta&=2; end
&&& 2:& begin numa&=&&&& LAMPA&=1; counta&=3; end
&&& 3:& begin numa&=&&& LAMPA&=4; counta&=4; end
&&& 4:& begin numa&=&&&& LAMPA&=8; counta&=0; end
&&& default:&&&& LAMPA&=8;
&&& endcase
&&& else& begin&&&&&&&&&&&&&& //倒计时
&&& if(numa&1)
&&& if(numa[3:0]==0) begin
&&& numa[3:0]&=4'b1001;
&&& numa[7:4]&=numa[7:4]-1;
&&& else&&&&& numa[3:0]&=numa[3:0]-1;
&&& if (numa==2)& tempa&=0;
&&& else&&& begin
&&& LAMPA&=4'b1000;
&&& counta&=0;&& tempa&=0;
&&& always @(posedge CLK)&&&&&&&&&&& //该进程控制B方向的四种灯
&&& if (EN)
&&& if(!tempb)
&&& 王金明:《Verilog HDL程序设计教程》
&&& tempb&=1;
&&& case (countb)&&&&&&&&&&& //控制亮灯的顺序
&&& 0:& begin numb&=&&&& LAMPB&=8; countb&=1; end
&&& 1:& begin numb&=&&&& LAMPB&=2; countb&=2; end
&&& 2:& begin numb&=&&& LAMPB&=4; countb&=3; end
&&& 3:& begin numb&=&&&& LAMPB&=1; countb&=4; end
&&& 4:& begin numb&=&&& LAMPB&=4; countb&=0; end
&&& default:&&&& LAMPB&=8;
&&& endcase
&&& begin&&&&&&&&&&&&&&&&&&&& //倒计时
&&& if(numb&1)
&&& if(!numb[3:0])&&& begin
&&& numb[3:0]&=9;
&&& numb[7:4]&=numb[7:4]-1;
&&& else&&&&&& numb[3:0]&=numb[3:0]-1;
&&& if(numb==2)& tempb&=0;
&&& else&&& begin
&&& LAMPB&=4'b1000;
&&& tempb&=0;&& countb&=0;
【例11.6】“梁祝”乐曲演奏电路
//信号定义与说明:
//clk_4Hz: 用于控制音长(节拍)的时钟频率;
//clk_6MHz: 用于产生各种音阶频率的基准频率;
//speaker: 用于激励扬声器的输出信号,本例中为方波信号;
//high, med, low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示。module song(clk_6MHz,clk_4Hz,speaker,high,med,low);
input clk_6MHz, clk_4Hz;
output[3:0] high,med,
&&& - 59 - 程序文本
&&& reg[3:0] high,med,
&&& reg[13:0] divider,
&&& reg[7:0]
&&& assign carry=(divider==16383);
&&& always @(posedge clk_6MHz)
&&& begin&& if(carry)& divider=
&&& else&&& divider=divider+1;
&&& always @(posedge carry)
&&& speaker=~&&&&& //2分频产生方波信号
&&& always @(posedge clk_4Hz)
&&& case({high,med,low})&&&&&&&& //分频比预置
&&& 'b: origin=7281;
&&& 'b: origin=8730;
&&& 'b: origin=9565;
&&& 'b: origin=10310;
&&& 'b: origin=10647;
&&& 'b: origin=11272;
&&& 'b: origin=11831;
&&& 'b: origin=12556;
&&& 'b: origin=12974;
&&& 'b: origin=13516;
&&& 'b: origin=16383;
&&& endcase
&&& always @(posedge clk_4Hz)
&&& if(counter==63)& counter=0;&&&&& //计时,以实现循环演奏
&&& else&&&&& counter=counter+1;
&&& case(counter)&&&& //记谱
&&& 王金明:《Verilog HDL程序设计教程》0: {high,med,low}='b;&&&& //低音“3”
1: {high,med,low}='b;&&&& //持续4个时钟节拍2: {high,med,low}='b;
3: {high,med,low}='b;
4: {high,med,low}='b;&&&& //低音“5”
5: {high,med,low}='b;&&&& //发3个时钟节拍
6: {high,med,low}='b;
7: {high,med,low}='b;&&&& //低音“6”
8: {high,med,low}='b;&&&& //中音“1”
9: {high,med,low}='b;&&&& //发3个时钟节拍
10: {high,med,low}='b;
11: {high,med,low}='b;&&&& //中音“2”
12: {high,med,low}='b;&&&& //低音“6”
13: {high,med,low}='b;
14: {high,med,low}='b;
15: {high,med,low}='b;
16: {high,med,low}='b;&&&& //中音“5”
17: {high,med,low}='b;&&&& //发3个时钟节拍
18: {high,med,low}='b;
19: {high,med,low}='b;&&&& //高音“1”
20: {high,med,low}='b;
21: {high,med,low}='b;
22: {high,med,low}='b;
23: {high,med,low}='b;
24: {high,med,low}='b;&&&& //中音“2”
25: {high,med,low}='b;&&&& //持续11个时钟节拍26: {high,med,low}='b;
27: {high,med,low}='b;
28: {high,med,low}='b;
29: {high,med,low}='b;
30: {high,med,low}='b;
31: {high,med,low}='b;
32: {high,med,low}='b;
33: {high,med,low}='b;
34: {high,med,low}='b;
35: {high,med,low}='b;&&&& //中音“3”
36: {high,med,low}='b;&&&& //低音“7”
37: {high,med,low}='b;
&&& - 61 - 程序文本
&&& 38: {high,med,low}='b;&&&& //低音“6”
&&& 39: {high,med,low}='b;
&&& 40: {high,med,low}='b;&&&& //低音“5”
&&& 41: {high,med,low}='b;
&&& 42: {high,med,low}='b;
&&& 43: {high,med,low}='b;&&&& //低音“6”
&&& 44: {high,med,low}='b;&&&& //中音“1”
&&& 45: {high,med,low}='b;
&&& 46: {high,med,low}='b;&&&& //中音“2”
&&& 47: {high,med,low}='b;
&&& 48: {high,med,low}='b;&&&& //低音“3”
&&& 49: {high,med,low}='b;
&&& 50: {high,med,low}='b;&&&& //中音“1”
&&& 51: {high,med,low}='b;
&&& 52: {high,med,low}='b;
&&& 53: {high,med,low}='b;&&&& //低音“5”
&&& 54: {high,med,low}='b;
&&& 55: {high,med,low}='b;&&&& //中音“1”
&&& 56: {high,med,low}='b;&&&& //低音“5”
&&& 57: {high,med,low}='b;&&&& //持续8个时钟节拍
&&& 58: {high,med,low}='b;
&&& 59: {high,med,low}='b;
&&& 60: {high,med,low}='b;
&&& 61: {high,med,low}='b;
&&& 62: {high,med,low}='b;
&&& 63: {high,med,low}='b;
&&& endcase
&&& endmodule
&&& 【例11.7】自动售饮料机
&&& /*信号定义:
&&& clk:&&&& 时钟输入;
&&& reset:&&&&& 为系统复位信号;
&&& half_dollar:&& 代表投入5角硬币;
&&& one_dollar:&&&& 代表投入1元硬币;
&&& half_out:&&&& 表示找零信号;
&&& dispense:&&&& 表示机器售出一瓶饮料;
&&& collect:&&&& 该信号用于提示投币者取走饮料。 */
&&& 王金明:《Verilog HDL程序设计教程》module sell(one_dollar,half_dollar,
&&& collect,half_out,dispense,reset,clk);
parameter idle=0,one=2,half=1,two=3,three=4;
&&& //idle,one,half,two,three为中间状态变量,代表投入币值的几种情况input one_dollar,half_dollar,reset,
output collect,half_out,
reg collect,half_out,
reg[2:0] D;
always @(posedge clk)
&&& if(reset)
&&& dispense=0;&&&& collect=0;
&&& half_out=0;&&&& D=
&&& case(D)
&&& if(half_dollar)& D=
&&& else& if(one_dollar)
&&& if(half_dollar)& D=
&&& else if(one_dollar)
&&& if(half_dollar) D=
&&& else if(one_dollar)
&&& if(half_dollar) D=
&&& else if(one_dollar)
&&& dispense=1;&&&&&&& //售出饮料
&&& collect=1;& D=
&&& three:
&&& if(half_dollar)
&&& dispense=1;&&&&&&&& //售出饮料
&&& - 63 - 程序文本
&&& collect=1;& D=
&&& else if(one_dollar)
&&& dispense=1;&&&&&&&& //售出饮料
&&& collect=1;
&&& half_out=1; D=
&&& endcase
&&& endmodule
&&& 【例11.8】多功能数字钟
&&& /* 信号定义:
&&& clk:&&&& 标准时钟信号,本例中,其频率为4Hz;
&&& clk_1

我要回帖

更多关于 数码管的0变全亮 的文章

 

随机推荐