cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
adrialex
Visitor
Visitor
1,958 Views
Registered: ‎08-05-2009

error after post-route simulation

i have this code below and i does not give a correct waveform after post-route simulation. all my other components were sythesized and the only problem is when i put them together. could anyone please tell me what the problem is. thank you.

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity datapath is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           inst : in  STD_LOGIC_VECTOR (1 downto 0);
           inst_fetch : out  STD_LOGIC;
           inst_done : out  STD_LOGIC;
           operandA : out  STD_LOGIC_VECTOR (7 downto 0);
           operandB : out  STD_LOGIC_VECTOR (7 downto 0);
           result : out  STD_LOGIC_VECTOR (7 downto 0));
end datapath;

architecture Behavioral of datapath is


     COMPONENT control
    PORT(
         clk : IN  std_logic;
         rst : IN  std_logic;
         done : IN  std_logic;
         inst : IN  std_logic_vector(1 downto 0);
         operation : OUT  std_logic_vector(3 downto 0);
         dest : OUT  std_logic_vector(3 downto 0);
         sourceA : OUT  std_logic_vector(3 downto 0);
         sourceB : OUT  std_logic_vector(3 downto 0);
         wr_en : OUT  std_logic;
         mult_en : OUT  std_logic;
         inst_fetch : OUT  std_logic;
         wr_data : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
     
     COMPONENT regfile
    PORT(
         clk : IN  std_logic;
         rst : IN  std_logic;
         rdA : IN  std_logic_vector(3 downto 0);
         rdB : IN  std_logic_vector(3 downto 0);
         dest : IN  std_logic_vector(3 downto 0);
         wr_data : IN  std_logic_vector(7 downto 0);
         wr_en : IN  std_logic;
         operandA : OUT  std_logic_vector(7 downto 0);
         operandB : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
     
     COMPONENT functions
    PORT(
         clk : IN  std_logic;
         rst : IN  std_logic;
         operation : IN  std_logic_vector(3 downto 0);
         sourceA : IN  std_logic_vector(7 downto 0);
         sourceB : IN  std_logic_vector(7 downto 0);
         en : IN  std_logic;
         result : OUT  std_logic_vector(7 downto 0);
         done : OUT  std_logic
        );
    END COMPONENT;
     
     --INPUTS
        SIGNAL wr_data_reg : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL wr_en_reg : STD_LOGIC;
       
     --OUTPUTS
        SIGNAL wr_en_ctrl,mult_en_ctrl : STD_LOGIC;
        SIGNAL op_ctrl,dest_ctrl,srcA_ctrl,srcB_ctrl : STD_LOGIC_VECTOR(3 downto 0);
        SIGNAL wr_data_ctrl : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL opA_reg, opB_reg : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL result_fcn : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL done_fcn : STD_LOGIC;
begin
   
    ctrl: control PORT MAP (
          clk => clk,
          rst => rst,
          done => done_fcn,
          inst => inst,
          operation => op_ctrl,
          dest => dest_ctrl,
          sourceA => srcA_ctrl,
          sourceB => srcB_ctrl,
          wr_en => wr_en_ctrl,
          mult_en => mult_en_ctrl,
          inst_fetch => inst_fetch,
          wr_data => wr_data_ctrl
   );
         
    reg: regfile PORT MAP (
          clk => clk,
          rst => rst,
          rdA => srcA_ctrl,
          rdB => srcB_ctrl,
          dest => dest_ctrl,
          wr_data => wr_data_reg,
          wr_en => wr_en_reg,
          operandA => opA_reg,
          operandB => opB_reg
   );
   
    fcn: functions PORT MAP (
          clk => clk,
          rst => rst,
          operation => op_ctrl,
          sourceA => opA_reg,
          sourceB => opB_reg,
          en => mult_en_ctrl,
          result => result_fcn,
          done => done_fcn
   );

    wr_reg : process(wr_en_ctrl,done_fcn,result_fcn)
    begin
        if done_fcn = '1' then
            if wr_en_ctrl = '1' then
                wr_en_reg <= wr_en_ctrl;
                wr_data_reg <= wr_data_ctrl;
            else
                wr_en_reg <= done_fcn;
                wr_data_reg <= result_fcn;
            end if;
        else
            wr_en_reg <= '0';
        end if;
    end process;
   
    fcn_done : process(done_fcn)
    begin
        inst_done <= done_fcn;
    end process;
   
    outputs : process(opA_reg,opB_reg,result_fcn)
    begin
        operandA <= opA_reg;
        operandB <= opB_reg;
        result <= result_fcn;
    end process;
   
end Behavioral;

 

COMPONENTS (all other components were not included but just inform me if you need them)

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity control is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
              done : in STD_LOGIC;
           inst : in  STD_LOGIC_VECTOR (1 downto 0);
           operation : out  STD_LOGIC_VECTOR (3 downto 0);
           dest : out  STD_LOGIC_VECTOR (3 downto 0);
           sourceA : out  STD_LOGIC_VECTOR (3 downto 0);
           sourceB : out  STD_LOGIC_VECTOR (3 downto 0);
           wr_en : out  STD_LOGIC;
           mult_en : out  STD_LOGIC;
              inst_fetch : out STD_LOGIC;
           wr_data : out  STD_LOGIC_VECTOR (7 downto 0));
end control;

architecture Behavioral of control is
   
    SIGNAL cstate,nstate : STD_LOGIC_VECTOR(3 downto 0);
    SIGNAL temp : STD_LOGIC_VECTOR(15 downto 0);
   
begin
   
    changes : process(rst,clk)
    begin
        if rst = '1' then
            cstate <= "0000";
        else
            if clk'event and clk = '1' then
                if done = '1' then
                    cstate <= "0000";
                else
                    cstate <= nstate;
                end if;
            end if;
        end if;
    end process;
   
    instances : process(cstate,temp,inst)
    begin
        case cstate is
            when "0000" =>
                temp(15 downto 14) <= inst;
                operation <= "0000";
                sourceA <= "0000";    sourceB <= "0000";
                wr_en <= '0';            mult_en <= '0';
                inst_fetch <= '0';
                nstate <= "0001";
            when "0001" =>
                temp(13 downto 12) <= inst;
                inst_fetch <= '1';
                nstate <= "0010";
            when "0010" =>
                temp(11 downto 10) <= inst;
                inst_fetch <= '1';
                nstate <= "0011";
            when "0011" =>
                temp(9 downto 8) <= inst;
                inst_fetch <= '1';
                nstate <= "0100";
            when "0100" =>
                temp(7 downto 6) <= inst;
                inst_fetch <= '1';
                nstate <= "0101";
            when "0101" =>
                temp(5 downto 4) <= inst;
                inst_fetch <= '1';
                nstate <= "0110";
            when "0110" =>
                temp(3 downto 2) <= inst;
                inst_fetch <= '1';
                nstate <= "0111";
            when "0111" =>
                temp(1 downto 0) <= inst;
                inst_fetch <= '1';
                nstate <= "1000";
            when "1000" =>
                inst_fetch <= '0';
                if temp(15 downto 14) = "00" then
                    if temp(13 downto 12) = "01" then
                       
                        dest <= temp(11 downto 8);
                        sourceA <= temp(7 downto 4);
                        sourceB <= temp(3 downto 0);
                    else
                       
                        dest <= temp(11 downto 8);
                        sourceA <= temp(7 downto 4);
                        sourceB <= temp(3 downto 0);
                    end if;
                    nstate <= "1001";
                end if;
               
                if temp(15 downto 14) = "01" then
               
                    dest <= temp(13 downto 10);
                    sourceA <= temp(9 downto 6);
                    sourceB <= temp(5 downto 2);
                   
                    nstate <= "1001";
                end if;
               
                if temp(15 downto 14) = "10" then
                    if temp(13 downto 12) = "01" then
                       
                        dest <= temp(11 downto 8);
                        sourceA <= temp(7 downto 4);
                        sourceB <= "0000";
                    else
                       
                        dest <= temp(11 downto 8);
                        sourceA <= temp(7 downto 4);
                        sourceB <= "0000";
                    end if;
                    nstate <= "1001";
                end if;
               
                if temp(15 downto 14) = "11" then
                    if temp(13 downto 12) = "01" then
                        dest <= temp(11 downto 8);
                        wr_data <= temp(7 downto 0);
                        sourceA <= "0000";
                        sourceB <= "0000";
                    else
                        dest <= temp(11 downto 8);
                        sourceA <= "0000";
                        sourceB <= "0000";
                    end if;
                    nstate <= "1001";
                end if;
            when "1001" =>
                if temp(15 downto 14) = "00" then
                    if temp(13 downto 12) = "01" then
                        operation <= "0001";
                    else
                        operation <= "0010";
                    end if;
                end if;
                if temp(15 downto 14) = "01" then
                    operation <= "0100";
                    mult_en <= '1';
                end if;
                if temp(15 downto 14) = "10" then
                    if temp(13 downto 12) = "01" then
                        operation <= "1001";
                    else
                        operation <= "1010";
                    end if;
                end if;
                if temp(15 downto 14) = "11" then
                    if temp(13 downto 12) = "01" then
                        operation <= "1101";
                    else
                        operation <= "1110";
                    end if;
                end if;
                nstate <= "1010";
            when others =>
                if temp(15 downto 14) = "01" then
                    mult_en <= '0';
                elsif temp(15 downto 12) = "1101" then
                    wr_en <= '1';
                end if;
                nstate <= "1010";
        end case;
           
    end process;

end Behavioral;

 

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity functions is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           operation : in  STD_LOGIC_VECTOR (3 downto 0);
           sourceA : in  STD_LOGIC_VECTOR (7 downto 0);
           sourceB : in  STD_LOGIC_VECTOR (7 downto 0);
           en : in  STD_LOGIC;
           result : out  STD_LOGIC_VECTOR (7 downto 0);
           done : out  STD_LOGIC);
