我正在使用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;
我的直觉告诉我,我必须先设置数据,以满足设置和安装。保持输入寄存器的要求。
谢谢!
答案 0 :(得分:0)
数据必须在时钟边沿之前的设置时间内存在,因此在任何可能的数据更改的同时置位时钟可能会导致行为不稳定。
配置移位寄存器的一种方法是使输出在最后一位数据输入后置位。对于8位移位寄存器,在第8个时钟之后,信号将被置位。任何简单的方法都是使用3位计数器,当所有位都为1时,输出为1.然后将该信号连接到fifo的CLKEN,以便在第9个时钟边沿,输出的输出数据寄存器被输入到fifo中。也可以在第9个时钟将下一个串行数据时钟输入移位寄存器。
shift reg FIFO
------------- ---------
-|DIN DOUT |--------| DIN |
| FULL |--------| CLKEN |
- |> | --|> |
| ------------- | ---------
| |
CLK -----------------------
在上图中,FULL将在最后一位数据被输入以填充移位寄存器后立即置位,并在下一个周期取消置位。 FULL
可以是组合逻辑。