【发布时间】: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