VerilogHDL数字设计教程第4章.课件.ppt

上传人(卖家):三亚风情 文档编号:2495267 上传时间:2022-04-26 格式:PPT 页数:129 大小:931KB
下载 相关 举报
VerilogHDL数字设计教程第4章.课件.ppt_第1页
第1页 / 共129页
VerilogHDL数字设计教程第4章.课件.ppt_第2页
第2页 / 共129页
VerilogHDL数字设计教程第4章.课件.ppt_第3页
第3页 / 共129页
VerilogHDL数字设计教程第4章.课件.ppt_第4页
第4页 / 共129页
VerilogHDL数字设计教程第4章.课件.ppt_第5页
第5页 / 共129页
点击查看更多>>
资源描述

1、第4章 Verilog HDL常用电路设计4.1 常用组合逻辑电路设计4.2 常用时序逻辑电路设计4.3 小结习题4 第4章 Verilog HDL常用电路设计4.1 常用组合逻辑电路设计常用组合逻辑电路设计理论上,可利用化简真值表并采用逻辑门来实现电路的方法,对所有组合电路进行设计,但使用该方法设计大型组合电路则不太现实。例如,一个有12个输入的电路,在真值表中会有212=4K行。降低复杂度的一种方法就是采用比逻辑门功能更强大的组合元件,图4-1列出了常用的几种组合元件。第4章 Verilog HDL常用电路设计图4-1 组合元件第4章 Verilog HDL常用电路设计下面使用Verilo

2、g HDL分别对上述组合元件及常用的组合逻辑电路进行建模。1. 数据选择器数据选择器例4-1实现了一个n位,m1的数据选择器。【例4-1】 参数型n位,m1数据选择器。module multiplexer_N( X1,X2,X3,X4, sel,Y);parameter N=8; /该参数定义了一个8位的4选1多路选择器inputN-1: 0 X1,X2,X3,X4; 第4章 Verilog HDL常用电路设计input1:0 sel;output reg N-1: 0 Y;always (sel,X1,X2,X3,X4) case(sel)2b00: Y = X1;2b01: Y = X2;

3、2b10: Y = X3;2b11: Y = X4;endcaseendmodule第4章 Verilog HDL常用电路设计程序说明:(1) 程序中定义了4个输入X1、X2、X3、X4,一个输出Y,使用控制信号sel选择4个输入中的1个赋给Y。(2) 程序中使用parameter定义了一个参数常量N,通过修改参数可以很容易地改变输入、输出的位数。 第4章 Verilog HDL常用电路设计2. 译码器译码器例4-2实现了一个log2 nn的译码器。【例4-2】 参数型log2 nn译码器。module decode_N( sel, Y);parameter N=4; /该参数定义了一个4输出

4、(4位)译码器input1:0 sel; /此参数为2位,通过计算log24=2可得到4输出译码器output reg N-1: 0 Y;always (sel)case(sel)第4章 Verilog HDL常用电路设计2b00: Y = 4b0001;2b01: Y = 4b0010;2b10: Y = 4b0100;2b11: Y = 4b1000;endcaseendmodule第4章 Verilog HDL常用电路设计程序说明:(1) 程序中定义了一个输入sel,一个输出Y,使用控制信号sel来确定Y的输出。(2) 由于本程序涉及求以2为底的对数计算,因此若修改参数N,sel的位数就

5、要手工做相应调整,这样才可实现任意位数的译码器。 第4章 Verilog HDL常用电路设计3. 加法器加法器例4-3实现了N位加法器。【例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章 Verilog HDL常用电路设计程序说明:(1) 程序中,X和Y分别为加数和被加数,sum和co分别为本位和及进位。(2) 本例使用数据流建模实现,在综合时会自动映射为Quartu

6、s 自带的加法器宏功能模块。第4章 Verilog HDL常用电路设计4. 乘法器乘法器例4-4实现了N位乘法器。【例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章 Verilog HDL常用电路设计程序说明:(1) 程序中,X和Y分别为乘数和被乘数,mul为两者的积。(2) 本例使用数据流建模实现,在综合时,会自动映射为Quartus 自带的乘法器宏功能模块。 第4章 Verilog HDL常用电

7、路设计5. 比较器比较器例4-5实现了N位比较器。【例4-5】 参数型N位比较器。module compare_N( X, Y, X_gt_Y, X_eq_Y, X_lt_Y);parameter N=8; /参与比较的数的位数为8nput N-1: 0 X, Y;output reg X_gt_Y, X_eq_Y, X_lt_Y;always (X,Y)第4章 Verilog HDL常用电路设计if(XY) begin X_gt_Y=1;X_eq_Y=0; X_lt_Y=0; endelse if(X=Y) begin X_gt_Y=0;X_eq_Y=1; X_lt_Y=0; endelse

