信号分配方式
Signal assignment method
我是 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;
信号应该由同一个进程驱动:多个驱动会相互干扰..
请参阅 Is process in VHDL reentrant? 信号分配语义。
现在您可以看到在 X 和 LED0 赋值之间需要一些延迟(即使只是 2 个增量周期,如果计算 VALUE 的逻辑只是一个简单的信号赋值)。
你在状态机方面是正确的,但你没有说明它是如何失败的。值得将其添加到 Q 以获得更完整的答案。
同时有一个简单的方法来增加延迟:
喜欢
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;
我是 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;
信号应该由同一个进程驱动:多个驱动会相互干扰..
请参阅 Is process in VHDL reentrant? 信号分配语义。
现在您可以看到在 X 和 LED0 赋值之间需要一些延迟(即使只是 2 个增量周期,如果计算 VALUE 的逻辑只是一个简单的信号赋值)。
你在状态机方面是正确的,但你没有说明它是如何失败的。值得将其添加到 Q 以获得更完整的答案。
同时有一个简单的方法来增加延迟:
喜欢
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;