在 1 个过程中为信号分配多个值

Assign multiple values to a signal during 1 process

如果在进程中给信号赋值,是不是只有在进程结束时才成为信号的正确值? 因此,在每个进程中多次为信号分配一个值是没有意义的,因为最后一次分配将是唯一一个将被实现的,对吗?

我有点绝望,因为我试图用信号在 VHDL 中实现 booth 算法,但我无法将其烘焙。这不是变量的问题,但信号使这一切变得更加困难。

我尝试了 for 循环,但这不起作用,因为我必须更新循环内的值。

我的下一个想法是在测试平台中添加一个计数器。

非常感谢您的想法!

我当前的代码如下所示:

architecture behave of booth is
signal buffer_result1, buffer_result2, buffer_result3: std_logic_vector(7 downto 0) := "0000"&b;
signal s: std_logic:= '0';
signal count1, count2: integer:=0;

begin

    
    assignment: process(counter) is
    begin
        if counter = "000" then
            buffer_result1 <= "0000"&b;
        end if;
    end process;
    
    
    add_sub: process(counter) is
    begin
        if counter <= "011" then
            if(buffer_result1(0) = '1' and s = '0') then
                buffer_result2 <= buffer_result1(7 downto 4)-a;
            else if (buffer_result1(0) = '0' and s = '1') then
                buffer_result2 <= buffer_result1(7 downto 4)+a;
            end if;
        end if;
    end process;
    
    shift:process(counter) is
    begin
        if counter <= "011"
            buffer_result3(7) <= buffer_result2(7);
            buffer_result3(6 downto 0) <= buffer_result2(7 downto 1);
            s<= buffer_result3(0);
        else
            result<=buffer_result3;
        end if;
end behave;

简答:正确。信号的值在您的流程结束之前不会更新。

长答案:信号只会在其分配生效时更新。一些信号分配将使用 after 并指定一个时间,使交易时间明确。如果没有给出明确的时间,信号将在默认的“time-delta”之后更新,这是一个模拟时间的“瞬间”,一旦在给定的 sim 时间所有并发执行的语句都完成(例如,一个进程)。因此,您的信号将保持其初始值,直到过程完成,此时 sim 时间向前移动一个“增量”,并且值更新。

不是意味着对同一个信号的多个信号赋值语句不会在进程中完成任何事情。 VHDL 会记录所有赋值,但在同一事务时间给出的一系列赋值中,只有last 赋值会生效。这可以用于一些棘手的事情,尽管我遇到过关于应该多久尝试一次的意见分歧。例如:

-- Assume I have a 'clk' coming in

signal pulse   : std_ulogic;
signal counter : unsigned(2 downto 0);

pulse_on_wrap : process(clk) is
begin
    clock : if rising_edge(clk):
        pulse   <= '0'; -- Default assignment to "pulse" is 0
        counter <= counter + 1; -- Counter will increment each clock cycle
        if counter = 2**3-1 then
            pulse <= '1'; -- Pulse high when the counter drops to 0 (after this cycle)
        end if;
    end if clock;
end process pulse_on_wrap;

这里,典型的行为是在每个时钟周期将值'0'分配给pulse。但是,如果 counter 达到其最大值,则会对 pulse 进行后续赋值,一旦模拟时间提前,它将设置为 '1'。因为它在 '0' 赋值之后出现并且还有一个“delta”事务延迟,所以它将覆盖之前的赋值。因此,此过程将导致信号 pulse 恰如其分地在每次计数器回零时变高一个周期,然后在下一个周期下降 - 毕竟这是一个脉冲! :^)

我提供该示例只是为了说明在一个流程中进行多项分配的潜在好处,正如您在问题中提到的那样。我建议在您清楚变量赋值和信号赋值之间的区别之前尝试任何花哨的赋值 - 以及如何在您的代码中反映出来!

尝试从模拟时间和硬件的角度考虑信号。一切都是静止的,直到时间向前移动,然后你可以处理新的值。这是一个学习曲线,但它会发生! ;^)