8、 begin X_gt_Y=0;X_eq_Y=0; X_lt_Y=1; endendmodule第4章 Verilog HDL常用电路设计程序说明:(1) 比较器实现的功能见表4-1。 (2) 比较器有3个输出,在任一时刻仅有一个输出为1,即仅有一个输出有效。 第4章 Verilog HDL常用电路设计6. ALU例4-6实现了一个n位、m功能的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:

9、 0 result;always (X, Y, sel)第4章 Verilog HDL常用电路设计 begincase(sel)3b000: result=X+Y; /加法3b001: result=X-Y; /减法3b010: result=X1; /右移1位3b100: result=X&Y; /相与3b101: result=XY; /异或3b110: result=X; /求反3b111: result=X; /直通endcase endendmodule 第4章 Verilog HDL常用电路设计程序说明:(1) ALU实现的功能见表4-2。 第4章 Verilog HDL常用电路设

10、计(2) 算术逻辑运算ALU通过一条或多条输入总线完成算术或逻辑运算。ALU是CPU的核心部件之一,是设计CPU时必不可少的内容。第4章 Verilog HDL常用电路设计7. 三态总线三态总线引入三态门有许多实际的应用,如CPU设计中的数据和地址总线的构建、RAM或堆栈的数据端口的设计等。在设计中,若对变量赋值为z,则会引入三态门,并在控制下可使其输出呈高阻态,这等效于三态门禁止输出。三态门设计示例如例4-7。 第4章 Verilog HDL常用电路设计【例4-7】 设计三态门。module tri_s(enable,datain,dataout);parameter N=8;input e

11、nable;inputN-1:0 datain;output regN-1:0 dataout;always (enable,datain)if(enable=1) dataout=datain;else dataout=bz;endmodule第4章 Verilog HDL常用电路设计程序说明: (1) 本程序在Quartus 中的综合结果如图4-2所示。从图中可以看出,三态门综合后映射成了Verilog HDL的基本门原语buf。图4-2 三态门控制电路的综合结果第4章 Verilog HDL常用电路设计(2) 参数N表示输入、输出的数据位宽,改变参数即可改变输入、输出的数据位宽,从而增强

12、程序的可移植性。为构成数字系统内部的总线系统,必须设计三态总线驱动器电路,这可以有多种表达方法,但必须注意信号多驱动源的处理问题。例4-8、例4-9和例4-10都试图描述一个8位4通道的三态总线驱动器,但其中有一个程序不能得到预期的结果。 第4章 Verilog HDL常用电路设计【例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:

13、0 out;always (enable,input3,input2,input1,input0) begin第4章 Verilog HDL常用电路设计 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; endendmodule 第4章 Verilog HDL常用电路设计【例4-9】 N位4通道的三态总线驱动器(实现方法1)。modu

14、le 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章 Verilog HDL常用电路设计【例4-10】

15、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) beginif(enable=2b00) out=input3; else out=bz; end第4章 Verilog HDL常用电路设计always (enable,inpu

16、t3,input2,input1,input0) beginif(enable=2b01) out=input2;else out=bz; endalways (enable,input3,input2,input1,input0) beginif(enable=2b10) out=input1;else out=bz; 第4章 Verilog HDL常用电路设计endalways (enable,input3,input2,input1,input0) begin if(enable=2b11) out=input0; else out=bz; endendmodule第4章 Verilog

17、 HDL常用电路设计对例4-8、例4-9和例4-10的程序说明如下:(1) 例4-8和例4-9、例4-10在Quartus 中综合的结果分别如图4-3和图4-4所示。图4-3 例4-8的综合结果第4章 Verilog HDL常用电路设计图4-4 例4-9、例4-10的综合结果第4章 Verilog HDL常用电路设计从综合结果来看,例4-8没有得到预期的效果。(2) 例4-8和例4-9、例4-10在Quartus 中仿真的结果分别如图4-5和图4-6所示。 第4章 Verilog HDL常用电路设计图4-6 例4-9、例4-10的仿真结果第4章 Verilog HDL常用电路设计从仿真结果也可

