资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 Verilog HDL常用电路设计,4.1 常用组合逻辑电路设计,4.2 常用时序逻辑电路设计,4.3 小结,在线教务辅导网: :/,教材其余课件及动画素材请查阅在线教务辅导网,QQ:,349134187,或者直接输入下面地址:,4.1 常用组合逻辑电路设计,1 数据选择器,2 译码器,3 加法器,4 乘法器,5 比较器,6 ALU,7 三态总线,4.1 常用组合逻辑电路设计,数据选择器,【例4-1】 参数型n位,mx1数据选择器,module multiplexer_N( X1,X2,X3,X4, sel,Y);,parameter N=8; /该参数定义了一个8位的4选一多路选择器,inputN-1: 0 X1,X2,X3,X4;,input1:0 sel;,output reg N-1: 0 Y;,always (sel,X1,X2,X3,X4),case(sel),2b00: Y = X1;,2b01: Y = X2;,2b10: Y = X3;,2b11: Y = X4;,endcase,endmodule,译码器,【例4-2】 参数型log nxn译码器,module decode_N( sel, Y);,parameter N=4; /该参数定义了一个4输出4位的译码器,input1:0 sel; /此参数为2位,通过计算log4=2得到,可得到4输出译码器,output reg N-1: 0 Y;,always (sel),case(sel),2b00: Y = 4b0001;,2b01: Y = 4b0010;,2b10: Y = 4b0100;,2b11: Y = 4b1000;,endcase,endmodule,加法器,【例4-3】 参数型N位加法器,module add_N( X, Y, sum, co);,parameter N=8;,input N-1: 0 X, Y;,output N-1: 0 sum;,output co;,assign co, sum = X + Y;,endmodule,乘法器,【例4-4】 参数型N位乘法器,module mul_N( X, Y, mul);,parameter N=8;,input N-1: 0 X, Y;,output 2*N-1: 0 mul;,assign mul = X * Y;,endmodule,比较器,【例4-5】 参数型N位比较器,module compare_N( X, Y, X_gt_Y, X_eq_Y, X_lt_Y);,parameter N=8; /参与比较的数的位数为8,input N-1: 0 X, Y;,output reg X_gt_Y, X_eq_Y, X_lt_Y;,always (X,Y),if(XY),begin X_gt_Y=1;X_eq_Y=0; X_lt_Y=0; end,else if(X=Y),begin X_gt_Y=0;X_eq_Y=1; X_lt_Y=0; end,else,begin X_gt_Y=0;X_eq_Y=0; X_lt_Y=1; end,endmodule,ALU,【例4-6】 参数型n位,m功能ALU,module alu_N(X, Y, sel,result);,parameter N=8;,input2:0 sel; /3位可定义m=8功能,input N-1: 0 X, Y;,output regN-1: 0 result;,always (X, Y, sel),begin,case(sel),3b000: result=X+Y; /加法,3b001: result=X-Y; /减法,3b010: result=X1; /右移1位,3b100: result=X /相与,3b101: result=XY; /异或,3b110: result=X; /求反,3b111: result=X; /直通,endcase,end,endmodule,sel输入,操作,说明,000,result=X+Y,加法,001,result=X-Y,减法,010,result=X1,右移1位,100,result=X&Y,相与,101,result=XY,异或,110,result=X,求反,111,result=X,直通,三态总线,【例4-7】三态门设计,module tri_s(enable,datain,dataout);,parameter N=8;,input enable;,inputN-1:0 datain;,output regN-1:0 dataout;,always (enable,datain),if(enable=1) dataout=datain;,else dataout=bz;,endmodule,三态总线,【例4-8】N位4通道的三态总线驱动器,module tri_bus(input3,input2,input1,input0,enable,out);,parameter N=8;,inputN-1:0 input3,input2,input1,input0;,input1:0 enable;,output regN-1:0 out;,always (enable,input3,input2,input1,input0),begin,if(enable=2b00) out=input3;,else out=bz;,if(enable=2b01) out=input2;,else out=bz;,if(enable=2b10) out=input1;,else out=bz;,if(enable=2b11) out=input0;,else out=bz;,end,endmodule,三态总线,【例4-9】N位4通道的三态总线驱动器实现方法1,module tri_bus_2(input3,input2,input1,input0,enable,out);,parameter N=8;,inputN-1:0 input3,input2,input1,input0;,input1:0 enable;,outputN-1:0 out;,assign out=(enable=2b00)? input3:bz,out=(enable=2b01)? input2:bz,out=(enable=2b10)? input1:bz,out=(enable=2b11)? input0:bz;,endmodule,三态总线,【例4-10】N位4通道的三态总线驱动器实现方法2,module tri_bus_3(input3,input2,input1,input0,enable,out);,parameter N=8;,inputN-1:0 input3,input2,input1,input0;,input1:0 enable;,output regN-1:0 out;,always (enable,input3,input2,input1,input0),begin,if(enable=2b00) out=input3;,else out=bz;,end,always (enable,input3,input2,input1,input0),begin,if(enable=2b01) out=input2;,else out=bz;,end,always (enable,input3,input2,input1,input0),begin,if(enable=2b10) out=input1;,else out=bz;,end,always (enable,input3,input2,input1,input0),begin,if(enable=2b11) out=input0;,else out=bz;,end,endmodule,4.2 常用时序逻辑电路设计,1 D触发器和锁存器,2 存放器,3 移位存放器,4计数器,5分频器,6程序存储器 ROM,7数据存储器 RAM,4.2 常用时序逻辑电路设计,D触发器和锁存器,【例4-12】 一位D触发器,实现方式一:,module my_dff(clk, d, q);,input clk;,input d;,output reg q;,always (posedge clk),q = d;,endmodule,存放器,【例4-13】 参数型n位存放器,1一般存放器,module regx(clk, d, q);,parameter N=8;,input clk;,inputN-1:0 d;,output regN-1:0 q;,always (posedge clk),q = d;,endmodule,存放器,2同步复位,,同步置数,异步使能的存放器,module register_N_0(D, Q, data,en,load,reset,clk);,parameter N=8;,input en,load,reset,clk;,input N-1: 0 D,data;,output regN-1: 0 Q;,regN-1: 0 temp;,always (posedge clk) /同步复位,begin,if(reset) temp=0;,else if(load) temp=data;,else temp=D;,end,always (temp,en) /异步使能,begin,if(en) Q=temp;,else Q = bz;,end,endmodule,移位存放器,【例4-14】 参数型n位移位存放器,/8位CPU中常用的移位存放器模块,module shift_N(clk,Ci,mode,D,Q,Co);,input clk,Ci; /时钟和移位输入,input2:0 mode; /移位模式控制字,inputN-1:0 D; /待加载移位的数据,outputN-1:0 Q; /移位数据输出,output reg Co ; /移位输出,regN-1:0 temp;,parameter N=8; /8位移位存放器,always (posedge clk),begin,case(mode),3b000: begin temp = D; end / 加载待移数,3b001: begin temp0 = Ci ;,tempN-1:1 = tempN-2:0; Co=tempN-1; /带进位循环左移,end,3b010: begin temp0 = tempN-1;,tempN-1:1 = tempN-2:0; / 自循环左移,end,3b011: begin tempN-1 = temp0;,tempN-2:0 = tempN-1:1; / 自循环右移,end,3b100: begin tempN-1 = Ci ;,tempN-2:0 = tempN-1:1; Co=temp0; /带进位循环右移,end,default: temp = temp ; / 保持,endcase,end,assign Q = temp; /移位后输出,endmodule,计数器,【例4-15】 参数型n位计数器:带有异步复位和同步时钟使能,module cnt_N(clk,rst,en,Q,cout);,input clk,rst,en;,output regN-1:0 Q;,output cout;,parameter N=4;,always (posedge rst, posedge clk),begin,if(rst) /计数器异步复位,Q = 0; /为了能生成诸如触发器一类的时序逻辑,建议使用非阻塞赋值,else,if(en) /计数器同步使能,Q = Q + 1;,end,assign cout= (Q=0)? 1b1:1b0; /计数器满溢出后cout输出1,endmodule,计数器,【例4-16】十进制加法计数器:带有异步复位和同步时钟使能功能,module cnt10(clk,rst,en,Q,cout);,input clk,rst,en;,output regN-1:0 Q;,output cout;,parameter N=4;,always (posedge rst, posedge clk),begin,if(rst) /计数器异步复位,Q = 0; /为了能生成诸如触发器一类的时序逻辑,建议使用非阻塞赋值,else,if(en) /计数器同步使能,if(Q=9) Q = 0;,else Q = Q + 1;,end,assign cout= (Q=0)? 1b1:1b0; /计数器满溢出后cout输出1,endmodule,分频器,【例4-17】 参数型,2n,分频,占空比为50%,module divf_2powN(rst,clk,en,clk_N);,input rst,clk,en;,output clk_N;,parameter N=2;,regN-1:0 count;,always (posedge clk),begin,if(rst) count=0;,else if(en) count=count+1;,end,assign clk_N=countN-1;,endmodule,分频器,【例4-18】 参数型奇数分频,要求占空比为50%,module,divf_oddn(clk,clk_N);,input clk;,output clk_N;,parameter N=3;,integer p,q;,reg clk_p,clk_q;,always (posedge clk) /N分频设计例,体会其算法(占空比50%),begin,if(p=N-1),begin p=0; clk_p=clk_p; end,else p=p+1;,end,always (negedge clk),begin,if(q=N-1) q=0;,else q=q+1;,if(p=(N-1)/2) clk_q=clk_q;,end,assign clk_N=clk_pclk_q;,endmodule,分频器,【例4-19】 参数型偶数分频,要求占空比为50%,module divf_even(clk,clk_N);,input clk;,output reg clk_N;,parameter N=6;,integer p;,always (posedge clk),begin,if(p=N/2-1) begin p=0; clk_N=clk_N; end,else p=p+1;,end,endmodule,分频器,【例4-20】 可设置参数的任意分频器:占空比可变,module divf_parameter(rst,clk,en,clkout);,input rst,clk,en;,output clkout;,integer temp; /最大值为2的32次方,parameter N=7,M=3; /N为分频系数,M/N为占空比,always (posedge clk),begin,if(rst) temp=0;,else if(en),if(temp=N-1) temp=0;,else temp=temp+1;,end,assign clkout=(tempM)? 1 : 0;,endmodule,程序存储器 ROM,【例4-21】 参数型ROM设计,module rom_nxm(rom_data,rom_addr,clk,rd,load);,parameter M=8,N=4; /4根地址线,8位数据,input clk,rd; /rd读使能信号,input load; /用于初始化ROM值的控制信号,inputN-1:0 rom_addr;,output regM-1:0 rom_data;,regM-1:0 memory0:2*N; /4根地址线,8位数据的存储器,always (posedge load),begin: init /该always块用于初始化ROM值,integer i;,for(i=0;i(2*N);i=i+1),memoryi = i+1;,end,always (posedge clk),begin: read /该always块用于读取ROM值,if(rd) rom_data=memoryrom_addr;,end,endmodule,数据存储器 RAM,【例4-22】 参数型RAM设计,module ram_nxm(rd,wr,cs,clk,addr,datain,dataout);,parameter M=8,N=5; /5根地址线,8位数据,input rd,wr,cs,clk;,inputN-1:0 addr;,inputM-1:0 datain;,outputM-1:0 dataout;,regM-1:0 memory0:2*N; /5根地址线,12位数据的存储器,regM-1:0 temp;,assign dataout=temp;,always (posedge clk),begin:p0,if(cs),if(rd) temp=memoryaddr;,else begin,if(wr) memoryaddr=datain;,temp=bz;,end,end,endmodule,4.3 小结,在本章,我们讨论了以下知识点:,理论上,可利用化简真值表并采用逻辑门来实现电路的方法,来设计所有组合电路,但用这种方法来设计大型电路是不现实的。降低复杂度的一种方法就是采用比逻辑门功能更强大的组合元件。本章对组合元件及常用的组合逻辑电路进行了建模。,常用的组合元件及组合逻辑电路包括:数据选择器、译码器、加法器、乘法器、比较器、ALU、三态总线等等。本章采用参数化的建模方法建模,很容易对这些电路进行扩展修改。,就象使用较抽象的组合元件来实现复杂的组合逻辑一样,也可以使用较抽象的时序元件来设计复杂的时序逻辑。本章对时序元件及常用的时序逻辑电路进行了建模。,常用的时序元件及时序逻辑电路包括:D触发器和锁存器、存放器、移位存放器、计数器、分频器、程序存储器和数据存储器等等。本章采用参数化的建模方法建模,很容易对这些电路进行扩展修改。,参数化的设计,配合软件强大的综合功能使得设计有较大的灵活性和实用价值,只要稍加修改,就可以应用到实际的工程设计中去。,P104,T1、2、3、4、 5、 6、 7、8,作业,
展开阅读全文