end functions;

architecture Behavioral of functions is
   
    SIGNAL cstate, nstate : STD_LOGIC_VECTOR(2 downto 0);
    SIGNAL d : STD_LOGIC;
    SIGNAL temp : STD_LOGIC_VECTOR(3 downto 0);
    SIGNAL temp_prod : STD_LOGIC_VECTOR(7 downto 0);
   
    COMPONENT adder
    PORT(
         rst : IN  std_logic;
         operandA : IN  std_logic_vector(7 downto 0);
         operandB : IN  std_logic_vector(7 downto 0);
         carry_in : IN  std_logic;
         carry_out : OUT  std_logic;
         sum : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
     
    COMPONENT multiplier
    PORT(
        clk : IN std_logic;
        rst : IN std_logic;
        en : IN std_logic;
        opA : IN std_logic_vector(3 downto 0);
        opB : IN std_logic_vector(3 downto 0);         
        res : OUT std_logic_vector(7 downto 0);
        done : OUT std_logic
        );
     END COMPONENT;
   
    COMPONENT inverter
    PORT(
         rst : IN  std_logic;
         operand : IN  std_logic_vector(7 downto 0);
         result : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
     
     COMPONENT compliment
    PORT(
         rst : IN  std_logic;
         operand : IN  std_logic_vector(7 downto 0);
         result : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
   
    --INPUTS
        SIGNAL op_add1,op_add2 : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL op_inv : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL op_mult1,op_mult2 : STD_LOGIC_VECTOR(3 downto 0);
        SIGNAL op_comp : STD_LOGIC_VECTOR(7 downto 0);
       
    --OUTPUTS
        SIGNAL sum_add : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL res_mult : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL res_inv : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL res_comp : STD_LOGIC_VECTOR(7 downto 0);
        SIGNAL carry_out_add : STD_LOGIC;
        SIGNAL done_mult : STD_LOGIC;
       
begin
    add: adder PORT MAP (
          rst => rst,
          operandA => op_add1,
          operandB => op_add2,
          carry_in => '0',
          carry_out => carry_out_add,
          sum => sum_add
   );
   
    multiply: multiplier PORT MAP(
        clk => clk,
        rst => rst,
        en => en,
        opA => op_mult1,
        opB => op_mult2,
        res => res_mult,
        done => done_mult
    );
   
    invert: inverter PORT MAP (
          rst => rst,
          operand => op_inv,
          result => res_inv
   );
   
    complimenter: compliment PORT MAP (
          rst => rst,
          operand => op_comp,
          result => res_comp
   );
   
    changes : process(rst,clk)
    begin
        if rst = '1' then
            cstate <= "000";
        else
            if clk'event and clk = '1' then
                cstate <= nstate;
            end if;
        end if;
    end process;
   
    states : process(cstate,temp,operation,sourceA,sourceB,sum_add,res_inv,res_mult,done_mult,temp_prod)
    begin
        case cstate is
            when "000" =>
                temp <= operation;
                if operation = "0000" then
                    nstate <= "000";
                elsif operation = "0100" then
                    op_mult1 <= sourceA(3 downto 0);
                    op_mult2 <= sourceB(3 downto 0);
                    nstate <= "001";
                elsif operation = "0010" then
                    op_comp <= sourceB;
                    nstate <= "001";
                elsif operation = "1001" then
                    op_inv <= sourceA;
                    nstate <= "001";
                else
                    nstate <= "001";
                end if;
            when "001" =>
                if temp = "0001" then
                    op_add1 <= sourceA;
                    op_add2 <= sourceB;
                    result <= sum_add;
                    done <= '1';
                    nstate <= "010";
                elsif temp = "0010" then
                    op_add1 <= sourceA;
                    op_add2 <= res_comp;
                    result <= sum_add;
                    done <= '1';
                    nstate <= "010";
                elsif temp = "0100" then
                    nstate <= "010";
                elsif temp = "1001" then
                    result <= res_inv;
                    done <= '1';
                    nstate <= "010";
                elsif temp = "1010" then
                    result <= sourceA;
                    done <= '1';
                    nstate <= "010";
                elsif temp = "1101" then
                    result <= "00000000";
                    done <= '1';
                    nstate <= "010";
                elsif temp = "1110" then
                    result <= "00000000";
                    done <= '1';
                    nstate <= "010";
                else
                    nstate <= "000";
                end if;
            when "010" =>
                if temp = "0001" then
                    done <= '0';
                    nstate <= "000";
                elsif temp = "0010" then
                    done <= '0';
                    nstate <= "000";
                elsif temp = "0100" then
                    nstate <= "011";
                elsif temp = "1001" then
                    done <= '0';
                    nstate <= "000";
                elsif temp = "1010" then
                    done <= '0';
                    nstate <= "000";
                elsif temp = "1101" then
                    done <= '0';
                    nstate <= "000";
                elsif temp = "1110" then
                    result <= "00000000";
                    done <= '0';
                    nstate <= "000";
                else
                    done <= '0';
                    nstate <= "000";
                end if;
            when "011" =>
                if temp = "0100" then
                    nstate <= "100";
                else
                    nstate <= "000";
                    done <= '0';
                end if;
            when "100" =>
                if temp = "0100" then
                    nstate <= "101";
                else
                    nstate <= "000";
                    done <= '0';
                end if;
            when "101" =>
                if temp = "0100" then
                    result <= res_mult;
                    temp_prod <= res_mult;
                    done <= '1';
                    nstate <= "110";
                else
                    done <= '0';
                    nstate <= "000";
                end if;
            when "110" =>
                if temp = "0100" then
                    result <= temp_prod;
                    done <= '0';
                    nstate <= "000";
                else
                    done <= '0';
                    nstate <= "000";
                end if;
            when others =>   
                done <= '0';
                nstate <= "000";
        end case;
   
    end process;

end Behavioral;

 

0 Kudos
0 Replies