Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] chain propagation of carry (help)

Status
Not open for further replies.

pocho

Junior Member level 1
Joined
Dec 11, 2012
Messages
16
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,379
I made a testbench, which reads two vectors A and B from files and sends them to an adder which in turn sends me the sum and the carry.
Now I have to calculate the maximum length of the chain propagation of carry-overs (in the code from line 70 to 85), but I get the following errors:

** Error: C :/ test / testbench.vhd (72): No feasible entries for infix operator "/ =".
** Error: C :/ test / testbench.vhd (72): No feasible entries for infix operator "/ =".
** Error: C :/ test / testbench.vhd (72): Bad expression in left operand of infix expression "&".
** Error: C :/ test / testbench.vhd (72): Bad expression in right operand of infix expression "&".
** Error: C :/ test / testbench.vhd (72): Type error resolving infix expression "&" as type std.STANDARD.BOOLEAN.
** Error: C :/ test / testbench.vhd (75): near "=": syntax error
** Error: C :/ test / testbench.vhd (81): near "loop": expecting IF
** Error: C :/ test / testbench.vhd (86): near "elsif": expecting END

this is the code:

Code:
ibrary ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    use IEEE.std_logic_textio.ALL;
    use std.textio.all; -- utilizzo del file txt

entity testbench_adder_32bit is
    generic (T0: time:= 10 ns;
             period: time:= 150 ns);
    port (
       A, B: out std_logic_vector(31 downto 0) := conv_std_logic_vector(0,32); -- li setto a 0
       Cin: out std_logic := '0';
       S: in std_logic_vector(31 downto 0) := conv_std_logic_vector(0,32);
       Cout: in std_logic := '0'
    );
end testbench_adder_32bit;


architecture testbench_carry_select_adder_32bit of testbench_adder_32bit is
    type test_vector_type is array (0 to 9) of std_logic_vector (31 downto 0);
    signal j: integer := 0; 
		signal k: integer := 0; 
		signal c: integer := 0;
    signal max_carry_chain: integer := 0;
		signal semaforo: integer := 0;
    signal reference_clock: std_logic := '0';
    signal T0_clock: std_logic := '0';
    signal T0_Cout: std_logic := '0';
    signal T0_reg: std_logic_vector (31 downto 0) := conv_std_logic_vector(0,32);
    signal test_vector_1: test_vector_type;
    signal test_vector_2: test_vector_type;
    signal test_vector_length: integer := 0;
		signal A_carry, B_carry: std_logic_vector(31 downto 0):= conv_std_logic_vector(0,32);
    --signal A_carry, B_carry:test_vector_type;
    begin 
        reference_clock <= not reference_clock after period/2.0;
        T0_clock <= transport reference_clock after T0;
        
        
    read_values: process
             file fp: text open read_mode is "Addizione.vhd";
             variable ln: line;
             variable x, y: std_logic_vector (31 downto 0);
             variable i: integer := 0;
             begin    
								 
                 while not endfile( fp )  loop --fatta modifica Menichelli
                     readline( fp, ln );
										 read( ln, x );
										 read( ln, y );
                     test_vector_1(i) <= x;
                     test_vector_2(i) <= y;
                     i := i+1;
										 end loop;
                 test_vector_length <= i;
             wait;
     end process read_values;
     
     
     input_generator: process (reference_clock)
        begin
            if reference_clock'event and reference_clock = '1' then
                if j < test_vector_length then
                     A <= (test_vector_1(j));
                     B <= (test_vector_2(j));
										 A_carry <= (test_vector_1(j));
										 B_carry <= (test_vector_2(j));
                     j <= j+1;
--------------------------------------------------------------------------------------------
                     for k in 0 to 31 loop														
                           if      ((A_carry(k)/= 0)) & ((B_carry(k)/= 0)) then						 
                                   semaforo<=1;											
                                   c <=c+1;										  
                           elsif     ((A_carry(k)== 1) or (B_carry(k)== 1)) & semaforo then					
                                     c <=c+1;										 
                           else
                                     semaforo<=0;
                                     c <=0;										   
                           end if;
                     end loop;
                     if max_carry_chain < c then									
	                      max_carry_chain<=c;
	                   end if;	
--------------------------------------------------------------------------------------------
                elsif j = test_vector_length then
                    j <= j+1;
                	end if;
            		end if;
        end process input_generator;

        
        
        --output_check: process (reference_clock)
               --begin
                   --if reference_clock'event and reference_clock='1' then
                      -- ASSERT (S = S_ref ) REPORT "Attenzione uscite diverse!" SEVERITY FAILURE;
                 --  end if;
        --end process output_check;
        
        
        --output_at_T0: process (T0_clock)
        --begin
            --if T0_clock'event and T0_clock = '1' then
                --T0_reg <= S;
                --T0_Cout <= Cout;
            --end if;
        --end process output_at_T0;
        
        
        write_result: process( reference_clock )
        file fpo: text open write_mode is "test_result.txt";
        variable lno: line;
        variable xo: bit_vector(31 downto 0);
        variable yo: std_logic;
        begin

            if reference_clock'event and reference_clock = '1' then
                if j/=0 and j<=test_vector_length then
                    xo := to_bitvector( S );
                    write( lno, xo );
                    writeline( fpo, lno );
										yo := Cout;
                    write( lno, yo );
                    writeline( fpo, lno );
                end if;
            end if;
        end process write_result;

