我在VHDL中哪里弄错了?

时间:2016-12-13 17:24:16

标签: vhdl

所以我已经发布了这个,但我没有得到任何答案,所以我决定再试一次。

实体应实现以下算术功能: •减法I1 - I2 •输入操作数1(I1):12位,2位补码 •输入操作数2(I2):8位,2的补码 •输出(O):12位,2位补码 •相应地设置溢出(V)和进位标志(C) •有效标志(VALID):指示计算的解决方案是否有效

那我做了什么?

就是这样:

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.numeric_std.all;

entity arithmetic is

port( I1 :in std_logic_vector(12-1 downto 0); -- Operand 1

I2 :in std_logic_vector(8-1 downto 0); -- Operand 2

O :out std_logic_vector(12-1 downto 0); -- Output

C :out std_logic; -- Carry Flag

V :out std_logic; -- Overflow Flag

VALID :out std_logic -- Flag to indicate if the solution is valid or not

);

end arithmetic;

architecture behavior of arithmetic is

begin

process(I1,I2)

begin

if ((unsigned(I1)-unsigned(I2)) > unsigned(I1)) and 
((unsigned(I1)-unsigned(I2)) > unsigned(I2)) then

C <= '1';

else

C <= '0';

end if;

if I1(11)='1' and signed(std_logic_vector(unsigned(I1)-unsigned(I2)))>0 
then

V <= '1';

else

V <= '0';

end if;

if unsigned(I1) < unsigned(I2) then

VALID <= '0';

else

VALID <= '1';

end if;

O <= std_logic_vector(unsigned(I1)-unsigned(I2));

end process;

end behavior;

没有语法错误或类似的东西。唯一的错误就是 的是:

错误:

COMP2,SUB

I1 = 100000011110

I2 = 01000001

预期:

O = 011111011101

C =&#39; 0&#39;,V =&#39; 1&#39;,VALID =&#39; 0&#39;

收到:

O = 011111011101

C =&#39; 0&#39;,V =&#39; 1&#39;和VALID =&#39; 1&#39;

如果有人可以提供帮助,我会非常感激。

1 个答案:

答案 0 :(得分:0)

如果数字是二进制补码,则签名是正确的类型。

用这两个: 1.使端口签名而不是std_logic_vector或
2.使用内部签名并将所有输入转换为有符号并输出到std_logic_vector一次:

signal I1_sv    : signed(11 downto 0) ;     
. . .
signal result   : signed(11 downto 0) ; 
. . .
I1_sv <= signed(I1) ; 
. . .
O <= std_logic_vector(result) ; 
. . .

您在代码中执行的所有单独类型转换(转换)都使其难以阅读。