【问题标题】:VHDL If/Else statementVHDL If/Else 语句
【发布时间】:2014-11-14 03:54:55
【问题描述】:

我正在尝试为学校项目开发实验室。我们应该最终制作一个程序,将有符号整数值显示到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; 

【问题讨论】:

  • 您需要将 if 语句放在一个进程中。 'sgn => Xabs(3)` 在这里也不起作用。

标签: if-statement vhdl


【解决方案1】:

安迪的回答可能是有效的,但它根本不能解释你的问题。所以:

正如 sebs 在 cmets 中指出的那样,您的 if 语句需要处于进程中。 if 语句是连续的;架构主体中的进程外只允许并发语句。

虽然 sebs 指出的两个修复可能允许您的代码编译(取决于您如何处理我将在稍后讨论的另一位),但它仍然无法正常工作。

  • 您的组件实例twos_complement4_0 已将Ahat 映射到其输入端口,并将That 映射到其输出端口,但是您没有在代码中的任何位置为Ahat 分配值,那么@987654327 将如何@ 是?可能没什么用处。如果您复制并粘贴了它,您需要了解它的作用才能适当地对其进行修改。寻找教程,特别是关于组件实例化和端口映射的教程。
  • 你是不是也想离开sgn &lt;= 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-liner 而不是一个过程:Xabs &lt;= tmp when X(3)='1' else X;
  • 是的,并发分配会更短 - 我的意图是在原始代码的基础上进行更小的飞跃,以便更好地说明关键差异。
【解决方案2】:

如果你只需要一个快速的解决方案,你可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2017-02-05
    • 2015-07-06
    • 2012-08-05
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多