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.
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;
INSTRUCTION_ADDRESS ist ein Array, ich habe es im Paket oben definiert. – MyEntity
Warum möchten Sie den Speicher initialisieren? Entwerfen Sie für FPGA oder ASIC? Oder nur Simulation? – JHBonarius
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