Error in my program

Guest #4825067
The entity shall implement the following arithmetic functionality:
• Substraction I1 - I2
• Input operand 1 (I1): 12 bit, two’s complement
• Input operand 2 (I2): 8 bit, two’s complement
• Output (O): 12 bit, two’s complement
• Overflow (V) and Carry flag (C) set accordingly
• Valid flag (VALID): indicates if the computed solution is valid or not

So what I have done?

Here is it:

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;


There is no syntax mistakes or something like that. Only mistake is 
that:

Error for:

comp2,SUB

I1= 100000011110

I2= 01000001

Expected:

O= 011111011101

C= '0', V= '1', VALID= '0'

Received:

O= 011111011101

C= '0', V= '1' and VALID= '1'


If someone could help I would be really thankful.
Guest
I am times so free:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
entity arithmetic is
5
port( I1 :in std_logic_vector(12-1 downto 0); -- Operand 1
6
I2 :in std_logic_vector(8-1 downto 0); -- Operand 2
7
O :out std_logic_vector(12-1 downto 0); -- Output
8
C :out std_logic; -- Carry Flag
9
V :out std_logic; -- Overflow Flag
10
VALID :out std_logic -- Flag to indicate if the solution is valid or not
11
);
12
end arithmetic;
architecture behavior of arithmetic is
1
begin
2
process(I1,I2)
3
begin
4
if ((unsigned(I1)-unsigned(I2)) > unsigned(I1)) and ((unsigned(I1)-unsigned(I2)) > unsigned(I2)) then
5
C <= '1';
6
else
7
C <= '0';
8
end if;
9
if I1(11)='1' and signed(std_logic_vector(unsigned(I1)-unsigned(I2)))>0 then
10
V <= '1';
11
else
12
V <= '0';
13
end if;
14
if unsigned(I1) < unsigned(I2) then
15
VALID <= '0';
16
else
17
VALID <= '1';
18
end if;
19
O <= std_logic_vector(unsigned(I1)-unsigned(I2));
20
end process;
21
end behavior;
There is no syntax mistakes or something like that. Only mistake is 
that:
1
Error for:
2
comp2,SUB
3
I1= 100000011110
4
I2= 01000001
5
Expected:
6
O= 011111011101
7
C= '0', V= '1', VALID= '0'
8
Received:
9
O= 011111011101
10
C= '0', V= '1' and VALID= '1'
If someone could help I would be really thankful.
Moderator (Company: Titel)
As an unsigned 100000011110 is 2078 and 01000001 is 64 the result you 
get is that whats written in the code:
1
if 2078 < 65 then 
2
   VALID <= '0';
3
else
4
   VALID <= '1'; 
5
end if;
So, the remaining question is: what did you want to achieve by that 
compare operation?

I would run the subtraction on 13 bit vectors (resize() both vectors to 
13 bit and perform the operation on those vectors) and then have a look 
how the both MSB behave.

Reply

A question of your own? This thread is over 9 years old. Ask it in a thread of its own – more people read along there, and it gets answered more often and sooner.

Start a new thread

A fix, an addition or feedback on this thread? Then reply here.

Formatting
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.