VHDL If / Else声明

时间:2014-11-14 03:54:56

标签: if-statement vhdl

我正在为一个学校项目的实验室工作。我们应该最终制作一个程序,向altera板显示有符号整数值。这是沿途的一个步骤,我被卡住了。我无法弄清楚为什么这个if / else语句不会编译,我是VHDL的新手,请帮忙。

-----------------------------------------------------------------
-- circuit for converting a 4-bit signed integer
-- to a 1-bit sign and a 4-bit absolute value
-----------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;

entity sgnabs4 is
   port (X    : in std_logic_vector(3 downto 0);
       sgn  : out std_logic;
       Xabs : out std_logic_vector(3 downto 0));
end sgnabs4;

architecture sgnabs4_arch of sgnabs4 is

    component twos_complement4 is
        port (A : in std_logic_vector(3 downto 0);
            T : out std_logic_vector(3 downto 0));
    end component twos_complement4;

      -- you may define internal signals here as you feel necessary
        signal That: std_logic_vector(3 downto 0);
        signal Ahat: std_logic_vector(3 downto 0);

begin


    twos_complement4_0: twos_complement4
        port map(T => That, A=> Ahat);

  sgn <= That(3);


  if (sgn = '1') then
    sgn => Xabs(3);
    Xabs(2) <= not X(2);
    Xabs(1) <= not X(1); 
    Xabs(0) <= not X(0);


  else

    Xabs(3) <= '0';
    Xabs(2) <= X(2);
    Xabs(1) <= X(1); 
    Xabs(0) <= X(0);

  end if;

end sgnabs4_arch; 

2 个答案:

答案 0 :(得分:2)

安迪的答案可能有效,但它并不能解释你的问题。所以:

正如sebs在评论中指出的那样,您的if语句需要处于一个过程中。 if语句是顺序的;只有并发语句才允许在体系结构体外的进程之外。

虽然指出的两个修复sebs可能允许你的代码编译(取决于你如何处理我将在一分钟内得到的另一个位),但它仍然无法工作。

  • 您的组件实例twos_complement4_0已将Ahat映射到其输入端口,That映射到其输出端口,但您没有在Ahat的任何位置分配值你的代码,那么That会是什么?可能没有任何用处。如果您复制并粘贴了它,则需要了解它能够正确修改它的功能。寻找一个教程,特别是关于组件实例化和端口映射。
  • 您是否也想离开sgn <= That(3);行?您无法从多个地方驾驶sgn。这个过程是一个,并发声明似乎是另一个(尽管可能不是 - 很难说)。这不起作用。

看起来你要做的是:

  • 得到你的两个补充。
  • 如果输入为负数,请使用二进制补码,否则使用原始数字(并在sgn上输出相应的值)。

与原始代码最接近的是:

architecture sgnabs4_arch of sgnabs4 is

  component twos_complement4 is
      port (A : in std_logic_vector(3 downto 0);
            T : out std_logic_vector(3 downto 0));
  end component twos_complement4;

  signal tmp : std_logic_vector(3 downto 0);

begin

  twos_complement4_0 : twos_complement4
    port map (A => X, T => tmp);

  sgn <= X(3);

  process (X, tmp)
  begin
    if (X(3) = '1') then
      Xabs <= tmp;
    else
      Xabs <= X;
    end if;
  end process;

end sgnabs4_arch;

tmpX的倒数。如果X为负(即其符号位为'1'),则输出反转,否则输出X。这可能不是完成这项任务的最有效方式,正如安迪所暗示的那样,但它应该有效,可能就是你想要的。

答案 1 :(得分:1)

如果您只需要快速解决方案,可以采用以下方法:

-----------------------------------------------------------------
-- circuit for converting a 4-bit signed integer
-- to a 1-bit sign and a 4-bit absolute value
-----------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sgnabs4 is
   port (X    : in std_logic_vector(3 downto 0);
       sgn  : out std_logic;
       Xabs : out std_logic_vector(3 downto 0));
end sgnabs4;

architecture sgnabs4_arch of sgnabs4 is   

begin

process(X) 

variable tmp    : signed(3 downto 0);

begin

    tmp := signed(X);

    if tmp < 0 then
        sgn     <= '1';
        tmp     := -tmp;
        Xabs    <= std_logic_vector(tmp);
    else
        sgn     <= '0';
        Xabs    <= std_logic_vector(tmp);
    end if;

end process;

end sgnabs4_arch; 

如果您想了解算法是如何工作的,请首先参考维基百科:

http://en.wikipedia.org/wiki/Two%27s_complement

如果您想学习VHDL,最好的方法是寻找教程,然后提出具体问题。