如何为不同寄存器总线宽度的时钟跨域选择触发器数量?

时间:2019-01-10 09:54:30

标签: vhdl fpga

-进程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)的跨时钟域,还是我需要使用更多寄存器?

1 个答案:

答案 0 :(得分:0)

如果您独立考虑这些位,那么假设您的tx_信号来自其50 MHz域中的寄存器,那么您的代码就可以了。每条位线都可以在100MHz内获得2个触发器,并且不会出现亚稳性问题(对于大多数当前技术而言)。 现在,如果您要将数据用作总线,则会遇到很多问题,因为根本不应该那样做。当前,对于从000到111的转换,您有时会经历所有可能的总线值,例如000-> 101-> 111或000-> 110-> 111!
总线应该在不更改值时立即选通(并在更改值时冻结),这可能由tx_avl指示,但完全取决于您使用的总线类型。
在某些情况下,最好使用双端口/双时钟存储模块...
另请注意,在50 MHz域中的每个时钟脉冲将在100 MHz域中变为1或2个时钟脉冲,这可能不是您所期望的!