基本数字逻辑单元HDL描述(第3讲)
- 格式:pdf
- 大小:709.59 KB
- 文档页数:44
基本数字逻辑单元HDL描述基本数字逻辑单元HDL 描述--时序逻辑电路HDL 描述时序逻辑电路的输出状态不仅与输入变量的状态有关,而且还与系统原先的状态有关。
⏹时序电路最重要的特点是存在着记忆单元部分;⏹时序电路主要包括:⏹触发器和锁存器⏹计数器⏹移位寄存器⏹脉冲宽度调制等。
时序逻辑电路HDL 描述--D 触发器HDL 描述D触发器是数字电路中应用最多的一种时序电路。
输入输出CLRPRE CE D C Q 1X X X X 001X X X 1000X X 无变化0010↑00011↑1D 触发器真值表D 触发器HDL 描述--带时钟使能和异步置位的D 触发器描述module v_registers_5 (C, D, CE, PRE, Q);input C, CE, PRE;input [3:0] D;output reg [3:0] Q;always @(posedge C or posedge PRE)beginif (PRE) Q <= 4'b1111;elseif (CE) Q <= D;endendmodule该设计保存在本书配套资源\eda_verilog\example6_15目录下时序逻辑电路HDL描述--Jk触发器HDL描述JK触发器真值表输入输出R S CE J K C Q1X X X X↑001X X X↑1000X X X无变化00100X无变化00101↑000111↑翻转00110↑1Jk 触发器HDL 描述--带时钟使能和异步置位/复位的JK 触发器module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always @(posedge CLK or negedge RS or negedge SET)beginif(!RS) Q <= 1'b0;else if(!SET) Q <= 1'b1;else下一页继续Jk 触发器HDL 描述--带时钟使能和异步置位/复位的JK 触发器case({J,K})2'b00 : Q <= Q;2'b01 : Q <= 1'b0;2'b10 : Q <= 1'b1;2'b11 : Q <= ~Q;default: Q<= 1'bx;endcase endendmodule该设计保存在本书配套资源\eda_verilog\example6_16目录下时序逻辑电路HDL描述--RS触发器HDL描述RS触发器真值表输入输出R S C Q00↑无变化01↑110↑011↑无变化时序逻辑电路HDL 描述--RS 触发器HDL 描述的例子module rs_ff(input r,input s,input clk,output reg q,output reg qn );always @(*)beginqn <= ~q;end下一页继续时序逻辑电路HDL 描述--RS 触发器HDL 描述的例子always @(posedge clk)begincase({r,s})2'b00: q <= q;2'b01: q <= 1;2'b10: q <= 0;2'b11: q <= q;default: q<=1'bx;endcase endendmodule该设计保存在本书配套资源\eda_verilog\example6_17目录下时序逻辑电路HDL 描述--锁存器HDL 描述锁存器和触发器不同之处,就在于触发方式的不同☐触发器是靠敏感信号的边沿触发;☐锁存器是靠敏感信号的电平触发。
基本数字逻辑单元HDL 描述LOGO数据运算操作主要包含加法操作、减法操作、乘法操作和除法操作,由这四种运算单元和逻辑运算单元一起,可以完成复杂数学运算。
HDL语言中提供了丰富的数据算术操作的运算符。
组合逻辑电路的HDL 描述--数据运算操作HDL 描述加法操作HDL 描述--带进位输入和输出无符号8位加法的例子module v_adders_2(A, B, CI, SUM);input [7:0] A;input [7:0] B;input CI;output [7:0] SUM;assign SUM = A + B + CI;endmodule减法操作HDL 描述--无符号带借位8位减法器的例子module v_adders_8(A, B, BI, RES);input [7:0] A;input [7:0] B;input BI;output [7:0] RES;assign RES = A -B -BI;endmodule乘法操作HDL 描述--8位与4位无符号数相乘的例子module v_multipliers_1(A, B, RES);input [7:0] A;input [3:0] B;output [11:0] RES;assign RES = A * B;endmodule除法操作HDL 描述--无符号8位除法运算的例子module div(input [7:0] numerator,input [7:0] denominator,output [7:0] quotient,output [7:0] remainder);assign quotient=numerator/denominator;assign remainder=numerator % denominator;endmodule数据运算操作HDL 描述--算术逻辑单元HDL 描述前面介绍了加法器和减法器电路的设计。
基本数字逻辑单元HDL描述任何复杂的数字系统可以用若干基本组合逻辑单元和时序逻辑单元组合来实现。
基本逻辑单元一般分为组合逻辑电路和时序逻辑电路两大类。
这两类基本逻辑电路构成和复杂数字系统设计的基石。
组合逻辑电路的HDL 描述组合逻辑电路的HDL 描述--内容组合逻辑电路是指输出状态只决定于同一时刻各个输入状态的组合,而与先前状态无关的逻辑电路称为组合逻辑电路。
组合逻辑电路主要包括:⏹基本逻辑门⏹编码器⏹译码器⏹数据选择器⏹数据比较器⏹总线缓冲器逻辑门的HDL 描述--基本门电路过程分配描述module g1(o,a,b,c,d);input a,b,c,d;output reg o;always @(a or b or c or d)begino=(~(a&b))|(b&c&d);endendmodule本设计保存在本书配套资源eda_verilog\example6_1目录下逻辑门的HDL 描述--基本门电路连续分配描述module g2(o,a,b,c,d);input a,b,c,d;output o;assign o=(~(a&b))|(b&c&d);endmodule逻辑门的HDL 描述--基本门电路门调用描述module g3(o,a,b,c,d);input a,b,c,d;output o;nand(o1,a,b);and(o2,b,c,d);or(o,o1,o2);endmodule组合逻辑电路的HDL 描述--编码器HDL 描述将某一信息用一组按一定规律排列的二进制代码描述称为编码。
典型的有8421码、BCD 码等。
在使用HDL 语言描述编码器时,通过使用CASE 和IF 语句实现对编码器的描述。
编码器HDL 描述--8/3优先编码器描述的例子module v_priority_encoder_1(sel,code);input [7:0] sel;output [2:0] code;reg [2:0] code;always @(sel)beginif (sel[0]) code = 3'b000;else if (sel[1]) code = 3'b001;else if (sel[2]) code = 3'b010;else if (sel[3]) code = 3'b011;else if (sel[4]) code = 3‘b100;else if (sel[5]) code = 3'b101;else if (sel[6]) code = 3'b110;else if (sel[7]) code = 3'b111;else code = 3'bxxx;endendmodule 本设计保存在本书配套资源eda_verilog\example6_2目录下思考与练习1:优先级的含义?思考与练习2:查看详细描述后的结果,分析(提示:长链路带来延迟,性能降低)组合逻辑电路的HDL 描述--编码器HDL 描述译码器设计译码的过程实际上就是编码过程的逆过程,即将一组按一定规律排列的二进制数还原为原始的信息。
基本数字逻辑单元HDL 描述LOGO基本数字逻辑单元HDL 描述--时序逻辑电路HDL 描述时序逻辑电路的输出状态不仅与输入变量的状态有关,而且还与系统原先的状态有关。
⏹时序电路最重要的特点是存在着记忆单元部分;⏹时序电路主要包括:⏹触发器和锁存器⏹计数器⏹移位寄存器⏹脉冲宽度调制等。
时序逻辑电路HDL 描述--D 触发器HDL 描述D触发器是数字电路中应用最多的一种时序电路。
输入输出CLRPRE CE D C Q 1X X X X 001X X X 1000X X 无变化0010↑00011↑1D 触发器真值表D 触发器HDL 描述--带时钟使能和异步置位的D 触发器描述module v_registers_5 (C, D, CE, PRE, Q);input C, CE, PRE;input [3:0] D;output reg [3:0] Q;always @(posedge C or posedge PRE)beginif (PRE) Q <= 4'b1111;elseif (CE) Q <= D;endendmodule该设计保存在本书配套资源\eda_verilog\example6_15目录下时序逻辑电路HDL描述--Jk触发器HDL描述JK触发器真值表输入输出R S CE J K C Q1X X X X↑001X X X↑1000X X X无变化00100X无变化00101↑000111↑翻转00110↑1Jk 触发器HDL 描述--带时钟使能和异步置位/复位的JK 触发器module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always @(posedge CLK or negedge RS or negedge SET)beginif(!RS) Q <= 1'b0;else if(!SET) Q <= 1'b1;else下一页继续Jk 触发器HDL 描述--带时钟使能和异步置位/复位的JK 触发器case({J,K})2'b00 : Q <= Q;2'b01 : Q <= 1'b0;2'b10 : Q <= 1'b1;2'b11 : Q <= ~Q;default: Q<= 1'bx;endcase endendmodule该设计保存在本书配套资源\eda_verilog\example6_16目录下时序逻辑电路HDL描述--RS触发器HDL描述RS触发器真值表输入输出R S C Q00↑无变化01↑110↑011↑无变化时序逻辑电路HDL 描述--RS 触发器HDL 描述的例子module rs_ff(input r,input s,input clk,output reg q,output reg qn );always @(*)beginqn <= ~q;end下一页继续时序逻辑电路HDL 描述--RS 触发器HDL 描述的例子always @(posedge clk)begincase({r,s})2'b00: q <= q;2'b01: q <= 1;2'b10: q <= 0;2'b11: q <= q;default: q<=1'bx;endcase endendmodule该设计保存在本书配套资源\eda_verilog\example6_17目录下时序逻辑电路HDL 描述--锁存器HDL 描述锁存器和触发器不同之处,就在于触发方式的不同☐触发器是靠敏感信号的边沿触发;☐锁存器是靠敏感信号的电平触发。
时序逻辑电路HDL 描述--锁存器HDL 描述的例子module v_latches_2 (gate,data,set, Q);input gate, data, set;output Q;reg Q;always @(gate,data,set)beginif (!set) Q = 1'b0;else if(gate) Q = data;end endmodule时序逻辑电路HDL 描述--计数器HDL 描述根据计数器的触发方式不同,计数器可以分为:同步计数器和异步计数器两种。
☐当赋予计数器更多的功能时,计数器的功能就非常复杂了。
☐计数器是常用的定时器的核心部分。
✓当计数器输出控制信号时,计数器也就变成了定时器了。
⏹本节只介绍同步计数器的设计。
✓同步计数器指在时钟脉冲(计数脉冲)的控制下,计数器做加法或减法的运算。
时序逻辑电路HDL 描述--计数器HDL 描述一个8进制(范围0~7)的计数器是一个3位二进制的计数器。
计数器HDL 描述--3位计数器描述的例子module count3(input wire clk,input wire clr,output reg [2:0] q );always @(posedge clk or posedge clr)beginif(clr == 1)q <= 0;elseq <= q + 1;endendmodule计数器HDL 描述--5进制计数器描述的例子module mod5cnt(input wire clr,input wire clk,output reg [2:0] q );always @(posedge clr or posedge clk)beginif(clr == 1)q <= 0;else if(q == 4)q <= 0;elseq <= q + 1;endendmodule时序逻辑电路HDL 描述--时钟分频器HDL 描述q(i)频率(Hz )周期(ms )q(i)频率(Hz )周期(ms )025000000.000.00004126103.520.16384112500000.000.00008133051.760.3276826250000.000.00016141525.880.6553633125000.000.0003215762.94 1.3107241562500.000.0006416381.47 2.621445781250.000.0012817190.73 5.242886390625.000.002561895.3710.485767195312.500.005121947.6820.97152897656.250.010242023.8441.94304948828.130.020482111.9283.886081024414.060.0409622 5.96167.77216分频时钟频率和计数器的关系(输入时钟50MHz)时序逻辑电路HDL 描述--时钟分频器HDL 描述的例子module clkdiv(input wire clr,input wire mclk,output wire clk190,output wire clk48);reg [24:0] q;always @ (posedge mclk or posedge clr)begin下一页继续时序逻辑电路HDL 描述--时钟分频器HDL 描述if(clr == 1)q <= 0;elseq <= q + 1;endassign clk190 = q[17];assign clk48 = q[19];endmodule时序逻辑电路HDL 描述--移位寄存器HDL 描述本节介绍下面:⏹通用移位寄存器HDL 描述⏹环形移位寄存器HDL 描述⏹消抖电路HDL 描述⏹时钟脉冲电路HDL 描述时序逻辑电路HDL 描述--通用移位寄存器HDL 描述在每一个时钟脉冲时,数据从一个触发器移动到另一个触发器。
串行数据data_in 从移位寄存器的左边输入进来,在每个时钟到来时,q3移动到q2,q2移动到q1,q1移动到q0。
--16位串入/串出移位寄存器的描述module shift16(input a,input clk,output b);wire [15:0] z;assign z[0]=a;下一页继续--16位串入/串出移位寄存器的描述assign b=z[15];genvar i;generatefor (i=0; i<15; i=i+1)begin: g1dff Dffx(z[i],clk,z[i+1]);endendgenerateendmodule通用移位寄存器HDL 描述--预定义移位操作符实现逻辑左移的例子module logical_shifter_3(input [7:0] DI,input [1:0] SEL,output reg[7:0] SO);always @(DI or SEL)begin下一页继续通用移位寄存器HDL 描述--预定义移位操作符实现逻辑左移的例子case (SEL)2'b00: SO = DI;2'b01: SO = DI << 1;2'b10: SO = DI << 2;2'b11: SO = DI << 3;default: SO = DI;endcaseendendmodule通用移位寄存器HDL 描述--for 循环实现16位移位寄存器的例子module shift_registers_1 (input c,input si,output so);reg [15:0] tmp;integer i;assign so=tmp[15];下一页继续通用移位寄存器HDL 描述--for 循环实现16位移位寄存器的例子always @(posedge c)beginfor(i=0;i<15;i=i+1)tmp[i+1]<=tmp[i];tmp[0]<=si;endendmodule通用移位寄存器HDL 描述--并置操作实现16位移位寄存器的例子module shift_register_5(input SI,input clk,output reg[15:0] PO);reg[15:0] temp=0;always @(posedge clk)begintemp <= {temp[14 : 0], SI};PO <= temp;endendmodule环形移位寄存器HDL 描述--四位右移环形移位寄存器的例子module ring4(input wire clk,input wire clr,output reg [3:0] q);always @(posedge clk or posedge clr)beginif(clr == 1)下一页继续环形移位寄存器HDL 描述--四位右移环形移位寄存器的例子q <= 1;elsebeginq[3] <= q[0];q[2:0] <= q[3:1];endendendmodule时序逻辑电路HDL 描述--消抖电路HDL 描述当按键时,不可避免的引起按键的抖动,需要大约ms 级的时间才能稳定下来。