1

我正在使用 VHDL 开发一个 FPGA 项目。

每次填充时,我都需要将 16 位移位寄存器复制到 FIFO 中(例如,在将 16 个新数据位输入移位寄存器后,我想获取新形成的 16 位字并将其发送到 fifo)

我的问题是,在断言fifo上的时钟线之前,我是否需要在fifo一个时钟的输入处设置数据?这实际上是一个通用的 VHDL 问题,而不是特定于 fifos。

基本上,是否可以在同一操作中设置数据和切换时钟,或者我是否需要一些基本状态机来在一个时钟沿设置数据并在下一个时钟沿切换 fifo 时钟?

例如:

fifo_d_in( 7 downto 0 ) <= shift_register;
fifo_clk <= '1';

或者

if( state = one ) then
    fifo_d_in( 7 downto 0 ) <= shift_register;
    state <= two;
elsif( state = two ) then
    fifo_clk <= '1';
end if;

我的直觉告诉我,我必须先设置数据,以满足输入寄存器的设置和保持要求。

谢谢!

4

1 回答 1

0

数据必须在时钟沿之前的设置时间内存在,因此在任何可能的数据更改的同时断言时钟可能会导致不稳定的行为。

配置移位寄存器的一种方法是在输入最后一位数据后置位输出。对于 8 位移位寄存器,在第 8 个时钟之后,信号将置位。实现这一点的任何简单方法是使用 3 位计数器,当所有位为 1 时,输出为 1。然后将此信号连接到 fifo 的 CLKEN,以便在第 9 个时钟沿,移位输出的数据寄存器被计时到先进先出。也可以在第 9 个时钟将下一个串行数据位输入移位寄存器。

       shift reg             FIFO
       -------------        ---------
      -|DIN   DOUT |--------| DIN   |
       |      FULL |--------| CLKEN |
     - |>          |      --|>      |
     | -------------      | ---------
     |                    | 
CLK -----------------------

在上图中,在最后一位数据被输入以填充移位寄存器后的瞬间,FULL 将被断言,并在下一个周期被取消断言。 FULL可以是组合逻辑。

于 2013-04-09T05:00:45.173 回答