Skip to content

FPGA常用电路设计

· 4 min · 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锁存器。