VerilogHDL程序设计教程例子程例子.docx

上传人:b****3 文档编号:3704422 上传时间:2022-11-24 格式:DOCX 页数:7 大小:21.04KB
下载 相关 举报
VerilogHDL程序设计教程例子程例子.docx_第1页
第1页 / 共7页
VerilogHDL程序设计教程例子程例子.docx_第2页
第2页 / 共7页
VerilogHDL程序设计教程例子程例子.docx_第3页
第3页 / 共7页
VerilogHDL程序设计教程例子程例子.docx_第4页
第4页 / 共7页
VerilogHDL程序设计教程例子程例子.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

VerilogHDL程序设计教程例子程例子.docx

《VerilogHDL程序设计教程例子程例子.docx》由会员分享,可在线阅读,更多相关《VerilogHDL程序设计教程例子程例子.docx(7页珍藏版)》请在冰豆网上搜索。

VerilogHDL程序设计教程例子程例子.docx

VerilogHDL程序设计教程例子程例子

王金明:

《VerilogHDL程序设计教程》【例3.1】4位全加器moduleadder4(cout,sum,ina,inb,cin);output[3:

0]sum;outputcout;input[3:

0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;endmodule【例3.2】4位计数器modulecount4(out,reset,clk);output[3:

0]out;inputreset,clk;reg[3:

0]out;always@(posedgeclk)beginif(reset)out<=0;//同步复位elseout<=out+1;//计数endendmodule【例3.3】4位全加器的仿真程序`timescale1ns/1ns`include"adder4.v"moduleadder_tp;//模块的名字reg[3:

0]a,b;//测试输入信号定义为reg型regcin;wire[3:

0]sum;//测试输出信号定义为wire型wirecout;integeri,j;adder4adder(sum,cout,a,b,cin);//调用测试对象always#5cin=~cin;//设定cin的取值initialbegina=0;b=0;cin=0;for(i=1;i<16;i=i+1)#10a=i;//设定a的取值end程序文本-2-initialbeginfor(j=1;j<16;j=j+1)#10b=j;//设定b的取值endinitial//定义结果显示格式begin$monitor($time,,,"%d+%d+%b={%b,%d}",a,b,cin,cout,sum);#160$finish;endendmodule【例3.4】4位计数器的仿真程序`timescale1ns/1ns`include"count4.v"modulecoun4_tp;regclk,reset;//测试输入信号定义为reg型wire[3:

0]out;//测试输出信号定义为wire型parameterDELY=100;count4mycount(out,reset,clk);//调用测试对象always#(DELY/2)clk=~clk;//产生时钟波形initialbegin//激励信号定义clk=0;reset=0;#DELYreset=1;#DELYreset=0;#(DELY*20)$finish;end//定义结果显示格式initial$monitor($time,,,"clk=%dreset=%dout=%d",clk,reset,out);endmodule【例3.5】“与-或-非”门电路moduleAOI(A,B,C,D,F);//模块名为AOI(端口列表A,B,C,D,F)inputA,B,C,D;//模块的输入端口为A,B,C,DoutputF;//模块的输出端口为F王金明:

《VerilogHDL程序设计教程》-3-wireA,B,C,D,F;//定义信号的数据类型assignF=~((A&B)|(C&D));//逻辑功能描述endmodule【例5.1】用case语句描述的4选1数据选择器modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:

0]sel;regout;always@(in0orin1orin2orin3orsel)//敏感信号列表case(sel)2'b00:

out=in0;2'b01:

out=in1;2'b10:

out=in2;2'b11:

out=in3;default:

out=2'bx;endcaseendmodule【例5.2】同步置数、同步清零的计数器modulecount(out,data,load,reset,clk);output[7:

0]out;input[7:

0]data;inputload,clk,reset;reg[7:

0]out;always@(posedgeclk)//clk上升沿触发beginif(!

reset)out=8'h00;//同步清0,低电平有效elseif(load)out=data;//同步预置elseout=out+1;//计数endendmodule【例5.3】用always过程语句描述的简单算术逻辑单元`defineadd3'd0`defineminus3'd1`defineband3'd2`definebor3'd3`definebnot3'd4程序文本-4-modulealu(out,opcode,a,b);output[7:

0]out;reg[7:

0]out;input[2:

0]opcode;//操作码input[7:

0]a,b;//操作数always@(opcodeoraorb)//电平敏感的always块begincase(opcode)`add:

out=a+b;//加操作`minus:

out=a-b;//减操作`band:

out=a&b;//求与`bor:

out=a|b;//求或`bnot:

out=~a;//求反default:

out=8'hx;//未收到指令时,输出任意态endcaseendendmodule【例5.4】用initial过程语句对测试变量A、B、C赋值`timescale1ns/1nsmoduletest;regA,B,C;initialbeginA=0;B=1;C=0;#50A=1;B=0;#50A=0;C=1;#50B=1;#50B=0;C=0;#50$finish;endendmodule【例5.5】用begin-end串行块产生信号波形`timescale10ns/1nsmodulewave1;regwave;parametercycle=10;initialbegin王金明:

