1、verilog编程151例目录【例 3.1】4 位全加器 5【例 3.2】4 位计数器 5【例 3.3】4 位全加器的仿真程序 5【例 3.4】4 位计数器的仿真程序 6【例 3.5】“与-或-非”门电路 6【例 5.1】用case 语句描述的4 选1 数据选择器 6【例 5.2】同步置数、同步清零的计数器 7【例 5.3】用always 过程语句描述的简单算术逻辑单元 7【例 5.4】用initial 过程语句对测试变量A、B、C 赋值 8【例 5.5】用begin-end 串行块产生信号波形 8【例 5.6】用fork-join 并行块产生信号波形 8【例 5.7】持续赋值方式定义的2 选
2、1 多路选择器 9【例 5.8】阻塞赋值方式定义的2 选1 多路选择器 9【例 5.9】非阻塞赋值 9【例 5.10】阻塞赋值 9【例 5.11】模为60 的BCD 码加法计数器 10【例 5.12】BCD 码七段数码管显示译码器 10【例 5.13】用casez 描述的数据选择器 11【例 5.14】隐含锁存器举例 11【例 5.15】用for 语句描述的七人投票表决器 11【例 5.16】用for 语句实现2 个8 位数相乘 12【例 5.17】用repeat 实现8 位二进制数的乘法 12【例 5.18】同一循环的不同实现方式 13【例 5.19】使用了include 语句的16 位加法
3、器 13【例 5.20】条件编译举例 14【例 6.1】加法计数器中的进程 14【例 6.2】任务举例 14【例 6.3】测试程序 15【例 6.4】函数 16【例 6.5】用函数和case 语句描述的编码器(不含优先顺序) 16【例 6.6】阶乘运算函数 16【例 6.7】测试程序 17【例 6.8】顺序执行模块1 17【例 6.9】顺序执行模块2 18【例 6.10】并行执行模块1 18【例 6.11】并行执行模块2 18【例 7.1】调用门元件实现的4 选1 MUX 19【例 7.2】用case 语句描述的4 选1 MUX 19【例 7.3】行为描述方式实现的4 位计数器 19【例 7.
4、4】数据流方式描述的4 选1 MUX 19【例 7.5】用条件运算符描述的4 选1 MUX 20【例 7.6】门级结构描述的2 选1MUX 20【例 7.7】行为描述的2 选1MUX 20【例 7.8】数据流描述的2 选1MUX 20【例 7.9】调用门元件实现的1 位半加器 20【例 7.10】数据流方式描述的1 位半加器 21【例 7.11】采用行为描述的1 位半加器 21【例 7.12】采用行为描述的1 位半加器 21【例 7.13】调用门元件实现的1 位全加器 21【例 7.14】数据流描述的1 位全加器 22【例 7.15】1 位全加器 22【例 7.16】行为描述的1 位全加器 2
5、2【例 7.17】混合描述的1 位全加器 22【例 7.18】结构描述的4 位级连全加器 23【例 7.19】数据流描述的4 位全加器 23【例 7.20】行为描述的4 位全加器 23【例 8.1】$time 与$realtime 的区别 23【例 8.2】$random 函数的使用 24【例 8.3】1 位全加器进位输出UDP 元件 24【例 8.4】包含x 态输入的1 位全加器进位输出UDP 元件 24【例 8.5】用简缩符“?”表述的1 位全加器进位输出UDP 元件 25【例 8.6】3 选1 多路选择器UDP 元件 25【例 8.7】电平敏感的1 位数据锁存器UDP 元件 26【例 8
6、.8】上升沿触发的D 触发器UDP 元件 26【例 8.9】带异步置1 和异步清零的上升沿触发的D 触发器UDP 元件 27【例 8.12】延迟定义块举例 27【例 8.13】激励波形的描述 27【例 8.15】用always 过程块产生两个时钟信号 28【例 8.17】存储器在仿真程序中的应用 28【例 8.18】8 位乘法器的仿真程序 28【例 8.19】8 位加法器的仿真程序 29【例 8.20】2 选1 多路选择器的仿真 30【例 8.21】8 位计数器的仿真 30【例 9.1】基本门电路的几种描述方法 31【例 9.2】用bufif1 关键字描述的三态门 32【例 9.3】用assi
7、gn 语句描述的三态门 32【例 9.4】三态双向驱动器 32【例 9.5】三态双向驱动器 32【例 9.6】3-8 译码器 33【例 9.7】8-3 优先编码器 33【例 9.8】用函数定义的8-3 优先编码器 33【例 9.9】七段数码管译码器 34【例 9.10】奇偶校验位产生器 34【例 9.11】用if-else 语句描述的4 选1 MUX 35【例 9.12】用case 语句描述的4 选1 MUX 35【例 9.13】用组合电路实现的ROM 35【例 9.14】基本D 触发器 36【例 9.15】带异步清0、异步置1 的D 触发器 36【例 9.16】带同步清0、同步置1 的D 触
8、发器 37【例 9.17】带异步清0、异步置1 的JK 触发器 37【例 9.18】电平敏感的1 位数据锁存器 38【例 9.19】带置位和复位端的1 位数据锁存器 38【例 9.20】8 位数据锁存器 38【例 9.21】8 位数据寄存器 38【例 9.22】8 位移位寄存器 38【例 9.23】可变模加法/减法计数器 39【例 9.24】4 位Johnson 计数器(异步复位) 39【例 9.25】2568 RAM 模块 39【例 9.26】25616 RAM 块 40【例 9.27】4 位串并转换器 40【例 9.28】用函数实现简单的处理器 40【例 9.29】微处理器的测试代码 41
9、【例 9.30】乘累加器(MAC)代码 42【例 9.31】乘累加器的测试代码 43【例 10.1】非流水线方式8 位全加器 43【例 10.2】4 级流水方式的8 位全加器 44【例 10.3】两个加法器和一个选择器的实现方式 45【例 10.4】两个选择器和一个加法器的实现方式 45【例 10.5】状态机设计的例子 45【例 10.6】自动转换量程频率计控制器 46【例 10.7】8 位全加器 48【例 10.8】8 位寄存器 48【例 10.9】累加器顶层连接文本描述 49【例 10.10】用include 描述的累加器 49【例 10.11】阻塞赋值方式描述的移位寄存器1 49【例 1
10、0.12】阻塞赋值方式描述的移位寄存器2 49【例 10.13】阻塞赋值方式描述的移位寄存器3 50【例 10.14】非阻塞赋值方式描述的移位寄存器 50【例 10.15】长帧同步时钟的产生 50【例 10.16】引入了D 触发器的长帧同步时钟的产生 51【例 11.1】数字跑表 51【例 11.2】4 位数字频率计控制模块 53【例 11.3】4 位数字频率计计数子模块 53【例 11.4】频率计锁存器模块 54【例 11.5】交通灯控制器 54【例 11.6】“梁祝”乐曲演奏电路 56【例 11.7】自动售饮料机 59【例 11.8】多功能数字钟 60【例 11.9】电话计费器程序 64【
11、例 12.1】8 位级连加法器 67【例 12.2】8 位并行加法器 67【例 12.3】8 位超前进位加法器 67【例 12.4】8 位并行乘法器 68【例 12.5】44 查找表乘法器 69【例 12.6】8 位加法树乘法器 70【例 12.7】11 阶FIR 数字滤波器 71【例 12.8】16 位高速数字相关器 72【例 12.9】(7,4)线性分组码编码器 73【例 12.10】(7,4)线性分组码译码器 74【例 12.11】(7,4)循环码编码器 74【例 12.12】(7,4)循环码纠错译码器 75【例 12.13】CRC 编码 76王金明:Verilog HDL 程序设计教程
12、- 1 -【例 3.1】4 位全加器module adder4(cout,sum,ina,inb,cin);output3:0 sum;output cout;input3:0 ina,inb;input cin;assign cout,sum=ina+inb+cin;endmodule【例 3.2】4 位计数器module count4(out,reset,clk);output3:0 out;input reset,clk;reg3:0 out;always (posedge clk)beginif (reset) out=0; /同步复位else out=out+1; /计数endend
13、module【例 3.3】4 位全加器的仿真程序timescale 1ns/1nsinclude adder4.vmodule adder_tp; /测试模块的名字reg3:0 a,b; /测试输入信号定义为reg 型reg cin;wire3:0 sum; /测试输出信号定义为wire 型wire cout;integer i,j;adder4 adder(sum,cout,a,b,cin); /调用测试对象always #5 cin=cin; /设定cin 的取值initialbegina=0;b=0;cin=0;for(i=1;i16;i=i+1)#10 a=i; /设定a 的取值end
14、程序文本- 2 -initialbeginfor(j=1;j16;j=j+1)#10 b=j; /设定b 的取值endinitial /定义结果显示格式begin$monitor($time,%d + %d + %b=%b,%d,a,b,cin,cout,sum);#160 $finish;endendmodule【例 3.4】4 位计数器的仿真程序timescale 1ns/1nsinclude count4.vmodule coun4_tp;reg clk,reset; /测试输入信号定义为reg 型wire3:0 out; /测试输出信号定义为wire 型parameter DELY=1
15、00;count4 mycount(out,reset,clk); /调用测试对象always #(DELY/2) clk = clk; /产生时钟波形initialbegin /激励信号定义clk =0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*20) $finish;end/定义结果显示格式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,
16、C,D,F)input A,B,C,D; /模块的输入端口为A,B,C,Doutput F; /模块的输出端口为F王金明:Verilog HDL 程序设计教程- 3 -wire A,B,C,D,F; /定义信号的数据类型assign F= (A&B)|(C&D); /逻辑功能描述endmodule【例 5.1】用case 语句描述的4 选1 数据选择器module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel;reg out;always (in0 or in1 or in2 or i
17、n3 or sel) /敏感信号列表case(sel)2b00: out=in0;2b01: out=in1;2b10: out=in2;2b11: out=in3;default: out=2bx;endcaseendmodule【例 5.2】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output7:0 out;input7:0 data;input load,clk,reset;reg7:0 out;always (posedge clk) /clk 上升沿触发beginif (!reset) out = 8h00; /同步清0,
18、低电平有效else if (load) out = data; /同步预置else out = out + 1; /计数endendmodule【例 5.3】用always 过程语句描述的简单算术逻辑单元define add 3d0define minus 3d1define band 3d2define bor 3d3define bnot 3d4程序文本- 4 -module alu(out,opcode,a,b);output7:0 out;reg7:0 out;input2:0 opcode; /操作码input7:0 a,b; /操作数always(opcode or a or b)
19、 /电平敏感的always 块begincase(opcode)add: out = a+b; /加操作minus: out = a-b; /减操作band: out = a&b; /求与bor: out = a|b; /求或bnot: out=a; /求反default: out=8hx; /未收到指令时,输出任意态endcaseendendmodule【例 5.4】用initial 过程语句对测试变量A、B、C 赋值timescale 1ns/1nsmodule test;reg A,B,C;initialbeginA = 0; B = 1; C = 0;#50 A = 1; B = 0;
20、#50 A = 0; C = 1;#50 B = 1;#50 B = 0; C = 0;#50 $finish ;endendmodule【例 5.5】用begin-end 串行块产生信号波形timescale 10ns/1nsmodule wave1;reg wave;parameter cycle=10;initialbegin王金明:Verilog HDL 程序设计教程- 5 -wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2
21、) $finish ;endinitial $monitor($time,wave=%b,wave);endmodule【例 5.6】用fork-join 并行块产生信号波形timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,wav
22、e=%b,wave);endmodule【例 5.7】持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel=0)?a:b;/持续赋值,如果sel 为0,则out=a ;否则out=bendmodule【例 5.8】阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);input a,b,sel;程序文本- 6 -output out;reg out;always(a or b or sel)beginif(sel=0) out=a;
23、/阻塞赋值else out=b;endendmodule【例 5.9】非阻塞赋值module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmodule【例 5.10】阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmodule【例 5.11】模为60 的BCD 码加法计数器module count60(qout,
24、cout,data,load,cin,reset,clk);output7:0 qout;output cout;input7:0 data;input load,cin,clk,reset;reg7:0 qout;always (posedge clk) /clk 上升沿时刻计数王金明:Verilog HDL 程序设计教程- 7 -beginif (reset) qout=0; /同步复位else if(load) qout=data; /同步置数else if(cin)beginif(qout3:0=9) /低位是否为9,是则beginqout3:0=0; /回0,并判断高位是否为5if
25、(qout7:4=5) qout7:4=0;elseqout7:4=qout7:4+1; /高位不为5,则加1endelse /低位不为9,则加1qout3:0=qout3:0+1;endendassign cout=(qout=8h59)&cin)?1:0; /产生进位输出信号endmodule【例 5.12】BCD 码七段数码管显示译码器module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec;reg6:0 decodeout;always (indec)begincase(indec) /用case 语句进行
26、译码4d0:decodeout=7b1111110;4d1:decodeout=7b0110000;4d2:decodeout=7b1101101;4d3:decodeout=7b1111001;4d4:decodeout=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default: decodeout=7bx;endcaseend程序文本- 8 -endmodule【例 5.13
27、】用casez 描述的数据选择器module mux_casez(out,a,b,c,d,select);output out;input a,b,c,d;input3:0 select;reg out;always (select or a or b or c or d)begincasez(select)4b?1: out = a;4b?1?: out = b;4b?1?: out = c;4b1?: out = d;endcaseendendmodule【例 5.14】隐含锁存器举例module buried_ff(c,b,a);output c;input b,a;reg c;alwa
28、ys (a or b)beginif(b=1)&(a=1) c=a&b;endendmodule【例 5.15】用for 语句描述的七人投票表决器module voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum;integer i;reg pass;always (vote)beginsum=0;王金明:Verilog HDL 程序设计教程- 9 -for(i=0;i=6;i=i+1) /for 语句if(votei) sum=sum+1;if(sum2) pass=1; /若超过4 人赞成,则pass=1else pass=0;end
29、endmodule【例 5.16】用for 语句实现2 个8 位数相乘module mult_for(outcome,a,b);parameter size=8;inputsize:1 a,b; /两个操作数output2*size:1 outcome; /结果reg2*size:1 outcome;integer i;always (a or b)beginoutcome=0;for(i=1; i=size; i=i+1) /for 语句if(bi) outcome=outcome +(a (i-1);endendmodule【例 5.17】用repeat 实现8 位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;inputsize:1 a
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1