VHDL可合成矢量比较

时间:2016-06-06 22:10:40

标签: vector vhdl

我目前正在用VHDL编程ALU,我正在使用Cyclone II板。我需要比较两个std_logic_vectors以查看一个是否大于另一个。我在条件中使用了大于(>)但我不知道FPGA是否可以合成该运算符。有没有使用">"来比较两个向量的解决方法?并合成它?

2 个答案:

答案 0 :(得分:3)

MCVE会有所帮助。但是,您要做的是在模拟和合成中都可能。你的问题不清楚的是矢量的格式是什么。他们签了吗?无符号?两个补码?浮点?标志量?

然而,假设两个向量是有符号的,2的补数。一个例子:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity foo is

  port
  (
    a : in std_logic_vector(31 downto 0);
    b : in std_logic_vector(31 downto 0);
    y : out std_logic
  );
end entity foo;

architecture rtl of foo is
  signal a_signed : signed(a'range);
  signal b_signed : signed(b'range);
begin
  a_signed <= signed(a);
  b_signed <= signed(b);

  y <= '1' when (a_signed > b_signed) else '0';
end architecture rtl;

还有其他解决方案。以及针对不同格式的其他实现。

答案 1 :(得分:2)

数据类型std_logic_vector只是一组位(有9个值......),但它没有定义任何算术行为。

要使用添加,乘法或比较等算术运算,例如预期的“大于”,您需要另一种数据类型,例如UNSIGNEDSIGNED。这些类型定义了其他算术运算。因此,当您将信号声明为(UN)SIGNED时,VHDL将知道其他运算符,并且合成器将推断出正确的硬件。

-- declare the signals in a declarative region
signal mySignal1 : UNSIGNED(7 downto 0);
signal mySignal2 : UNSIGNED(7 downto 0);
signal greater   : BOOLEAN;

-- now compare them
greater <= mySignal1 > mySignal2;