Vhdl 错误(10818):Can';I don’我不能推断在的注册号。。因为它的值不在时钟边缘之外

Vhdl 错误(10818):Can';I don’我不能推断在的注册号。。因为它的值不在时钟边缘之外,vhdl,Vhdl,我是vhdl新手,有两个问题: 主题->错误(10818)中的一个:无法在reset_BLOCK.vhd(49)处推断“syn_reset”的寄存器,因为它的值不在时钟边缘之外 错误(10822):复位块处的HDL错误。vhd(49):无法在此时钟边缘上实现分配寄存器 我搜索过任何提示,但没有找到任何与我的问题(代码)相匹配的提示。我想在时钟的下降沿和上升沿之间发送一个序列。也许我只是不懂vhdl。代码如下: reset\u signal\u write:进程(sclk\u reset\u

我是vhdl新手,有两个问题:

  • 主题->错误(10818)中的一个:无法在reset_BLOCK.vhd(49)处推断“syn_reset”的寄存器,因为它的值不在时钟边缘之外

  • 错误(10822):复位块处的HDL错误。vhd(49):无法在此时钟边缘上实现分配寄存器

我搜索过任何提示,但没有找到任何与我的问题(代码)相匹配的提示。我想在时钟的下降沿和上升沿之间发送一个序列。也许我只是不懂vhdl。代码如下:

reset\u signal\u write:进程(sclk\u reset\u in,init)
开始
选中:如果init='1',则

scs_reset此代码是用于模拟的,还是您希望它在合成时能够工作?如果它需要合成,你不能逃脱“X ns之后”——它不会起作用。但如果这只是为了模拟,那就没问题了。另请看:我想合成它,我之前看过那篇文章,但我没有看到任何有用的东西。要获得这些延迟,你必须创建一个计数器,每隔10、15或30 ns勾选一次,并将其与FSM结合使用,以控制输出的顺序。通常,在同一过程中混合
上升沿
下降沿
是一个坏主意。这会让你在路上遇到时间问题。您可以将
中的
sclk_reset_视为计数器所需的100MHz、66MHz或33MHz时钟注册的数据,并从上升沿运行所有内容。此外,您仅在有下降沿时检查是否有上升沿。这永远不会是真的。
reset_signal_write :process (sclk_reset_in,init) 
begin
  selected :if init = '1' then
     scs_reset <= '0' ;          
     sdata_reset <= '1';  
     syn_reset <= '0' after 30 ns;
     falling_edge_detected :if falling_edge(sclk_reset_in) then 
        sdata_reset <= '0' after 30 ns; 
        sdata_reset <= '1' after 60 ns ;
        sdata_reset <= '0' after 90 ns;
        sdata_reset <='1' after 120 ns;     
        rising_edge_detected :if rising_edge(sclk_reset_in) then
           syn_reset <= '1' after 30 ns;
           scs_reset <= '1' after 60 ns;
        end if rising_edge_detected;
     end if falling_edge_detected ;