18、以看出,例4-8没有得到预期的效果。(3) 例4-8在一个always块中放了4个顺序完成的if语句,并且是完整的条件描述语句。粗看此程序认为会产生4个N位的三态控制通道,且输出只有一个信号out。但是,细心的读者可能会发现,在例4-8的always块中输出信号有4个赋值源,也就是4个if语句都是对out进行赋值,这样在综合时,只有最后一个if语句起作用,也就是说前3个if语句没有任何意义,从综合结果可以清楚地看到这一点。下面再通过一个小例子进行说明。第4章 Verilog HDL常用电路设计【例4-11】 多个赋值源的赋值语句。always (a,b,c,d) begin out=a; ou

19、t=b; out=c; out=d; end读者很容易理解,out的值为d,always块中的前三条语句没有意义。事实上,例4-8的道理跟这个例子的道理是一样的。 第4章 Verilog HDL常用电路设计(4) 例4-9由于使用了4个并列的assign并行语句,因此能综合出正确的结果。这是因为,每一条assign语句都等同于一个独立运行的always块,每一条assign语句右侧表达式中的所有变量等同于always块中的敏感信号列表,只要有一个发生变化,assign语句就立刻执行。因此,例4-9和例4-10是等价的,从综合和仿真的结果也可以证明这一点。第4章 Verilog HDL常用电路设

20、计(5) 例4-9和例4-10表明,要设计出能产生独立控制的多通道的电路结构,必须使用并行语句结构。但应注意,例4-9和例4-10中对同一个输出信号out有4个并行赋值源,在实际电路中完全可能发生“线与”。所以,在程序中,每个赋值源都使用了ifelse结构,保证了条件不满足时,其输出为高阻态值“z”,这样可以保证不会发生“线与”。但如果条件不满足,其输出不为高阻态值,那么就无法得到预期的结果。第4章 Verilog HDL常用电路设计4.2 常用时序逻辑电路设计常用时序逻辑电路设计时序逻辑电路的一个特点是:任何一个时刻的输出状态不仅取决于当时的输入信号,还与电路的原始状态有关。也就是说,时序电

21、路含有记忆元件,具有反馈通道。时序逻辑电路包括各类触发器、寄存器、计数器、存储器等。就像使用较抽象的组合元件来实现复杂的组合逻辑一样,也可以使用较抽象的时序元件来设计复杂的时序逻辑。图4-7显示了下面几种常用的时序元件。 第4章 Verilog HDL常用电路设计图4-7 时序元件第4章 Verilog HDL常用电路设计下面使用Verilog HDL分别对上述时序元件及常用的时序逻辑电路进行建模。1. D触发器和锁存器触发器和锁存器D触发器作为时序电路中最基本的单元,每个电路设计人员都必须能够在理解其原理的基础上熟练应用。D触发器的作用是存储一位二进制位的信息,在时钟上升沿把数据从输入端送到

22、输出端,其结构框图如图4-8所示。第4章 Verilog HDL常用电路设计图4-8 D触发器结构框图第4章 Verilog HDL常用电路设计使用Quartus 综合D触发器极为简捷方便,下面给出在时钟上升沿触发的D触发器的Verilog HDL行为描述。【例4-12】 一位D触发器。实现方式一:module my_dff(clk, d, q);input clk;第4章 Verilog HDL常用电路设计input d;output reg q;always (posedge clk)q = d;endmoduleQuartus 综合的结果如图4-8所示。 第4章 Verilog HDL常

23、用电路设计实现方式二:调用Quartus 软件中的dff模块实现D触发器。module my_dff(clk, d, q);input clk;input d;output q;dff my_dff(d, clk, , , q);endmoduleQuartus 综合的结果同样如图4-8所示。两种实现方式的仿真波形也是一样的,如图4-9所示。 第4章 Verilog HDL常用电路设计图4-9 D触发器仿真波形第4章 Verilog HDL常用电路设计从仿真波形来看,两种实现方式得到的电路功能完全相同。事实上,对于一个简单的触发器来说,以上两种设计方法,其核心都是一个简单的D触发器内核,Qua

24、rtus 软件在综合时会自动调用内部模块,自动综合为Quartus 自带的D触发器电路模块,从而使设计更加趋于合理。对于电平敏感的锁存器,只需在D触发器的描述中将上升沿改为电平即可,代码如下例。 第4章 Verilog HDL常用电路设计例:一位电平敏感的锁存器。module my_latch(clk, d, q);input clk;input d;output reg q;always (clk,d) if(clk) q = d;endmodule由一位D触发器和一位锁存器可以很容易地实现寄存器和多位锁存器。 第4章 Verilog HDL常用电路设计2. 寄存器寄存器寄存器是一种应用广泛

