-进程1-注册异步传入的单个位寄存器
process (clk,rst_n) begin -- 100 MHz clk
if (rst_n='0') then
reg_1bit_reg1_s <= '0';
reg_1bit_reg2_s <= '0';
elsif rising_edge(clk) then
reg_1bit_reg1_s <= tx_avl;--Coming at 50MHz
reg_1bit_reg2_s <= reg_1bit_reg1_s;
end if;
end process;
-进程2-异步注册128位寄存器
process (clk,rst_n) begin -- 100 MHz clk
if (rst_n='0') then
reg_128bit_reg1_s <= (others => '0');
reg_128bit_reg2_s <= (others => '0');
elsif rising_edge(clk) then
reg_128bit_reg1_s <= tx_avl_data;--Coming at 50MHz
reg_128bit_reg2_s <= reg_128bit_reg1_s;
end if;
end process;
tx_avl和tx_avl_data可随时异步声明。以上寄存器可以处理1位(tx_avl)和128位(tx_avl_data)的跨时钟域,还是我需要使用更多寄存器?
答案 0 :(得分:0)
如果您独立考虑这些位,那么假设您的tx_信号来自其50 MHz域中的寄存器,那么您的代码就可以了。每条位线都可以在100MHz内获得2个触发器,并且不会出现亚稳性问题(对于大多数当前技术而言)。
现在,如果您要将数据用作总线,则会遇到很多问题,因为根本不应该那样做。当前,对于从000到111的转换,您有时会经历所有可能的总线值,例如000-> 101-> 111或000-> 110-> 111!
总线应该在不更改值时立即选通(并在更改值时冻结),这可能由tx_avl指示,但完全取决于您使用的总线类型。
在某些情况下,最好使用双端口/双时钟存储模块...
另请注意,在50 MHz域中的每个时钟脉冲将在100 MHz域中变为1或2个时钟脉冲,这可能不是您所期望的!