所以我已经发布了这个,但我没有得到任何答案,所以我决定再试一次。
实体应实现以下算术功能: •减法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;
如果有人可以提供帮助,我会非常感激。
答案 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) ;
. . .
您在代码中执行的所有单独类型转换(转换)都使其难以阅读。