25、的时序逻辑器件,用于暂存数据。寄存器是时钟边沿敏感的。寄存器包括一般寄存器、三态寄存器,还包括具有复位、置位和使能功能的寄存器。下面分别举例说明。 第4章 Verilog HDL常用电路设计【例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程序说明:第4章 Verilog HDL常用电路设计 Quartus 综合的结果如图4-10所示。图4-10 一般寄存器的综合结果

26、第4章 Verilog HDL常用电路设计 D触发器相当于一位寄存器,定义多位D触发器即可构成寄存器。从两者的代码中也可以看出,D触发器与寄存器的区别就是位数不同。第4章 Verilog HDL常用电路设计(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) /同步复位、同步置数

27、第4章 Verilog HDL常用电路设计beginif(reset) temp=0;else if(load) temp=data;else temp=D; endalways (temp,en) /异步使能beginif(en) Q=temp; else Q = bz;endendmodule 第4章 Verilog HDL常用电路设计程序说明: Quartus 综合的结果如图4-11所示。从图中可以看出,对于Quartus 软件来说,异步方式是通过在寄存器后增加三态门来实现的,同步方式是通过多路选择器来实现的。 第4章 Verilog HDL常用电路设计图4-11 同步复位、同步置数、异

28、步使能的寄存器第4章 Verilog HDL常用电路设计 同步复位、同步置数要求复位或置数必须在时钟的上升沿发生。 事实上,复位、置数、使能三个信号可以任意选取同步、异步两种方式之一,因此三个信号可以任意组合成8种不同功能的电路,如异步复位、同步置数、异步使能电路等。第4章 Verilog HDL常用电路设计(3) 异步复位、同步置数、异步使能的寄存器。module register_N(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

29、 Q;regN-1: 0 temp;always (posedge clk or posedge reset) /异步复位、同步置数第4章 Verilog HDL常用电路设计 beginif(reset) temp=0;else if(load) temp=data;else temp=D; endalways (temp,en) /异步使能beginif(en) Q=temp; else Q = bz; endendmodule第4章 Verilog HDL常用电路设计程序说明: Quartus 综合的结果如图4-12所示。图4-12 异步复位、同步置数、异步使能的寄存器第4章 Verilo

30、g HDL常用电路设计 异步复位、同步置数要求只要复位信号为有效电平就复位,而置数必须在时钟的上升沿发生。(4) 三态寄存器。module tri_reg(a,en,clk,q);parameter N=8;inputN-1:0 a;input en,clk;output regN-1:0 q;regN-1:0 val;always (posedge clk)第4章 Verilog HDL常用电路设计 begin:triregdataval = a ; endalways (en,val) begin:trireg3stif(en) q = val;else q = bz; end endmo

31、dule第4章 Verilog HDL常用电路设计程序说明如下: Quartus 综合的结果如图4-13所示。从综合结果可以看出,三态寄存器是在寄存器后放置了一个三态门,从而实现了相应的功能。 第4章 Verilog HDL常用电路设计图4-13 三态寄存器的综合结果第4章 Verilog HDL常用电路设计 该电路的功能是:在clk的上升沿将数据d存入D触发器,然后在en有效时,将存入Q的d值传给q,en无效时,q的值为高阻态bz。 引入三态电路有许多实际的应用,如CPU设计中的数据和地址总线的构建、RAM的数据端口的设计等。 第4章 Verilog HDL常用电路设计3. 移位寄存器移位寄

32、存器例4-14设计了一个n位移位寄存器,该寄存器具有左移、右移、置数功能。【例4-14】 参数型n位移位寄存器。/8位CPU中常用的移位寄存器模块module shift_N(clk,Ci,mode,D,Q,Co);input clk,Ci; /时钟和移位输入input2:0 mode; /移位模式控制字inputN-1:0 D; /待加载移位的数据第4章 Verilog HDL常用电路设计outputN-1:0 Q; /移位数据输出output reg Co ; /移位输出regN-1:0 temp;parameter N=8; /8位移位寄存器always (posedge clk) be

33、gin case(mode)第4章 Verilog HDL常用电路设计 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第4章 Verilog HDL常用电路设计3b011: begin tempN-1 = temp0; tempN-2:0 = tempN-1:1; /自循环右移end3b100: begin t

34、empN-1 = Ci ; tempN-2:0 = tempN-1:1; Co=temp0; /带进位循环右移end default: temp = temp ; / 保持 endcase endassign Q = temp; /移位后输出endmodule 第4章 Verilog HDL常用电路设计程序说明:(1) 移位寄存器可以有多种工作模式,这由移位模式控制字mode来控制。(2) 仿真波形如图4-14所示。从图中可以看出,第1个时钟上升沿时,mode为3b000,该模式为加载待置数,因此D的值被装载进Q。第2个时钟上升沿时,mode为3b001,该模式为带进位循环左移,因此D的值循环

35、左移,同时D的最低位取此时刻Ci的值。从仿真波形图中可以看出,本段代码实现了题目要求的功能。第4章 Verilog HDL常用电路设计图4-14 例4-14的仿真波形第4章 Verilog HDL常用电路设计4. 计数器计数器例4-15设计了一个n位计数器,该计数器有计数、清零功能。【例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)

