【问题标题】:Signal assignment method信号分配方法
【发布时间】:2020-11-24 16:52:54
【问题描述】:

我是 VHDL 新手,在将两个不同的值分配给进程内的同一信号时遇到了一些困难。例如,

process(CLK)

 if rising_edge(CLK) then

   OUTPUT0 <= X(0);
   OUTPUT1 <= X(1);
   OUTPUT2 <= X(2);

   LED0 <= VALUE;

   OUTPUT0 <= Y(0);
   OUTPUT1 <= Y(1);
   OUTPUT2 <= Y(2);

   LED1 <= VALUE;

 end if;
end process;

请注意,VALUE 是取决于分配给 OUTPUT0, OUTPUT1, OUTPUT2 的值的输出。

据我了解,在一个过程中,始终应用对同一信号的最后分配。我想要做的是将两组不同的值应用于一组输入,映射输出并按顺序完成。我尝试过与同一个时钟绑定的单独进程,尝试顺序移动的 FSM 等等。在这一点上,我已经用尽了我对要尝试的事情的了解。

我的问题是:将两个值顺序分配给一个输入并按顺序映射其输出的最佳方法是什么?

编辑:

根据 Brian 对状态机的建议,我继续执行并再次实现了一个,发现了我的错误并修复了它。这给出了我正在寻找的顺序分配。

我从一个 32x1 分布式 RAM 实例中读取 2 个地址,这是顺序分配的原因。抱歉没有提供最好的例子。下面是我的最终实现:

RAM_READ_FSM : process(CLOCK) -- FSM to read the RAM addresses sequentially

    begin

        if rising_edge(CLOCK) then
        
            case curr_state is
            
             when S0 => if SW2 = '1' then
             
            RAMADDR0 <= XYVEC(5); -- Y addresses
            RAMADDR1 <= XYVEC(6);
            RAMADDR2 <= XYVEC(7);
            RAMADDR3 <= XYVEC(8);
            RAMADDR4 <= XYVEC(9);
            
            LED1 <= RAMOUT;
            
            curr_state <= S1;

         else
         
         curr_state <= S0;
         
            end if;
            
             when S1 => if SW2 = '1' then
                        
            RAMADDR0 <= XYVEC(0); -- X addresses
            RAMADDR1 <= XYVEC(1);
            RAMADDR2 <= XYVEC(2);
            RAMADDR3 <= XYVEC(3);
            RAMADDR4 <= XYVEC(4);
            
            LED2 <= RAMOUT;
            
            curr_state <= S0;
            
            else
            
            curr_state <= S1;
            
            end if;
        end case;
    end if;
end process;

【问题讨论】:

  • 您能否澄清“将两组不同的值应用于一组输入?”
  • 进程在等待语句中恢复和挂起(此处进程敏感度列表中的隐式等待),信号更新安排在投影输出波形队列中,并且在进程中不会发生正在执行。每个模拟时间只有一个条目,较早的更新将被以后的分配覆盖,如此处。 VHDL 描述通过综合作为形式证明。 “最佳方式”基于代码片段征求意见。提供有关 X、Y 和 VALUE 的信息,minimal reproducible example 会有所帮助。问题也可能过于狭窄,可能有“更好”的硬件解决方案。

标签: vhdl


【解决方案1】:
  1. 信号应该从同一个进程驱动:多个驱动程序会相互干扰..

  2. 请参阅Is process in VHDL reentrant? 了解信号分配语义。

  3. 现在您可以看到 X 和 LED0 分配之间需要一些延迟(即使只是 2 个增量周期,如果计算 VALUE 的逻辑只是一个简单的信号分配)。

  4. 你在状态机上是正确的,但你没有说它是如何失败的。值得将其添加到 Q 以获得更完整的答案。

  5. 同时有一个简单的方法来增加延迟:

喜欢

LEDS : process is
begin

   wait until rising_edge(CLK);
   OUTPUT0 <= X(0);
   OUTPUT1 <= X(1);
   OUTPUT2 <= X(2);
    
   wait until rising_edge(CLK);
   LED0 <= VALUE;
  
   wait until rising_edge(CLK);
   OUTPUT0 <= Y(0);
   -- etc
end process LEDS;

【讨论】:

  • 感谢您的回答!特别是状态机以及链接。我再次实现了一个状态机,发现其中有一个错误并修复了它。通过执行状态机,我的两个任务是按顺序完成的。
猜你喜欢
  • 2013-03-25
  • 2015-06-27
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多