首页 > 代码库 > FPGA两种寄存器的使能

FPGA两种寄存器的使能

在FPGA中,寄存器的使能设计一般有两种方式:

1.直接使用寄存器的使能端口。

技术分享

2.使用一个数据选择器连接寄存器的D端口,通过数据选择器的sel端口做使能。如下图

技术分享

 

 

 

 

 

 

这个方式与直接使用寄存器的CE端口有什么区别呢?

我们可以看出来,

1.在Q1为输出端口时,此时这个结构所具有的功能和普通的寄存器是一样的,当CE=1时,D经过数据选择器选通在经过一个时钟的延迟后到达Q1端口。CE=0时具有保存功能。是不是就是下面的写法。

always@(posedge clk)begin
    if(CE)begin
        Q1 <= D;
    end
end

2.那在Q0为输出端口是呢?此时当CE=1时,数据直接被选通输出到Q0端口,没有延迟。而当CE=0时也具有保持功能。

我们这里就会思考,没有延迟,直接通过,那么我下面这样写是不是就是这种功能呢?

always@(posedge clk)begin
    if(CE)begin
        Q0 = D;
    end
end

将 非阻塞赋值 <=变成 =阻塞赋值, 那这样行不行呢?下面就进行验证

这是综合后的电路,直接告诉我们这个写法和1寄存器的写法是一样的Q0与D同样存在一个时钟的延迟,并且下面这个仿真图也验证了我们的观点。

这样的写法并不会综合成2结构的电路,并且D端口与Q0端口存在一个时钟的延迟。

技术分享

技术分享

事实上我们应该写成以下形式:

module test
(
    input clk,
    input  D,
    input CE,
    output  Q0
);
    
reg Qt=0;
assign Q0 = CE ? D:Qt;
always@(posedge clk)begin
    if(CE)begin
        Qt <= D;
    end
end

endmodule

综合出来的电路如下图所示,这才是2结构的电路。

技术分享

 

那讲到这里,BB了这么多,这个电路结构到低有什么用呢? 下面我就举个栗子

 

假设我们需要这样一个功能

1. 连续输入 x1 y1 x2 y2

2. 当 x1>0时 输出 x1 否则 -x1

3. 当 x1>0时 输出 y1 否则 -y1,即y1根据x1的符号进行输出

4. 当 x2>0时 输出 x2 否则 -x2

5. 当 x2>0时 输出 y2 否则 -y2,即y2根据x2的符号进行输出

那么我们就使用这样的结构保存x的符号值,供y使用。

 

FPGA两种寄存器的使能