36、第4章 Verilog HDL常用电路设计beginif(rst) /计数器异步复位Q = 0; /为了能生成诸如触发器一类的时序逻辑,建议使用非阻塞赋值else if(en) /计数器同步使能Q = Q + 1; endassign cout= (Q=0)? 1b1:1b0; /计数器计满溢出后cout输出1endmodule第4章 Verilog HDL常用电路设计程序说明:(1) 仿真波形如图4-15所示。从图中可以看出,本段代码实现了一个十六进制计数器,并且具有异步复位和同步使能功能,在计数器溢出后将cout置1。 第4章 Verilog HDL常用电路设计图4-15 例4-15的仿真

37、波形第4章 Verilog HDL常用电路设计(2) 本计数器实现的是2的整数次幂计数,如果不是2n计数,如何实现呢?这时,需要使用条件语句判断计数是否达到最大值,如果是,则使计数器清零并从零开始计数。例4-16实现了一个十进制加法计数器。第4章 Verilog HDL常用电路设计【例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)

38、begin第4章 Verilog HDL常用电路设计if(rst) /计数器异步复位Q = 0; /为了能生成诸如触发器一类的时序逻辑,建议使用非阻塞赋值else if(en) /计数器同步使能if(Q=9) Q = 0; else Q = Q + 1; endassign cout= (Q=0)? 1b1:1b0; /计数器计满溢出后cout输出1endmodule 第4章 Verilog HDL常用电路设计例4-16的仿真波形如图4-16所示。从图中可以看出,本段代码实现了一个十进制加法计数器,并在计数器溢出后将cout置1。图4-16 例4-16的仿真波形第4章 Verilog HDL常

39、用电路设计5. 分频器分频器在具体的电路设计中,可能需要很多种不同频率的时钟,但实际电路中往往只有一种单一频率的外部时钟输入,这时候就需要分频或倍频以得到我们需要的时钟频率。对于倍频电路,需要具体硬件的支持,本小节暂不阐述。对于分频电路,通过简单的设计即可实现。 第4章 Verilog HDL常用电路设计分频器电路是非常有用的一种电路,分频的方法很多,最常见的是利用加法计数器对时钟信号进行分频。下面通过几个例子分别介绍2的整数次幂分频、奇数分频、偶数分频的方法。第4章 Verilog HDL常用电路设计【例4-17】 参数型2n分频,占空比为50%。module divf_2powN(rst,

40、clk,en,clk_N);input rst,clk,en;output clk_N;parameter N=2;regN-1:0 count;always (posedge clk) 第4章 Verilog HDL常用电路设计beginif(rst) count=0; else if(en) count=count+1; endassign clk_N=countN-1;endmodule第4章 Verilog HDL常用电路设计程序说明:(1) 本例可实现2的任意整数次幂的分频器设计,占空比为50%。(2) 本例中N定义为常整数2,也就是说本例实现的是2的2次幂分频,即4分频。如果要实现

41、2的N次幂分频,则仅需要调用该模块,并修改参数N即可。例如要实现8分频,则将参数N修改为3即可,具体实现代码如下:第4章 Verilog HDL常用电路设计module divf_2pow3(rst,clk,en,clk8);input rst,clk,en;output clk8;divf_2powN #(3) divf8(rst,clk,en,clk8);endmodule第4章 Verilog HDL常用电路设计(3) 本例除了可以得到2的N次幂分频外,还可以非常容易地得到2的N-1次幂、N-2次幂、1次幂分频,只需要多添加几条assign语句即可。例如:module divf_2pow

