资源描述:
《第11讲 verilog数字电路设计ii课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在系统可编程技术第11讲Verilog数字电路设计II第9章Verilog数字电路设计9.3乘累加器9.4奇数分频与小数分频在本节中,设计实现一个简单的乘累加器。9.4乘累加器返回例9.8乘累加器的代码moduleMAC(out,opa,opb,clk,clr);output[15:0]out;input[7:0]opa,opb;inputclk,clr;wire[15:0]sum;reg[15:0]out;function[15:0]mult;//函数定义,mult完成乘法操作input[7:0]opa,opb;reg[15:0]result;int
2、egeri;beginresult=opa[0]?opb:0;for(i=1;i<=7;i=i+1)beginif(opa[i]==1)result=result+(opb<<(i-1));endmult=result;endendfunctionassignsum=mult(opa,opb)+out;always@(posedgeclkorposedgeclr)beginif(clr)out<=0;elseout<=sum;endendmodule例9.30测试代码'timescale1ns/1ns`include"mac.v"modulemac_t
3、p;reg[7:0]opa,opb;//测试输入信号用reg型变量regclr,clk;wire[15:0]out;//测试输出信号用wire型变量parameterDELY=100;MACm1(out,opa,opb,clk,clr);always#(DELY)clk=~clk;//产生时钟信号initialbeginclr=1;clk=0;opa=8'd0;opb=8'd0;#DELYclr=0;opa=8'd1;opb=8'd10;#DELYopa=8'd2;opb=8'd10;#DELYopa=8'd3;opb=8'd10;#DELYopa=8
4、'd4;opb=8'd10;#DELYopa=8'd5;opb=8'd10;#DELYopa=8'd6;opb=8'd10;#DELYopa=8'd7;opb=8'd10;#DELYopa=8'd8;opb=8'd10;#DELYopa=8'd9;opb=8'd10;#DELYopa=8'd10;opb=8'd10;#DELY$finish;endinitial$monitor($time,,,"clr=%bopa=%dopb=%dout=%d",clr,opa,opb,out);endmodule9.4.1奇数分频在实际中有时需要进行奇数次分频,并且
5、还要得到占空比为50%的方波波形,如果是偶数次分频,比较简单,只需要进行2N次分频,在计数到N-1(从0开始计数),波形翻转,就可以得到占空比为50%的方波波形。或者在最后一级加一个2分频器也可实现。奇数次分频采用下面的方法:用两个计数器,一个由输入时钟的上升沿触发,另一个由输入时钟的下降沿触发,最后将两个计数器的输出相或,即可得到占空比为50%的方波波形。9.4奇数分频和小数分频返回例9.10占空比为50%的奇数分频(模7)modulecount7(RESET,CLK,COUT);inputCLK,RESET;outputCOUT;reg[2:0]m
6、,n;wireCOUT;regCOUT1,COUT2;assignCOUT=COUT1
7、COUT2;always@(posedgeCLK)beginif(!RESET)beginCOUT1<=0;m<=0;endelseif(RESET)beginif(m==6)beginm<=0;endelsem<=m+1;if(m==2)COUT1=~COUT1;elseif(m==5)COUT1=~COUT1;endendalways@(negedgeCLK)beginif(!RESET)beginCOUT2<=0;n<=0;endelseif(RESET)be
8、ginif(n==6)beginn<=0;endelsen<=n+1;if(n==2)COUT2=~COUT2;elseif(n==5)COUT2=~COUT2;endendendmodule图9.11模7奇数分频器功能仿真波形图例9.11占空比为50%的奇数分频(模13)modulecount13(RESET,CLK,COUT);inputCLK,RESET;outputCOUT;reg[3:0]m,n;wireCOUT;regCOUT1,COUT2;assignCOUT=COUT1
9、COUT2;always@(posedgeCLK)beginif(
10、!RESET)beginCOUT1<=0;m<=0;endelseif(RESET)begin