您的位置:首页 > 其它

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

2013-03-07 14:27 92 查看
1.输入信号为什么要寄存

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

always@(posedge inputs)

begin

...

end

2.所有信号都需要寄存两拍吗

如果这个输入信号来自异步时钟域(比如FPGA芯片外部的输入),必须寄存两拍,第一拍将输入信号同步化,同步化的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少亚稳态带来的影响。

如果这个输入信号来自同一时钟域且需要用到跳变沿,需要寄存一拍,否则时序报告多半会报clock skew > data delay,造成建立/保持时间的冲突。

总而言之,五条原则:

全局时钟的跳变沿最可靠
来自异步时钟域的输入需要寄存一次以同步化,再寄存一次以减少亚稳态带来的影响
不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存
需要用到跳变沿的来自同一时钟域的输入,寄存一次即可
需要用到跳变沿的来自不同时钟域的输入,需要用到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: