Verilog HDL编程举例

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1设计示范和上机习题练习一.简单的组合逻辑设计//(方法一)://---------------文件名compare.v-----------------modulecompare(equal,a,b);inputa,b;outputequal;assignequal=(a==b)?1:0;//a等于b时,equal输出为1;a不等于b时,equal输出为0。endmodule//(方法二):modulecompare(equal,a,b);inputa,b;outputequal;regequal;always@(aorb)if(a==b)//a等于b时,equal输出为1;equal=1;else//a不等于b时,equal输出为0。equal=0;//思考:如果不写else部分会产生什么逻辑?2endmodule//-------------------------------------------------------------//----------测试模块源代码(方法之一):`timescale1ns/1ns//定义时间单位。`include./compare.v//包含模块文件。在有的仿真调试环境中并不需要此语句。//而需要从调试环境的菜单中键入有关模块文件的路径和名称modulet;rega,b;wireequal;initial//initial常用于仿真时信号的给出。begina=0;b=0;#100a=0;b=1;#100a=1;b=1;#100a=1;b=0;#100a=0;b=0;#100$stop;//系统任务,暂停仿真以便观察仿真波3形。endcomparem(.equal(equal),.a(a),.b(b));//调用被测试模块t.mendmodule//----------测试模块源代码(方法之二):-------------------------`timescale1ns/1ns//定义时间单位。`include./compare.v//包含模块文件。在有的仿真调试环境中并不需要此语句。//而需要从调试环境的菜单中键入有关模块文件的路径和名称modulet;rega,b;regclock;wireequal;initial//initial常用于仿真时信号的给出。begina=0;4b=0;clock=0;//定义一个时钟变量endalways#50clock=~clock;//产生周期性的时钟always@(posedgeclock)//在每次时钟正跳变沿时刻产生不同的a和bbegina={$random}%2;//每次a是0还是1是随机的。b={$random}%2;//每次b是0还是1是随机的。endinitialbegin#100000$stop;end//系统任务,暂停仿真以便观察仿真波形。comparem(.equal(equal),.a(a),.b(b));//调用被测试模块t.mendmodule56练习二.简单分频时序逻辑电路的设计//-------------------------文件名:half_clk.v--------------------------------modulehalf_clk(reset,clk_in,clk_out);inputclk_in,reset;outputclk_out;regclk_out;always@(posedgeclk_in)beginif(!reset)clk_out=0;elseclk_out=~clk_out;endendmodule//----------测试模块的源代码:------------------------//-------------------文件名top.v-----------------------------`timescale1ns/100ps`defineclk_cycle50moduletop;regclk,reset;7wireclk_out;always#`clk_cycleclk=~clk;//产生测试时钟initialbeginclk=0;reset=1;#10reset=0;#110reset=1;#100000$stop;endhalf_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule8练习三.利用条件语句实现计数分频时序电路//--------------模块源代码:-----------------------------//---------------fdivision.v-----------------------------modulefdivision(RESET,F10M,F500K);inputF10M,RESET;outputF500K;regF500K;reg[7:0]j;always@(posedgeF10M)if(!RESET)//低电平复位。beginF500K=0;j=0;endelsebeginif(j==19)//对计数器进行判断,以确定F500K信号是否反转。beginj=0;9F500K=~F500K;endelsej=j+1;endendmodule//-------------测试模块源代码:-------------------------//---------------fdivision_Top.v------------------------`timescale1ns/100ps`defineclk_cycle50moduledivision_Top;regF10M,RESET;wireF500K_clk;always#`clk_cycleF10M=~F10M;initial10beginRESET=1;F10M=0;#100RESET=0;#100RESET=1;#10000$stop;endfdivisionfdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));endmodule11练习四.阻塞赋值与非阻塞赋值的区别//----------模块源代码:----------------------//-------------blocking.v---------------moduleblocking(clk,a,b,c);output[3:0]b,c;input[3:0]a;inputclk;reg[3:0]b,c;always@(posedgeclk)beginb=a;c=b;$display(Blocking:a=%d,b=%d,c=%d,a,b,c);endendmodule//-------------non_blocking.v-------------------modulenon_blocking(clk,a,b,c);output[3:0]b,c;input[3:0]a;inputclk;12reg[3:0]b,c;always@(posedgeclk)beginb=a;c=b;$display(Non_Blocking:a=%d,b=%d,c=%d,a,b,c);endendmodule//----------测试模块源代码:--------------------------//-------------compareTop.v-----------------------------`timescale1ns/100ps`include./blocking.v`include./non_blocking.vmodulecompareTop;wire[3:0]b1,c1,b2,c2;reg[3:0]a;13regclk;initialbeginclk=0;forever#50clk=~clk;//思考:如果在本句后还有语句,能否执行?为什么?endinitialbegina=4'h3;$display(____________________________);#100a=4'h7;$display(____________________________);#100a=4'hf;$display(____________________________);#100a=4'ha;$display(____________________________);#100a=4'h2;$display(____________________________);#100$display(____________________________);14$stop;endnon_blockingnon_blocking(clk,a,b2,c2);blockingblocking(clk,a,b1,c1);endmodule15练习五.用always块实现较复杂的组合逻辑电路//---------------文件名alu.v--------------------------`defineplus3'd0`defineminus3'd1`defineband3'd2`definebor3'd3`defineunegate3'd4modulealu(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)`plus:out=a+b;//加操作。`minus:out=a-b;//减操作。`band:out=a&b;//求与。16`bor:out=a|b;//求或。`unegate:out=~a;//求反。default:out=8'hx;//未收到指令时,输出任意态。endcaseendendmodule//-----------指令译码器的测试模块源代码:--------------//-------------alutest.v-----------------`timescale1ns/1ns`include./alu.vmodulealutest;wire[7:0]out;reg[7:0]a,b;reg[2:0]opcode;parametertimes=5;initialbegina={$random}%256;//Givearadomnumberblongsto[0,255].b={$random}%256;//Givearadomnumberblongsto17[0,255].opcode=3'h0;repeat(times)begin#100a={$random}%256;//Givearadomnumber.b={$random}%256;//Givearadomnumber.opcode=opcode+1;end#100$stop;endalualu1(out,opcode,a,b);endmodule1819练习六.在VerilogHDL中使用函数//---------------模块源代码:---------------//-----------文件名tryfunct.v--------------------moduletryfunct(clk,n,result,reset);output[31:0]result;input[3:0]n;inputreset,clk;reg[31:0]result;always@(posedgeclk)//clk的上沿触发同步运算。beginif(!reset)//reset为低时复位。result=0;elsebeginresult=n*factorial(n)/((n*2)+1);end//verilog在整数除法运算结果中不考虑余数endfunction[31:0]fac

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功