2017-11-27 3 views
1

Im folgenden Code besteht das Hauptproblem darin, dass das Array nicht vom Testbech initialisiert wird.Wie initialisiert man ein Array im Prüfstand in VHDL?

Mein Hauptzweck ist es, die folgende Einheit zu entwerfen, die die Adresse liest und die Anweisungen ausgibt. Die Haupteingabe "INSTRUCTION_ADRESS" ist ein Array, das sowohl die Adresse als auch deren Inhalt enthält.

enter image description here

Alle Kommentare sehr geschätzt wird.

library IEEE; 
use IEEE.std_logic_1164.all; 

PACKAGE MIPS_PACKAGE is 

    type INSTRUCTION_ARRAY is array (0 to 31) of std_logic_vector(31 downto 0); 

end PACKAGE MIPS_PACKAGE; 


    -- INSTRUCTION MEMORY -- 
    library IEEE; 
    use IEEE.STD_LOGIC_1164.ALL; 
    use ieee.numeric_std.all; 
    use IEEE.std_logic_unsigned."+"; 

    use work.MIPS_PACKAGE.all; 

    entity INSTRUCTION_MEMORY is 
      port(

       PCSrc : in STD_LOGIC; 
       PC_EXT : in STD_LOGIC_VECTOR (31 downto 0); 

       INSTRUCTION_ADDRESS : in INSTRUCTION_ARRAY; 
       INSTRUCTION  : out STD_LOGIC_VECTOR (31 downto 0) 

       ); 
    end INSTRUCTION_MEMORY; 

    architecture INST_MEM of INSTRUCTION_MEMORY is 

      Signal PC: std_logic_vector (31 downto 0):="00000000000000000000000000000100"; 
      Signal PC_ADD4: std_logic_vector (31 downto 0):=X"00000000";   

    begin 

      INSTRUCTION <= INSTRUCTION_ADDRESS(to_integer(unsigned(PC))); -- INSTRUCTION MEMORY 
      PC_ADD4 <= PC + X"4"; -- ADD 4 

      MUX_PC: process(PCSrc) 

       begin 
        if(PCSrc = '0') then 
         PC <= PC_ADD4; 
        else 
         PC <= PC_EXT; 
        end if; 
       end process MUX_PC; 


    end INST_MEM; 

    ---------- 
    --TESTBENCH 

    library IEEE; 
    use IEEE.Std_logic_1164.all; 
    use IEEE.Numeric_Std.all; 

    use work.MIPS_PACKAGE.all; 

    entity INSTRUCTION_MEMORY_tb is 
    end; 

    architecture bench of INSTRUCTION_MEMORY_tb is 

     component INSTRUCTION_MEMORY 
      port(
       PCSrc : in STD_LOGIC; 
       PC_EXT : in STD_LOGIC_VECTOR (31 downto 0); 
       INSTRUCTION_ADDRESS : in INSTRUCTION_ARRAY; 
        INSTRUCTION  : out STD_LOGIC_VECTOR (31 downto 0) 
       ); 
     end component; 

     signal PCSrc: STD_LOGIC; 
     signal PC_EXT: STD_LOGIC_VECTOR (31 downto 0); 
     signal TestMemory: INSTRUCTION_ARRAY; 
     signal INSTRUCTION: STD_LOGIC_VECTOR (31 downto 0) ; 

    begin 

     uut: INSTRUCTION_MEMORY port map (PCSrc    => PCSrc, 
             PC_EXT    => PC_EXT, 
             INSTRUCTION_ADDRESS => TestMemory, 
             INSTRUCTION   => INSTRUCTION); 

     stimulus: process 
     begin 

     -- Put initialisation code here 

    PCSrc <= '0'; 
    PC_EXT <= "00000000000000000000000000000000";  
    TestMemory(0) <= "10001100000000010000000000000000"; 
    wait for 1 ns; 

    PCSrc <= '0'; 
    PC_EXT <= "00000000000000000000000000000000"; 
    TestMemory(4) <= "10001100000000100000000000000001"; 
    wait for 1 ns; 

    PCSrc <= '0'; 
    PC_EXT <= "00000000000000000000000000000000"; 
    TestMemory(8) <= "00000000001000101000000000100000"; 

    PCSrc <= '0'; 
    PC_EXT <= "00000000000000000000000000000000"; 
    TestMemory(12) <= "00000010000000011000100000100000"; 
    wait for 1 ns; 

    PCSrc <= '0'; 
    PC_EXT <= "00000000000000000000000000000000"; 
    TestMemory(16) <= "10101100000100000000000000000011"; 
    wait for 5 ns; 

     -- Put test bench stimulus code here 

     wait; 
     end process; 


    end; 
+0

INSTRUCTION_ADDRESS ist ein Array, ich habe es im Paket oben definiert. – MyEntity

+0

Warum möchten Sie den Speicher initialisieren? Entwerfen Sie für FPGA oder ASIC? Oder nur Simulation? – JHBonarius

+0

Wie hast du dein Gedächtnis instanziiert? Ich weiß, dass Makros von Xilinx und Altera mit generischen Ram-Initialisierungswerten geliefert werden. Es ist auch möglich, eine Datei an dieselben Speicher während der Simulation zu übergeben. – Ephreal

Antwort

1

Also laufe ich Ihren Code nur durch Vivado und in diesem Simulator, wird das Array genau, wie es sollte erhalten initialisiert: Waveform screencapture

Beachten Sie die TestMemory Wellenform jede Nanosekunde ändern, nur wie erwartet. Da Sie nie das gesamte Array initialisiert haben, bleiben die anderen Werte natürlich 'U'.

Jetzt können Sie Änderungen nur nach 2ns sehen, aber das hat nichts damit zu tun, dass das Array nicht initialisiert wird. Dies liegt daran, MUX_PC: process(PCSrc) hat nur PCSrc in seiner Empfindlichkeitsliste, was bedeutet, dass der Prozess nur einmal ausgeführt wird PCSrc ändert sich tatsächlich. Dies ist höchstwahrscheinlich nicht das gewünschte Verhalten (das würde bedeuten, dass Ihre nur inkrementieren könnte, wenn sich PCSrc ändert). Um dieses Problem zu lösen, fügen Sie Ihrem Entwurf eine Uhr hinzu und entwerfen Sie einen synchronen Prozess.

Verwandte Themen