VHDL:正确地对另一个组件进行时钟设置



我正在研究VHDL中的FPGA项目。

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

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

基本上,是否有可能在同一操作中设置数据和切换时钟,或者我是否需要一些基本状态机来设置一个时钟边缘上的数据并切换下一个时钟上的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;

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

谢谢!

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

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

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

在上面的图表中,在最后一位数据被输入以填充移位寄存器后立即断言FULL,并在下一个周期中解除断言。FULL可以是组合逻辑

最新更新