VHDL ALU 综合期间的进位输出问题

问题描述 投票:0回答:1
我正在尝试用 VHDL 构建和综合 ALU,但我一综合就遇到了问题。 我希望我的 ALU 有一个操作码,用于添加我的两个 N 位输入和一个可以由输入或之前计算的总和设置的进位。 我感兴趣的代码部分如下:

process (a, b, op) -- a and b are n bits input en op is the op-code case op is when "011" => -- add a + b + c (with c as carry) y <= ('0' & a) + ('0' & b) + c; -- y is the N-bit output ... end process; process (clk) if (clk'event and clk = '1') then if (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) > (2**N)) then --basically I'm testing if there is an overflow during the calculation c <= '1'; elsif (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) < ((2**N)+1)) c <= '0'; ... end process;

我不确定代码是否可以在这里工作,因为我没有定义信号类型,但基本上它可以归结为我上面写的内容。 问题在于,当我使用适当的测试平台模拟 VHDL 时,它应该可以正常工作,但是当我综合此代码并使用相同的测试平台模拟合成的代码时,它无法正常工作,因为不知何故第一个过程是即使 a、b 或 op 没有改变,也会再次重复。因此,当和的结果有进位时,即使 a、b 或 op 没有改变,也会用这个新进位再次计算,结果也会加 1!

后来我发现这篇文章说

敏感性列表被编译器“忽略”了如何认为他比你更了解程序并制定了自己的敏感性列表。如果这是真的,我猜编译器会在第一个进程的敏感度列表中添加 clk,以便在 op =“011”时在每个 clk 周期上运行计算。

我的问题来了:我该怎么办才能解决这个问题,以便计算运行一次并在计算后改变进位?

亲切的问候

vhdl addition synthesis alu
1个回答
0
投票
正如其他人指出的那样,您的代码存在一些问题。我将尝试提出一些改进建议,然后展示计算进位标志的可能方法:

  1. 区分进位信号和进位输出信号。为您的信号使用交流名称,例如

    carry_in

    carry_out
    。这将消除很多混乱。

  2. 为 ALU 运算定义常量或枚举类型。例如:

    subtype opcode_type is std_logic_vector(2 downto 0); constant ADC: opcode_type := "011"; -- ADC: add with carry
    
    
  3. 最后,如果您使用的是 VHDL 2008,您可以使用聚合作为分配目标来生成您的执行:

    (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in;
    
    
您的代码最终将如下所示:

process (all) case op is when ADC => -- add a + b + c (with c as carry) (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in; ... end process; process (clk) if rising_edge(clk) then carry_flag <= carry_out; ... end process;
    
© www.soinside.com 2019 - 2024. All rights reserved.