FPGA设计中对输入信号的处理(转)

1.输入信号为什么要寄存
一般来说,在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存。只要满足建立时间,保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是如果模块需要使用输入信号的跳变沿(比如帧同步信号),千万不要直接这样哦。
always @ (posedge inputs)
begin

end
2.所有信号都需要寄存两拍吗
如果这个输入信号来自异步时钟域(比如FPGA芯片外部的输入),必须寄存两拍。第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少(注意是减少)亚稳态带来的影响。
如果这个输入信号来自于同一时钟域且需要用到跳变沿,需要寄存一拍。否则时序报告多半会报clock skew > data delay,造成建立/保持时间的冲突。

总而言之,五条原则:

  1. 全局时钟的跳变沿最可靠。
  2. 来自异步时钟域的输入需要寄存一次以同步化,再寄存一次以减少亚稳态带来的影响。
  3. 不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存。
  4. 需要用到跳变沿的来自同一时钟域的输入,寄存一次即可。
  5. 需要用到跳变沿的来自不同时钟域的输入,需要用到3个触发器,前两个用以同步,第3个触发器的输出和第2个的输出经过逻辑门来判断跳变沿。

给出一个verilog模板:

always @ (posedge Clk) //不对输入信号进行寄存
begin
    if (inputs)
    begin
    ...
    end
    ...
end
always @ (posedge Clk) //对输入信号寄存一拍
begin
    inputs_reg <= inputs;
    if (inputs_reg == 1'b0 && inputs == 1'b1)
        begin
        ...
        end
        ...
end
always @ (posedge Clk) //对输入信号寄存三拍
begin
    inputs_reg1 <= inputs;
    inputs_reg2 <= inputs_reg1;
    inputs_reg3 <= inputs_reg2;
    if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)
        begin
        ...
        end
    ...
end
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值