《VerilogHDL程序设计教程》-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)$finish;endinitial$monitor($time,,,"wave=%b",wave);endmodule【例5.6】用fork-join并行块产生信号波形`timescale10ns/1nsmodulewave2;regwave;parametercycle=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,,,"wave=%b",wave);endmodule【例5.7】持续赋值方式定义的2选1多路选择器moduleMUX21_1(out,a,b,sel);inputa,b,sel;outputout;assignout=(sel==0)?

a:

b;//持续赋值,如果sel为0,则out=a;否则out=bendmodule【例5.8】阻塞赋值方式定义的2选1多路选择器moduleMUX21_2(out,a,b,sel);inputa,b,sel;程序文本-6-outputout;regout;always@(aorborsel)beginif(sel==0)out=a;//阻塞赋值elseout=b;endendmodule【例5.9】非阻塞赋值modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb<=a;c<=b;endendmodule【例5.10】阻塞赋值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb=a;c=b;endendmodule【例5.11】模为60的BCD码加法计数器modulecount60(qout,cout,data,load,cin,reset,clk);output[7:

0]qout;outputcout;input[7:

0]data;inputload,cin,clk,reset;reg[7:

0]qout;always@(posedgeclk)//clk上升沿时刻计数王金明:

《VerilogHDL程序设计教程》-7-beginif(reset)qout<=0;//同步复位elseif(load)qout<=data;//同步置数elseif(cin)beginif(qout[3:

0]==9)//低位是否为9,是则beginqout[3:

0]<=0;//回0,并判断高位是否为5if(qout[7:

4]==5)qout[7:

4]<=0;elseqout[7:

4]<=qout[7:

4]+1;//高位不为5,则加1endelse//低位不为9,则加1qout[3:

0]<=qout[3:

0]+1;endendassigncout=((qout==8'h59)&cin)?

1:

0;//产生进位输出信号endmodule【例5.12】BCD码—七段数码管显示译码器moduledecode4_7(decodeout,indec);output[6:

0]decodeout;input[3:

0]indec;reg[6:

0]decodeout;always@(indec)begincase(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'bx;endcaseend程序文本-8-endmodule【例5.13】用casez描述的数据选择器modulemux_casez(out,a,b,c,d,select);outputout;inputa,b,c,d;input[3:

0]select;regout;always@(selectoraorborcord)begincasez(select)4'b?

?

?

1:

out=a;4'b?

?

1?

:

out=b;4'b?

1?

?

:

out=c;4'b1?

?

?

:

out=d;endcaseendendmodule【例5.14】隐含锁存器举例moduleburied_ff(c,b,a);outputc;inputb,a;regc;always@(aorb)beginif((b==1)&&(a==1))c=a&b;endendmodule【例5.15】用for语句描述的七人投票表决器modulevoter7(pass,vote);outputpass;input[6:

0]vote;reg[2:

0]sum;integeri;regpass;always@(vote)beginsum=0;王金明:

《VerilogHDL程序设计教程》-9-for(i=0;i<=6;i=i+1)//for语句if(vote[i])sum=sum+1;if(sum[2])pass=1;//若超过4人赞成,则pass=1elsepass=0;endendmodule【例5.16】用for语句实现2个8位数相乘modulemult_for(outcome,a,b);parametersize=8;input[size:

1]a,b;//两个操作数output[2*size:

1]outcome;//结果reg[2*size:

1]outcome;integeri;always@(aorb)beginoutcome=0;for(i=1;i<=size;i=i+1)//for语句if(b[i])outcome=outcome+(a<<(i-1));endendmodule【例5.17】用repeat实现8位二进制数的乘法modulemult_repeat(outcome,a,b);parametersize=8;input[size:

1]a,b;output[2*size:

1]outcome;reg[2*size:

1]temp_a,outcome;reg[size:

1]temp_b;always@(aorb)beginoutcome=0;temp_a=a;temp_b=b;repeat(size)//repeat语句,size为循环次数beginif(temp_b[1])//如果temp_b的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a<<1;//操作数a左移一位程序文本-10-temp_b=temp_b>>1;//操作数b右移一位endendendmodule【例5.18】同一循环的不同实现方式moduleloop1;//方式1integeri;initialfor(i=0;i<4;i=i+1)//for语句begin$display(“i=%h”,i);endendmodulemoduleloop2;//方式2integeri;initialbegini=0;while(i<4)//while语句begin$display("i=%h",i);i=i+1;endendendmodulemoduleloop3;//方式3integeri;initialbegini=0;repeat(4)//repeat语句begin$display("i=%h",i);i=i+1;endendendmodule【例5.19】使用了`include语句的16位加法器王金明:

《VerilogHDL程序设计教程》-11-`include"adder.v"moduleadder16(cout,sum,a,b,cin);outputcout;parametermy_size=16;output[my_size-1:

0]sum;input[my_size-1:

0]a,b;inputcin;addermy_adder(cout,sum,a,b,cin);//调用adder模块endmodule//下面是adder模块代码moduleadder(cout,sum,a,b,cin);parametersize=16;outputcout;output[size-1:

0]sum;inputcin;input[size-1:

0]a,b;assign{cout,sum}=a+b+cin;endmodule【例5.20】条件编译举例modulecompile(out,A,B);outputout;inputA,B;`ifdefadd//宏名为addassignout=A+B;`elseassignout=A-B;`endifendmodule【例6.1】加法计数器中的进程modulecount(data,clk,reset,load,cout,qout);outputcout;output[3:

0]qout;reg[3:

0]qout;input[3:

0]data;inputclk,reset,load;程序文本-12-always@(posedgeclk)//进程1,always过程块beginif(!

reset)qout=4'h00;//同步清0,低电平有效elseif(load)qout=data;//同步预置elseqout=qout+1;//加法计数endassigncout=(qout==4'hf)?

1:

0;//进程2,用持续赋值产生进位信号endmodule【例6.2】任务举例modulealutask(code,a,b,c);input[1:

0]code;input[3:

0]a,b;output[4:

0]c;reg[4:

0]c;taskmy_and;//任务定义,注意无端口列表input[3:

0]a,b;//a,b,out名称的作用域范围为task任务内部output[4:

0]out;integeri;beginfor(i=3;i>=0;i=i-1)out[i]=a[i]&b[i];//按位与endendtaskalways@(codeoraorb)begincase(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;//相加endcaseendendmodule王金明:

《VerilogHDL程序设计教程》-13-【例6.3】测试程序`include"alutask.v"modulealu_tp;reg[3:

0]a,b;reg[1:

0]code;wire[4:

0]c;parameterDELY=100;alutaskADD(code,a,b,c);//调用被测试模块initialbegincode=4'd0;a=4'b0000;b=4'b1111;#DELYcode=4'd0;a=4'b0111;b=4'b1101;#DELYcode=4'd1;a=4'b0001;b=4'b0011;#DELYcode=4'd2;a=4'b1001;b=4'b0011;#DELYcode=4'd3;a=4'b0011;b=4'b0001;#DELYcode=4'd3;a=4'b0111;b=4'b1001;#DELY$finish;endinitial$monitor($time,,,"code=%ba=%bb=%bc=%b",code,a,b,c);endmodule【例6.4】函数function[7:

0]get0;input[7:

0]x;reg[7:

0]count;integeri;begincount=0;for(i=0;i<=7;i=i+1)if(x[i]=1'b0)count=count+1;get0=count;endendfunction【例6.5】用函数和case语句描述的编码器(不含优先顺序)modulecode_83(din,dout);input[7:

0]din;output[2:

0]dout;程序文本-14-function[2:

0]code;//函数定义input[7:

0]din;//函数只有输入,输出为函数名本身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'b0000_001x:

code=3'h1;8'b0000_000x:

code=3'h0;default:

code=3'hx;endcaseendfunctionassigndout=code(din);//函数调用endmodule【例6.6】阶乘运算函数modulefunct(clk,n,result,reset);output[31:

0]result;input[3:

0]n;inputreset,clk;reg[31:

0]result;always@(posedgeclk)//在clk的上升沿时执行运算beginif(!

reset)result<=0;//复位elsebeginresult<=2*factorial(n);//调用factorial函数endendfunction[31:

0]factorial;//阶乘运算函数定义(注意无端口列表)input[3:

0]opa;//函数只能定义输入端,输出端口为函数名本身reg[3:

0]i;beginfactorial=opa?

1:

0;for(i=2;i<=opa;i=i+1)//该句若要综合通过,opa应赋具体的数值factorial=i*factorial;//阶乘运算end王金明:

《VerilogHDL程序设计教程》-15-endfunctionendmodule【例6.7】测试程序`defineclk_cycle50`include"funct.v"modulefunct_tp;reg[3:

0]n;regreset,clk;wire[31:

0]result;initial//定义激励向量beginn=0;reset=1;clk=0;for(n=0;n<=15;n=n+1)#100n=n;endinitial$monitor($time,,,"n=%dresult=%d",n,result);//定义输出显示格式always#`clk_cycleclk=~clk;//产生时钟信号functfunct_try(.clk(clk),.n(n),.result(result),.reset(reset));//调用被测试模块endmodule【例6.8】顺序执行模块1moduleserial1(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)beginq=~q;a=~q;endendmodule【例6.9】顺序执行模块2moduleserial2(q,a,clk);outputq,a;程序文本-16-inputclk;regq,a;always@(posedgeclk)begina=~q;q=~q;endendmodule【例6.10】并行执行模块1m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1