我正在为一个学校项目的实验室工作。我们应该最终制作一个程序,向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;
答案 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;
tmp
是X
的倒数。如果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,最好的方法是寻找教程,然后提出具体问题。