首页 > 代码库 > 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两种寄存器的使能