FPGA常用电路设计

组合逻辑电路是一系列的实时输入输出,输出随着输入的改变而随时改变,没有数据的记忆功能。

一、组合逻辑电路

组合逻辑电路是一系列的实时输入输出,输出随着输入的改变而随时改变,没有数据的记忆功能。

组合逻辑电路有两种方法进行描述,行为建模(行为级描述),数据流建模(结构级描述)。接下来主要以介绍数据流建模为主

1.译码器

输入为n位输入值,使其中2^n位的对应位为1。

module decode(
    input wire [2:0] in,
    input wire [7:0] out
)
	assign out = 4'b00000001 << in;
endmodule

即,将第一位的1,向左移很多位,就得到了需要的数据。

用处:常用于寻址。

2. 编码器

与译码器功能相反。

one-hot,独热码,只有一位为1。

module one-hot-encode(
	input wire [7:0] in,
	input wire [2:0] out
)
    assign out = (in[0]) ? 3'b0 :
        (in[1]) ? 3'b1 :
        (in[2]) ? 3'b2 :
        (in[3]) ? 3'b3 :
        (in[4]) ? 3'b4 :
        (in[5]) ? 3'b5 :
        (in[6]) ? 3'b6 :
        3'b7;
endmodule       

优先编码器,找到为1的最高位

module priority-encode(
	input wire [7:0] in,
	input wire [2:0] out
)
    assign out = (in[7]) ? 3'b7 :
        (in[6]) ? 3'b6 :
        (in[5]) ? 3'b5 :
        (in[4]) ? 3'b4 :
        (in[3]) ? 3'b3 :
        (in[2]) ? 3'b2 :
        (in[1]) ? 3'b1 :
        3'b0;
endmodule  

3.多路选择器

有多个输入和几条控制线,由控制线控制选择哪一个输出。多路选择器其中包含了一个译码器

module mux(
    input wire [7:0] data_in,
    input wire [2:0] ctr_in,
    input wire out
)
    assign out = data_in[ctr_in];
endmodule

4.比较器

module compare(
    input wire [31:0] a,
    input wire [31:0] b,
    out 
)
    assign out = (a == b) ? 1'b1 : 1'b0;
endmodule

上述比较器就是用来比较是否相等,可以写一个比较器来对比大小关系。

module compare(
	input wire [31:0] a,
	input wire [31:0] b,
	out
)
    assign out = (a > b) ? 1'b1 : 1'b0;
endmodule

在实际的电路中,a > b的实现是比较复杂的。

5.加法器

module add(
    input wire [7:0] a,
    input wire [7:0] b,
    output wire [7:0] c
)
    assign c = a + b;
endmodule

加法器分为半加器和全加器。半加器只计算一位的结果和进位情况,全加器可以输入另一个全加器或者半加器的进位情况,并且输出结果和进位情况。

二、时序逻辑

1.交叉配对反相器(Cross-Coupled Inverters)

稳定存储一个Bit的数据,同时输出存储的Q和Q非。

如果一开始Q和Q非同时处于0或者同时处于1,那么就会触发震荡状态,新的状态不断改变,无法表示稳定的信息。

能够存储但是不能够更新新的数据。

2.SR锁存器

给到R和S的值。

  1. S = 1,R = 0,Q是1
  2. S = 0,R = 1,Q是0
  3. S = R = 0,Q保持之前的值
  4. S = R = 1,不允许出现这种情况,进入亚稳态。

3.D锁存器

额外添加两个与门,将S和R的输入限制为三种允许的状态。

  1. WE = 0,保持
  2. WE = 1,D = 1,输出为1
  3. WE = 1,D = 0,输入为0

D锁存器只要在D为高电平期间,输出就会发生改变,无法实现在固定周期内进行锁存的效果。

4.D触发器

clk的上升沿来临时,将状态更新成D的状态。

clk为低电平时,整体就是保持不变的,和SR锁存器一样。

clk为高电平时,禁止D的输入传播到SR锁存器。