2014-11-14 211 views
0

我正在尝试为一个学校项目的实验室工作。我们应该最终制作一个程序,将有符号的整数值显示给altera板。这是一路上的步骤之一,我卡住了。我无法弄清楚为什么if/else语句不能编译,我是VHDL的新手,请大家帮忙。VHDL If/Else语句

----------------------------------------------------------------- 
-- 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; 
+1

您需要将if语句放入进程中。另外'sgn => Xabs(3)'在这里不起作用。 – sebs

回答

2

Andy的回答可能是有效的,但它并不能解释你的问题。所以:

正如在评论中指出的那样,您的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。这可能不是完成此任务的最有效方式,正如Andy所暗示的那样,但它应该有效,并且可能是您的意图。

+0

他们也可以做一个1班轮,而不是一个进程:'Xabs <= tmp当X(3)='1'else X;' – QuantumRipple

+0

是的,并发任务会更短 - 我的意图是做一个为了说明关键差异更好一点,从原始代码中跳跃得更小。 – fru1tbat

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,最好的方法是寻找教程,然后提出具体问题。