290 likes | 399 Views
设计描述. 从 16 位乘法器的设计谈起. 组合逻辑电路 描述. 组合逻辑电路描述. 同步时序逻辑电路的时钟频率直接取决于组合通路(包括数据通路、控制通路)的延迟时间; 在深亚微米工艺条件下,组合逻辑通路的延迟时间与组合逻辑通路的延迟级数(即逻辑级数)密切相关; 降低组合逻辑通路的逻辑级数成为组合通路设计优化的关键因素; 组合逻辑电路的功耗及其所占用的芯片面积直接与电路中的单元数目、逻辑连线数目相关; 减少组合逻辑电路实现所需的单元及连线数目成为组合逻辑电路设计优化的重要因素。. 组合逻辑电路描述. 描述要点: 避免引入不必要的 Latch 器件;
E N D
设计描述 从16位乘法器的设计谈起
组合逻辑电路描述 • 同步时序逻辑电路的时钟频率直接取决于组合通路(包括数据通路、控制通路)的延迟时间; • 在深亚微米工艺条件下,组合逻辑通路的延迟时间与组合逻辑通路的延迟级数(即逻辑级数)密切相关; • 降低组合逻辑通路的逻辑级数成为组合通路设计优化的关键因素; • 组合逻辑电路的功耗及其所占用的芯片面积直接与电路中的单元数目、逻辑连线数目相关; • 减少组合逻辑电路实现所需的单元及连线数目成为组合逻辑电路设计优化的重要因素。
组合逻辑电路描述 描述要点: • 避免引入不必要的Latch器件; • 注意HDL描述所对应的硬件结构: • 尽量降低逻辑级数; • 尽量减少所需的逻辑器件的数目; • 注意硬件的共享 • 注意描述结构中信号敏感表的完整性和冗余性;
组合逻辑电路描述 避免出现不必要的Latch • Latch的作用是什么? • Latch本身是一种时序控制的存储器件; • Latch主要用来保持或存储一段时间不改变的数据; • Latch 一般受电平控制; • Latch 还可能会受到使能信号控制。 • 什么情况下会引入Latch? • 条件或分支语句中,对信号赋值说明不完全、且信号在条件或分支语句前没有初始赋值。
组合逻辑电路描述 …… reg A1,A2,B1,B2; reg En1,En2; reg Y1,Y2,M; …… always @( En1 or En2 or A1 or A2 or B1 or B2) begin if (En1) Y1 = A1; if (En2) begin Y2 = !((A2 & B2) | B1) ; M = Y2 | Y1; end end …… En1=0时,Y1取值情形 没有说明,产生Lacth En2=0时,Y2、M的取值情形 没有说明,产生Lacth以保持M、Y2 的取值
组合逻辑电路描述 reg [1:0] Sel; reg [7:0] A, B,C,D; reg [7:0] Y; …… always @( Sel or A or B or C or D ) begin …… case(Sel) 2’b00: Y = A; 2’b01: Y = B; 2’b10: Y = C; 2’b11: Y = D; default: ; endcase …… end …… reg [1:0] Sel; reg [7:0] A, B,C,D; reg [7:0] Y; …… always @( Sel or A or B or C or D ) begin …… case(Sel) 2’b00: Y = A; 2’b01: Y = B; 2’b10: Y = C; 2’b11: Y = D; endcase …… end …… 分支不满 出现Latch 分支虽满,但属于值保持, 出现Latch
组合逻辑电路描述 reg [1:0] Sel; reg [7:0] A, B,C,D; reg [7:0] Y1, Y2, ; …… always @( Sel or A or B or C or D ) begin …… case(Sel) 2’b00: Y1 = A; 2’b01: Y 2= B; 2’b10: Y1 = C; 2’b11: Y 2= D; default: Y1 = ~(A&B) ; endcase …… end …… Y1、Y2在有些分支中 没有明确的赋值,导致出现 不必要的Latch
组合逻辑电路描述 reg [1:0] Sel1, Sel2; reg [7:0] A, B,C,D; reg [7:0] Y1; …… always @( Sel1or Sel2 or A or B or C or D ) begin …… case(Sel1) 2’b00: Y1 = A + 1; 2’b01: Y 1= A + B; 2’b10: Y1 = !C ; 2’b11: case (Sel2) 2’b00: Y1 = D - A; 2’b01: Y1 = A & B; 2’b10: Y1 = A | B; 2’b11: Y1 = ! D; endcase default: Y1 = ~(A&B) ; endcase …… end …… 每一个二进制数的取值为{ 0, 1 , X , Z }中的一个, 即有四种可能的取值 外层的case语句是满的, 但内层的case语句不满, 产生Latch以保持Y1
A2 + A1 B2 Y2 + + + B1 Y1 C2 + + C1 D1 D2 组合逻辑电路描述 module examp1(A1, B1, C1, A2, B2, C2, D2, Y1, Y2); input [8:0] A1, B1, C1, A2, B2, C2, D2; output [10:0] Y1, Y2; reg [10:0] Y1, Y2; always @(A1 or A2 or B1 or B2 or C1 or C2 or D1 or D2) begin Y1 <= A1 + B1 + C1 + D1 ; Y2 <= ( A2 + B2 ) + ( C2 + D2 ) ; end endmodule
组合逻辑电路描述 …….. reg [7:0] A, B, C, D, E, F, G, H; reg [8:0] Sum; reg [1:0] sel; ………. always (sel or A or B or C or D or E or F or G or H) begin Sum=9’b0; case (Sel) 2’b00: Sum = A +B; 2’b01: Sum = C + D; 2’b10: Sum = E + F; 2’b11: Sum = G + H; endcase end ……….. A + B 0 1 2 3 + C Sum D E + F Sel G + H
组合逻辑电路描述 …….. reg [7:0] A, B, C, D, E, F, G, H; reg [8:0] Sum; reg [1:0] sel; reg [7:0] add1, add2; ………. always (sel or A or B or C or D or E or F or G or H) begin {add1,add2} = 16’b0; case (Sel) 2’b00: {add1,add2} = {A , B}; 2’b01: {add1,add2} = {C , D}; 2’b10: {add1,add2} = {E , F}; 2’b11: {add1,add2} = {G , H}; endcase Sum = add1 + add2 ; end ……….. A C E G Sum Sel + B D F H Sel
组合逻辑电路描述 描述方式 • 对简单的电路结构,可用连续赋值语句加以描述; • 对复杂的组合逻辑结构,用always (敏感表)Stm形式加以描述 reg [7:0] a,b; wire [7:0] c; assign c= a&b; reg a, b, cin; wire sum, cout; assign {sum,cout}= {a^b^c, (a&b)|(a&c)|(b&c)}; • assign赋值语句中,被赋值的变量/信号一定为wire类型。
组合逻辑电路描述 描述结构: • Data Path • Control Path 具体电路形式: • Multiplexers • Encoder / priority encoder • Decoder • Comparator • Alu • Logic /arithmetic operations
组合逻辑电路描述 多路选择开关 • 二选一开关建议用if…else…结构描述; • 三/四选一开关可用if…else…结构、case/casex/casez结构描述 • 多选一开关建议不采用if…else…结构描述 HDL描述中,注意if…else…及其结构嵌套结构、case/casex/casez结构的完整性。
组合逻辑电路描述 编码/解码电路 • 将一组形式的二进制数据转化为另一种形式的二进制数据 • 形式上,编码/解码电路可采用: • if …else 及其嵌套结构; • case/casex/casez描述结构; • for 循环结构(一般避免采用)
组合逻辑电路描述 reg [7:0] A; reg [2:0] Y; …….. always @(A) casex(A) 8’b00000001: Y=3’b000; 8’b00000010: Y=3’b001; 8’b00000100: Y=3’b010; 8’b00001000: Y=3’b011; 8’b00010000: Y=3’b100; 8’b00100000: Y=3’b101; 8’b01000000: Y=3’b110; 8’b10000000: Y=3’b111; default: Y=3’bxxx; endcase reg [7:0] A; reg [2:0] Y; …….. always @(A) begin if (A==8’b00000001) Y=3’b000; else if (A==8’b00000010) Y=3’b001; else if (A==8’b00000100) Y=3’b010; else if (A==8’b00001000) Y=3’b011; else if (A==8’b00010000) Y=3’b100; else if (A==8’b00100000) Y=3’b101; else if (A==8’b01000000) Y=3’b110; else if (A==8’b10000000) Y=3’b111; else Y=3’bxxx; end
组合逻辑电路描述 有时也可用for 循环结构描述编码/解码逻辑电路,但一般不建议采用(综合结果很差) reg [7:0] A, B; reg [2:0] I, Y; …… for (I=0; I<=7;I=I+1) begin B=A; B[I] = 1’b0; if (A[I]==1’b1 && B==8’b0) Y=I; else Y=3’bxxx; end …… 逻辑模拟结果正确 综合结果差!!!
组合逻辑电路描述 reg [7:0] A; reg [2:0] Y; …….. always @(A) begin Valid =1’b1; casex(A) 8’b1xxxxxxx: Y=3’b111; 8’b01xxxxxx: Y=3’b110; 8’b001xxxxx: Y=3’b101; 8’b0001xxxx: Y=3’b100; 8’b00001xxx: Y=3’b011; 8’b000001xx: Y=3’b010; 8’b0000001x: Y=3’b001; 8’b00000001: Y=3’b000; default: {Y,Valid} =4’bxxx0; endcase reg [7:0] A; reg [2:0] Y; …….. always @(A) begin Valid =1’b1; if (A[7]==1’b1) Y=3’b111; else if (A[6]==1’b1) Y=3’b110; else if (A[6]==1’b1) Y=3’b101; else if (A[6]==1’b1) Y=3’b100; else if (A[6]==1’b1) Y=3’b011; else if (A[6]==1’b1) Y=3’b010; else if (A[6]==1’b1) Y=3’b001; else if (A[6]==1’b1) Y=3’b000; else {Y, Valid} = 4’bxxx0 ; end
组合逻辑电路描述 带参数的设计描述 • 优点:可重用性 • 缺点:可能会影响综合结果的性能 Generic N to M bit binary decoder N、M: 参数,分别表示二进制数的位宽;
module Decoder_N_M(En,A,Y); parameter N = 3; parameter M = 8; input En; input [N-1:0] A; output [M-1:0] Y; reg [M-1:0] Y; integer [N-1:0] I; always @(En or A) begin if (~En) Y = 0; else if (A>M-1) for (I=0;I<M-1;I=I+1) Y[I] = 1’bx; else for (I=0;I<M-1;I=I+1) if (A==N) Y[N]=1’b1; else Y[N] = 1’b0; end endmodule 引用方式 模块名 #(参数表) 实例名(端口/信号表); ……. Reg [1:0] A; Reg [2:0] B; Reg EnA , EnB; Wire [3:0] DecA; Wire [5:0] DecB; Decoder_N_M #(2,4) decoder_2_4 (.En(EnA), .A(A), .Y(DecA); Decoder_N_M #(3,6) decoder_3_6 (.En(EnB), .A(B), .Y(DecB)); ……….
组合逻辑电路描述 比较器及比较操作 一般作为操作的选择条件
组合逻辑电路描述 算术比较器的设计 两个N位的二进制数的比较 • == (!=)操作: 逻辑级数 为:logmN ; m: 单元库中与非、或非门的输入端数目; • (>=) 、<(<=)操作: 逻辑级数为: 2× logmN ; m: 单元库中与非、或非门的输入端数目;
组合逻辑电路描述 比较电路设计中,需注意: • 比较电路的总体逻辑级数; • 条件表达式中的信号到达时间的快慢; • 改变条件表达式的书写次序、或利用()强制改变条件操作的顺序以降低电路的总体逻辑级数; • 分析电路的逻辑级数,利用布尔函数变换将到达时间较慢的信号提前;
组合逻辑电路描述 ALU描述要点: • 将算术运算、逻辑运算、移位操作分开; • 利用case 、casex、 casez描述形式描述ALU的相关操作; • 严格控制各个分支的操作条件、避免任意扩大条件范围
module ALU(Sel, Cin, A, B,Y); input [4:0] Sel; input Cin; input [7:0] A, B ; output [7:0] Y; reg [7:0] Y; reg [7:0] LogicUnit, ArithUnit, ALU_NoShift; always @( Sel or A or B or Cin ) begin // Logic Operation case(Sel[1:0]) 2’b00: LogicUnit = A&B; 2’b01: LogicUnit = A | B; 2’b10: LogicUnit = A ^ B; 2’b11: LogicUnit = !A ; default: LogicUnit = 8’bx; endcase // Arithmetic Operation case( { Sel[1:0] , Cin } ) 3’b000: ArithUnit = A ; 3’b001: ArithUnit = A + 1 ; 3’b010: ArithUnit = A + B; 3’b011: ArithUnit = A + B + 1 ; 3’b100: ArithUnit = A + !B ; 3’b101: ArithUnit = A – B ; 3’b110: ArithUnit = A – 1 ; 3’b111: ArithUnit = A ; default: ArithUnit = 8’bx ; endcase //Multiplex between Logic and Arithmetic Unit if (Sel[2] ) ALU_NoShift = LogicUnit; else ALU_NoShift = ArithUnit; // Shift Operation case ( Sel[4:3] ) 2’b00: Y = ALU_NoShift; 2’b01: Y = ALU_NoShift << 1; 2’b10: Y = ALU_NoShift >> 1; 2’b11: Y = 8’b0; default: Y = 8’bx; endcase end endmodule