42、4(rst,clk,en,clk2,clk4,clk8,clk16);input rst,clk,en;output clk2,clk4,clk8,clk16;reg3:0 count;always (posedge clk) 第4章 Verilog HDL常用电路设计begin if(rst) count=0; else if(en) count=count+1; endassign clk2=count0; /2分频assign clk4=count1; /4分频assign clk8=count2; /8分频assign clk16=count3; /16分频endmodule第4章 V

43、erilog HDL常用电路设计【例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%) 第4章 Verilog HDL常用电路设计 beginif(p=N-1) begin p=0; clk_p=clk_p; end else p=p+1; endalways (negedge clk) beginif(q=N-1) q=0

44、; else q=q+1;if(p=(N-1)/2) clk_q=clk_q; endassign clk_N=clk_pclk_q;endmodule 第4章 Verilog HDL常用电路设计程序说明:(1) 对于奇数分频,仍然采用加法计数的方法,只是要对时钟的上升沿和下降沿分别计数,这是因为输出波形的改变不仅仅发生在时钟上升沿。(2) 本例使用了两个计数器p和q分别对上升沿和下降沿计数,然后通过组合逻辑assign clk_N=clk_pclk_q; 控制输出时钟的电平,从而得到需要的时钟波形。(3) 上述模块定义了一个参数化的奇数分频电路,并实现了一个3分频电路。如果设计一个顶层模块,

45、调用该模块并修改参数,则可实现任意奇数分频。例如: 第4章 Verilog HDL常用电路设计module divf_oddn_top(clk,clk_3,clk_5,clk_7);input clk;output clk_3,clk_5,clk_7;divf_oddn #(3) div_odd3(clk,clk_3);divf_oddn #(5) div_odd5(clk,clk_5);divf_oddn #(7) div_odd7(clk,clk_7);endmodule上述模块的仿真波形如图4-17所示。 第4章 Verilog HDL常用电路设计图4-17 任意奇数分频第4章 Veri

46、log HDL常用电路设计从图4-17可知,上述代码实现了任意奇数分频。【例4-19】 参数型偶数分频,要求占空比为50%。 module divf_even(clk,clk_N);input clk;output reg clk_N;parameter N=6;integer p;always (posedge clk)第4章 Verilog HDL常用电路设计 begin if(p=N/2-1) begin p=0; clk_N=clk_N; endelse p=p+1; endendmodule 第4章 Verilog HDL常用电路设计程序说明:(1) 对于偶数分频,仍然采用加法计数的

47、方法,只是要对时钟的上升沿进行计数,这是因为输出波形的改变仅仅发生在时钟上升沿。本例使用了一个计数器p对上升沿计数,计数计到一半时,控制输出时钟的电平取反,从而得到需要的时钟波形。(2) 上述模块定义了一个参数化的偶数分频电路,并实现了一个6分频电路。如果设计一个顶层模块,调用该模块并修改参数,则可实现任意偶数分频。例如: 第4章 Verilog HDL常用电路设计module divf_even_top(clk,clk_12,clk_10);input clk;output clk_12,clk_10;divf_even #(12) div_even12(clk,clk_12);divf_e

48、ven #(10) div_even10(clk,clk_10);endmodule上述模块的仿真波形如图4-18所示。 第4章 Verilog HDL常用电路设计图4-18 任意偶数分频第4章 Verilog HDL常用电路设计从图4-18可知,上述代码实现了任意偶数分频。【例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为占空比alway

49、s (posedge clk) beginif(rst) temp=0;第4章 Verilog HDL常用电路设计 else if(en) if(temp=N-1) temp=0;else temp=temp+1; endassign clkout=(tempM)? 1 : 0;endmodule第4章 Verilog HDL常用电路设计(1) 对于占空比可变的分频器,这时需要设置两个参数,一个控制分频比,另一个控制占空比,从而得到需要的时钟波形。上例中,N=7,M=3,说明是7分频电路,占空比为3/7。(2) 上述模块定义了一个参数化的占空比可变的分频电路。如果设计一个顶层模块,调用该模块并

50、修改参数,则可实现任意占空比的分频器。例如: 第4章 Verilog HDL常用电路设计module div_Para_top(rst,clk,en,clk3_2,clk5_1,clk6_3); /顶层设计input rst,clk,en;output clk3_2,clk5_1,clk6_3;divf_parameter #(3,2) f1(rst,clk,en,clk3_2); /3分频,占空比为2/3divf_parameter #(5,1) f2(rst,clk,en,clk5_1); /5分频,占空比为1/5divf_parameter #(6,3) f3(rst,clk,en,cl

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(VerilogHDL数字设计教程第4章.课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|