end testbench_carry_select_adder_32bit;

please help me
 

1. & is concatenate, not AND.
2. == is not the equality operator, = is.
 

I tried but it does not solve

- - - Updated - - -

I can not solve this:

Error: C:/prova/testbench.vhd(75): No feasible entries for infix operator "and".
** Error: C:/prova/testbench.vhd(75): Type error resolving infix expression "and" as type std.STANDARD.BOOLEAN.
** Error: C:/prova/testbench.vhd(114): VHDL Compiler exiting


in these lines:

elsif ((A_carry(k)= '1') or (B_carry(k)= '1')) and semaforo then

Code:
library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    use IEEE.std_logic_textio.ALL;
    use std.textio.all; -- utilizzo del file txt

entity testbench_adder_32bit is
    generic (T0: time:= 10 ns;
             period: time:= 150 ns);
    port (
       A, B:   out  std_logic_vector(31 downto 0) := conv_std_logic_vector(0,32); -- li setto a 0
       Cin:    out  std_logic := '0';
       S:      in   std_logic_vector(31 downto 0) := conv_std_logic_vector(0,32);
       Cout:   in   std_logic := '0'
    );
end testbench_adder_32bit;


architecture testbench_carry_select_adder_32bit of testbench_adder_32bit is
    type test_vector_type is array (0 to 9) of std_logic_vector (31 downto 0);
    signal j: integer := 0; 
		signal k: integer := 0; 
		signal c: integer := 0;
    signal max_carry_chain:       integer := 0;
		signal semaforo:              std_logic :='0';
    signal reference_clock:       std_logic := '0';
    signal T0_clock:              std_logic := '0';
    signal T0_Cout:               std_logic := '0';
    signal T0_reg:                std_logic_vector (31 downto 0) := conv_std_logic_vector(0,32);
    signal test_vector_1: test_vector_type;
    signal test_vector_2: test_vector_type;
    signal test_vector_length:    integer := 0;
		signal A_carry, B_carry:      std_logic_vector(31 downto 0):= conv_std_logic_vector(0,32);

    begin 
        reference_clock <= not reference_clock after period/2.0;
        T0_clock <= transport reference_clock after T0;
        
        
    read_values: process
             file fp: text open read_mode is "Addizione.vhd";
             variable ln:   line;
             variable x, y: std_logic_vector (31 downto 0);
             variable i:    integer := 0;
             begin    
								 
                 while not endfile( fp )  loop --fatta modifica Menichelli
                     readline( fp, ln );
										 read( ln, x );
										 read( ln, y );
                     test_vector_1(i) <= x;
                     test_vector_2(i) <= y;
                     i := i+1;
										 end loop;
                 test_vector_length <= i;
             wait;
     end process read_values;
     
     
     input_generator: process (reference_clock)
        begin
            if reference_clock'event and reference_clock = '1' then
                if j < test_vector_length then
                     A <= (test_vector_1(j));
                     B <= (test_vector_2(j));
										 A_carry <= (test_vector_1(j));
										 B_carry <= (test_vector_2(j));
                     j <= j+1;
--------------------------------------------------------------------------------------------
                     for k in 0 to 31 loop														
                           if      ((A_carry(k)= '1')) and ((B_carry(k)= '1')) then						 
                                   semaforo <='1';											
                                   c <=c+1;										  
                           elsif     ((A_carry(k)= '1') or (B_carry(k)= '1')) and semaforo then					
                                     c <=c+1;										 
                           else
                                     semaforo<='0';
                                     c <=0;										   
                           end if;
                     end loop;
                     if max_carry_chain < c then									
	                      max_carry_chain<=c;
	                   end if;	
--------------------------------------------------------------------------------------------
                elsif j = test_vector_length then
                    j <= j+1;
                	end if;
            		end if;
        end process input_generator;

       
       
        
        write_result: process( reference_clock )
        file fpo: text open write_mode is "test_result.txt";
        variable lno: line;
        variable xo: bit_vector(31 downto 0);
        variable yo: std_logic;
        begin

            if reference_clock'event and reference_clock = '1' then
                if j/=0 and j<=test_vector_length then
                    xo := to_bitvector( S );
                    write( lno, xo );
                    writeline( fpo, lno );
										yo := Cout;
                    write( lno, yo );
                    writeline( fpo, lno );
                end if;
            end if;
        end process write_result;

end testbench_carry_select_adder_32bit;
 

New code, new errors. Keep on learning VHDL!

Code:
elsif ((A_carry(k)= '1') or (B_carry(k)= '1')) and semaforo then

Left side of AND is boolean, right side is std_logic. Can't work.

Try:
Code:
elsif ((A_carry(k)= '1') or (B_carry(k)= '1')) and (semaforo = '1') then
 

it works!! thank you
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top