我正在做一个用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;我的直觉告诉我,我必须首先设置数据,以满足输入寄存器的设置和保持要求。
谢谢!
发布于 2013-04-09 13:00:45
数据必须在时钟沿之前的设置时间内存在,因此在任何可能的数据更改的同时断言时钟可能会导致不稳定的行为。
配置移位寄存器的一种方法是让一个输出在最后一位数据输入后断言。对于8位移位寄存器,在第8个时钟之后,信号将被断言。实现这一点的任何简单方法都是使用3位计数器,当所有位都为1时,输出为1。该信号随后连接到fifo的CLKEN,以便在第9个时钟边沿,移位寄存器输出端的数据被计入fifo。也可以在第9个时钟向移位寄存器输入下一串行位数据。
shift reg FIFO
------------- ---------
-|DIN DOUT |--------| DIN |
| FULL |--------| CLKEN |
- |> | --|> |
| ------------- | ---------
| |
CLK -----------------------在上图中,FULL将在最后一位数据写入移位寄存器后立即置位,并在下一个周期解除置位。FULL可以是组合逻辑。
https://stackoverflow.com/questions/15893454
复制相似问题