mirror of
https://github.com/Klagarge/Cursor.git
synced 2025-06-26 04:12:31 +00:00
Initial commit
This commit is contained in:
528
Libs/Memory_test/hdl/Flash_behav.vhd
Normal file
528
Libs/Memory_test/hdl/Flash_behav.vhd
Normal file
@ -0,0 +1,528 @@
|
||||
use std.textio.all;
|
||||
|
||||
ARCHITECTURE behav OF flash_28F128J3A IS
|
||||
-- controls
|
||||
signal chipSelect : std_ulogic;
|
||||
signal writePulse : std_ulogic;
|
||||
signal writePulseDelayed : std_ulogic;
|
||||
signal memoryCommand : unsigned(7 downto 0);
|
||||
signal wordProgramBusy : std_ulogic := '0';
|
||||
signal blockEraseBusy : std_ulogic := '0';
|
||||
signal busy : std_ulogic;
|
||||
signal readPulseCs : std_ulogic := '0';
|
||||
signal readPulseOe : std_ulogic := '0';
|
||||
signal readPulse : std_ulogic;
|
||||
|
||||
signal memoryAddressDebug : unsigned(A'range);
|
||||
|
||||
type state_type is (
|
||||
READ_ARRAY,
|
||||
READ_ID_CODES,
|
||||
READ_QUERY,
|
||||
READ_STATUS,
|
||||
WRITE_BUFFER,
|
||||
WORD_PROGRAM_1,
|
||||
WORD_PROGRAM_2,
|
||||
BLOCK_ERASE_1,
|
||||
BLOCK_ERASE_2,
|
||||
CONFIG,
|
||||
PROG_LOCK_BITS,
|
||||
PROG_PROT,
|
||||
BOTCH_LOCK,--
|
||||
BOTCH_LOCK_ERS_SUSP,--
|
||||
LOCK_DONE,
|
||||
PROG_LOCK_BITS_ERS_SUSP,--
|
||||
LOCK_DONE_ERS_SUSP,
|
||||
PROT_PROG_BUSY,--
|
||||
PROT_PROG_DONE,--
|
||||
WORD_PROGRAM_1_ERS_SUSP,--
|
||||
PROG_BUSY,--
|
||||
PROG_BUSY_ERS_SUSP,--
|
||||
READ_STATUS_PROG_SUSP,--
|
||||
READ_ARRAY_PROG_SUSP,--
|
||||
READ_CONFIG_PROG_SUSP,--
|
||||
READ_QUERY_PROG_SUSP,--
|
||||
PROGRAM_DONE,--
|
||||
PROGRAM_DONE_ERS_SUSP,--
|
||||
BOTCH_ERS,--
|
||||
ERASE_BUSY,--
|
||||
READ_STATUS_ERS_SUSP,--
|
||||
READ_ARRAY_ERS_SUSP,--
|
||||
READ_CONFIG_ERS_SUSP,--
|
||||
READ_QUERY_ERS_SUSP,--
|
||||
ERASE_DONE--
|
||||
);
|
||||
|
||||
signal currentState : state_type;
|
||||
signal nextState : state_type;
|
||||
-- storage
|
||||
constant blockLength : positive:= 16#10000#; -- 64 Kword blocks
|
||||
constant memoryLength: positive := 2**(A'length-1);
|
||||
-- constant memoryLength : positive := 2*blockLength;
|
||||
subtype memoryWord is std_ulogic_vector(DQ'range);
|
||||
type memoryArray is array(0 to memoryLength-1) of memoryWord;
|
||||
signal memoryDataWord : memoryWord;
|
||||
|
||||
BEGIN
|
||||
|
||||
--############################################################################
|
||||
-- Controls
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
chipSelect <= ( (not CE(2)) and (not CE(1)) and (not CE(0)) ) or
|
||||
( CE(2) and ( (not CE(1)) or (not CE(0)) ) );
|
||||
writePulse <= chipSelect and not(WE_n);
|
||||
writePulseDelayed <= writePulse after 1 ns;
|
||||
|
||||
memoryCommand <= unsigned(DQ(memoryCommand'range));
|
||||
|
||||
process(chipSelect)
|
||||
begin
|
||||
if rising_edge(chipSelect) then
|
||||
readPulseCs <= '1' after T_R3;
|
||||
elsif falling_edge(chipSelect) then
|
||||
readPulseCs <= '0' after T_R8;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
process(OE_n)
|
||||
begin
|
||||
if falling_edge(OE_n) then
|
||||
readPulseOe <= '1' after T_R7;
|
||||
elsif rising_edge(OE_n) then
|
||||
readPulseOe <= '0' after T_R9;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
readPulse <= readPulseCs and readPulseOe;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- Programming delays
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
wordProgramBusy <= '1', '0' after T_W16_program when currentState = WORD_PROGRAM_2;
|
||||
blockEraseBusy <= '1', '0' after T_W16_erase when currentState = BLOCK_ERASE_2;
|
||||
busy <= wordProgramBusy or blockEraseBusy;
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- FSM: find next state
|
||||
------------------------------------------------------------------------------
|
||||
-- Table 4 p. 12
|
||||
process(writePulse, busy)
|
||||
begin
|
||||
case currentState is
|
||||
when READ_ARRAY | READ_ID_CODES | READ_QUERY | READ_STATUS =>
|
||||
case to_integer(memoryCommand) is
|
||||
when 16#FF# => nextState <= READ_ARRAY;
|
||||
when 16#90# => nextState <= READ_ID_CODES;
|
||||
when 16#98# => nextState <= READ_QUERY;
|
||||
when 16#70# => nextState <= READ_STATUS;
|
||||
when 16#E8# => nextState <= WRITE_BUFFER;
|
||||
when 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
when 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
when 16#B8# => nextState <= CONFIG;
|
||||
when 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
when 16#C0# => nextState <= PROG_PROT;
|
||||
when others => nextState <= READ_ARRAY;
|
||||
end case;
|
||||
|
||||
when WORD_PROGRAM_1 =>
|
||||
nextState <= WORD_PROGRAM_2;
|
||||
|
||||
when WORD_PROGRAM_2 =>
|
||||
nextState <= READ_ARRAY;
|
||||
|
||||
when BLOCK_ERASE_1 =>
|
||||
if to_integer(memoryCommand) = 16#D0# then
|
||||
nextState <= BLOCK_ERASE_2;
|
||||
else
|
||||
nextState <= READ_ARRAY;
|
||||
end if;
|
||||
|
||||
when BLOCK_ERASE_2 =>
|
||||
nextState <= READ_ARRAY;
|
||||
|
||||
-- WHEN PROG_LOCK_BITS =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- -- SECOND CYCLE CHECK
|
||||
-- IF data=16#D0# OR data=16#01# OR data=16#2F# THEN
|
||||
-- nextState<=READ_ARRAY;
|
||||
-- ELSE
|
||||
-- nextState <= BOTCH_LOCK;
|
||||
-- END IF;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROG_LOCK_BITS_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- IF data=16#D0# OR data=16#01# OR data=16#2F# THEN
|
||||
-- nextState<=READ_ARRAY_ERS_SUSP;
|
||||
-- ELSE
|
||||
-- nextState <= BOTCH_LOCK_ERS_SUSP;
|
||||
-- END IF;
|
||||
-- END IF;
|
||||
--
|
||||
--
|
||||
-- WHEN LOCK_DONE =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN LOCK_DONE_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1_ERS_SUSP;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS_ERS_SUSP;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG_ERS_SUSP;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY_ERS_SUSP;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS_ERS_SUSP;
|
||||
-- WHEN 16#D0# => nextState <= ERASE_BUSY;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY_ERS_SUSP;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN BOTCH_LOCK =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN BOTCH_LOCK_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# =>
|
||||
-- nextState <= WORD_PROGRAM_1_ERS_SUSP;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS_ERS_SUSP;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG_ERS_SUSP;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY_ERS_SUSP;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS_ERS_SUSP;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY_ERS_SUSP;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
--
|
||||
-- WHEN BOTCH_ERS =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# =>
|
||||
-- nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <=BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
--
|
||||
-- WHEN PROG_PROT =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- nextState <= PROT_PROG_BUSY;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROT_PROG_BUSY =>
|
||||
-- IF S_Reg(7)='1' THEN
|
||||
-- nextState <= PROT_PROG_DONE;
|
||||
-- ELSE
|
||||
-- nextState <= PROT_PROG_BUSY;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROT_PROG_DONE =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN WORD_PROGRAM_1 =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- nextState <= PROG_BUSY;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN WORD_PROGRAM_1_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- nextState <= PROG_BUSY_ERS_SUSP;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROG_BUSY =>
|
||||
-- IF WDone THEN
|
||||
-- nextState<=PROGRAM_DONE;
|
||||
-- ELSIF rising_edge(WENeg) THEN
|
||||
-- IF data= 16#B0# THEN
|
||||
-- nextState <= READ_STATUS_PROG_SUSP;
|
||||
-- ELSE
|
||||
-- nextState <= PROG_BUSY;
|
||||
-- END IF;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROG_BUSY_ERS_SUSP =>
|
||||
-- IF WDone THEN
|
||||
-- nextState<=PROGRAM_DONE_ERS_SUSP;
|
||||
-- ELSIF rising_edge(WENeg) THEN
|
||||
-- nextState <= PROG_BUSY_ERS_SUSP;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN READ_STATUS_PROG_SUSP | READ_ARRAY_PROG_SUSP |
|
||||
-- READ_CONFIG_PROG_SUSP | READ_QUERY_PROG_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- --WHEN 16#D0# => nextState <= READ_ARRAY_PROG_SUSP;
|
||||
-- WHEN 16#D0# => nextState <= PROG_BUSY;
|
||||
-- WHEN 16#B0# | 16#70# => nextState <= READ_STATUS_PROG_SUSP;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG_PROG_SUSP;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY_PROG_SUSP;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY_PROG_SUSP;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROGRAM_DONE =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN PROGRAM_DONE_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1_ERS_SUSP;
|
||||
-- WHEN 16#B0# | 16#70# => nextState <= READ_STATUS_ERS_SUSP;
|
||||
-- WHEN 16#D0# => nextState <= ERASE_BUSY;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG_ERS_SUSP;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY_ERS_SUSP;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS_ERS_SUSP;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY_ERS_SUSP;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
--
|
||||
-- WHEN ERASE_BUSY =>
|
||||
-- IF rising_edge(WENeg) AND data= 16#B0# THEN
|
||||
-- nextState <= READ_STATUS_ERS_SUSP;
|
||||
-- ELSIF EDone AND ECount=31 THEN
|
||||
-- nextState<=ERASE_DONE;
|
||||
-- ELSE
|
||||
-- nextState <= ERASE_BUSY;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN READ_STATUS_ERS_SUSP | READ_ARRAY_ERS_SUSP |
|
||||
-- READ_CONFIG_ERS_SUSP | READ_QUERY_ERS_SUSP =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <=WORD_PROGRAM_1_ERS_SUSP;
|
||||
-- WHEN 16#B0# | 16#70# | 16#80# =>
|
||||
-- nextState<= READ_STATUS_ERS_SUSP;
|
||||
-- WHEN 16#D0# => nextState <= ERASE_BUSY;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG_ERS_SUSP;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY_ERS_SUSP;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS_ERS_SUSP;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY_ERS_SUSP;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
--
|
||||
-- WHEN ERASE_DONE =>
|
||||
-- IF rising_edge(WENeg) THEN
|
||||
-- CASE data IS
|
||||
-- WHEN 16#10# | 16#40# => nextState <= WORD_PROGRAM_1;
|
||||
-- WHEN 16#20# => nextState <= BLOCK_ERASE_1;
|
||||
-- WHEN 16#70# => nextState <= READ_STATUS;
|
||||
-- WHEN 16#90# => nextState <= READ_CONFIG;
|
||||
-- WHEN 16#98# => nextState <= READ_QUERY;
|
||||
-- WHEN 16#60# => nextState <= PROG_LOCK_BITS;
|
||||
-- WHEN 16#C0# => nextState <= PROG_PROT;
|
||||
-- WHEN OTHERS => nextState <= READ_ARRAY;
|
||||
-- END CASE;
|
||||
-- END IF;
|
||||
|
||||
when others => nextState <= READ_ARRAY;
|
||||
|
||||
end case;
|
||||
end process;
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- FSM: update state
|
||||
------------------------------------------------------------------------------
|
||||
process(RP_N, writePulseDelayed, busy)
|
||||
begin
|
||||
if RP_n = '0' then
|
||||
currentState <= READ_ARRAY;
|
||||
elsif falling_edge(writePulseDelayed) then
|
||||
currentState <= nextState;
|
||||
elsif falling_edge(busy) then
|
||||
currentState <= nextState;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- STS
|
||||
------------------------------------------------------------------------------
|
||||
process
|
||||
begin
|
||||
STS <= '1';
|
||||
wait on busy;
|
||||
if rising_edge(busy) then
|
||||
STS <= '0' after T_W13;
|
||||
wait until falling_edge(busy);
|
||||
end if;
|
||||
end process;
|
||||
|
||||
|
||||
--############################################################################
|
||||
-- Storage
|
||||
------------------------------------------------------------------------------
|
||||
process(writePulse, A)
|
||||
variable memContent : memoryArray; -- much faster than using a signal
|
||||
variable loadMemFromFile : boolean := true;
|
||||
file memoryFile : text open read_mode is fileSpec;
|
||||
variable srecLine : line;
|
||||
variable srecChar : character;
|
||||
variable srecType : natural;
|
||||
variable srecAddrLength : natural;
|
||||
variable srecWordAscii : string(8 downto 1);
|
||||
variable srecLength : natural;
|
||||
variable srecAddress : natural;
|
||||
variable memoryAddress : natural;
|
||||
variable srecData : natural;
|
||||
|
||||
function readNumber(hexString: string) return natural is
|
||||
variable currentCharPos: natural;
|
||||
variable intValue: natural;
|
||||
variable accValue: natural;
|
||||
begin
|
||||
accValue := 0;
|
||||
for index in hexString'range loop
|
||||
currentCharPos := character'pos(hexString(index));
|
||||
if currentCharPos <= character'pos('9') then
|
||||
intValue := currentCharPos - character'pos('0');
|
||||
else
|
||||
intValue := currentCharPos - character'pos('A') + 10;
|
||||
end if;
|
||||
accValue := accValue * 16 + intValue;
|
||||
end loop;
|
||||
return accValue;
|
||||
end readNumber;
|
||||
|
||||
begin
|
||||
if loadMemFromFile then
|
||||
-- only happens at simulation start
|
||||
while not endfile(memoryFile) loop
|
||||
readline(memoryFile, srecLine);
|
||||
--report "-> " & srecLine.all;
|
||||
-- trim leading whitespaces
|
||||
while (not (srecLine'length=0)) and (srecLine(srecLine'left) = ' ') loop
|
||||
read(srecLine, srecChar);
|
||||
end loop;
|
||||
-- get record type
|
||||
if srecLine'length > 0 then
|
||||
read(srecLine, srecChar);
|
||||
if (srecChar = 'S') or (srecChar = 's') then
|
||||
read(srecLine, srecChar);
|
||||
srecType := character'pos(srecChar) - character'pos('0');
|
||||
--report "-> srec type: " & integer'image(srecType);
|
||||
srecAddrLength := srecType + 1;
|
||||
if (srecType >= 1) and (srecType <= 3) then
|
||||
-- get record length
|
||||
srecWordAscii := (others => '0');
|
||||
read(srecLine, srecWordAscii(2));
|
||||
read(srecLine, srecWordAscii(1));
|
||||
srecLength := readNumber(srecWordAscii);
|
||||
-- get record base address
|
||||
srecWordAscii := (others => '0');
|
||||
for index in 2*(srecAddrLength) downto 1 loop
|
||||
read(srecLine, srecWordAscii(index));
|
||||
end loop;
|
||||
srecAddress := readNumber(srecWordAscii);
|
||||
memoryAddress := srecAddress/2;
|
||||
-- get record data
|
||||
for index1 in 1 to (srecLength - srecAddrLength - 1) / 2 loop
|
||||
srecWordAscii := (others => '0');
|
||||
for index2 in 4 downto 1 loop
|
||||
read(srecLine, srecWordAscii(index2));
|
||||
end loop;
|
||||
srecData := readNumber(srecWordAscii);
|
||||
if memoryAddress < memoryLength then
|
||||
memContent(memoryAddress) := std_ulogic_vector(to_unsigned(srecData, memoryWord'length));
|
||||
end if;
|
||||
memoryAddress := memoryAddress + 1;
|
||||
end loop;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end loop;
|
||||
loadMemFromFile := false;
|
||||
else
|
||||
-- normal functionality
|
||||
if falling_edge(writePulse) then
|
||||
-- program a word
|
||||
if currentState = WORD_PROGRAM_1 then
|
||||
memoryAddress := to_integer(A(A'high downto 1));
|
||||
memoryAddressDebug <= to_unsigned(memoryAddress, memoryAddressDebug'length);
|
||||
memContent(memoryAddress) := std_ulogic_vector(DQ);
|
||||
-- erase a block
|
||||
elsif currentState = BLOCK_ERASE_1 then
|
||||
memoryAddress := to_integer(A and not(to_unsigned(blockLength-1, A'length)));
|
||||
for index in 0 to blockLength-1 loop
|
||||
if memoryAddress < memoryLength then
|
||||
memContent(memoryAddress) := (others => '1');
|
||||
memoryAddress := memoryAddress + 1;
|
||||
end if;
|
||||
end loop;
|
||||
end if;
|
||||
end if;
|
||||
-- update readout data
|
||||
if A'event then
|
||||
memoryAddress := to_integer(A(A'high downto 1));
|
||||
memoryAddressDebug <= to_unsigned(memoryAddress, memoryAddressDebug'length);
|
||||
memoryDataWord <= memContent(memoryAddress) after T_R2;
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
process(memoryDataWord, readPulse)
|
||||
begin
|
||||
if readPulse = '1' then
|
||||
DQ <= std_logic_vector(memoryDataWord);
|
||||
else
|
||||
DQ <= (others => 'Z');
|
||||
end if;
|
||||
end process;
|
||||
|
||||
|
||||
|
||||
END ARCHITECTURE behav;
|
||||
|
83
Libs/Memory_test/hdl/bram_tester_test.vhd
Normal file
83
Libs/Memory_test/hdl/bram_tester_test.vhd
Normal file
@ -0,0 +1,83 @@
|
||||
ARCHITECTURE test OF bram_tester IS
|
||||
|
||||
constant clockFrequencyA: real := 66.0E6;
|
||||
constant clockFrequencyB: real := 20.0E6;
|
||||
constant clockPeriodA: time := (1.0/clockFrequencyA) * 1 sec;
|
||||
constant clockPeriodB: time := (1.0/clockFrequencyB) * 1 sec;
|
||||
signal clockA_int: std_uLogic := '1';
|
||||
signal clockB_int: std_uLogic := '1';
|
||||
|
||||
signal addressA_int: natural;
|
||||
signal dataA_int: integer;
|
||||
|
||||
signal addressB_int: natural;
|
||||
signal dataB_int: integer;
|
||||
|
||||
BEGIN
|
||||
------------------------------------------------------------------------------
|
||||
-- clocks
|
||||
clockA_int <= not clockA_int after clockPeriodA/2;
|
||||
clockA <= transport clockA_int after clockPeriodA*9/10;
|
||||
|
||||
clockB_int <= not clockB_int after clockPeriodB/2;
|
||||
clockB <= transport clockB_int after clockPeriodB*9/10;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- test sequence
|
||||
portA: process
|
||||
begin
|
||||
enA <= '0';
|
||||
writeEnA <= '0';
|
||||
addressA_int <= 0;
|
||||
dataA_int <= 0;
|
||||
-- read initial BRAM data
|
||||
wait for 5*clockPeriodA;
|
||||
addressA_int <= 40;
|
||||
enA <= '1';
|
||||
wait for clockPeriodA;
|
||||
enA <= '0';
|
||||
-- write data on port A
|
||||
wait for 10*clockPeriodA;
|
||||
addressA_int <= 10;
|
||||
dataA_int <= 5;
|
||||
enA <= '1';
|
||||
writeEnA <= '1';
|
||||
wait for clockPeriodA;
|
||||
enA <= '0';
|
||||
writeEnA <= '0';
|
||||
|
||||
wait;
|
||||
end process portA;
|
||||
|
||||
addressA <= std_ulogic_vector(to_unsigned(addressA_int, addressA'length));
|
||||
dataInA <= std_ulogic_vector(to_signed(dataA_int, dataInA'length));
|
||||
|
||||
portB: process
|
||||
begin
|
||||
enB <= '0';
|
||||
writeEnB <= '0';
|
||||
addressB_int <= 0;
|
||||
dataB_int <= 0;
|
||||
-- write data on port B
|
||||
wait for 10*clockPeriodB;
|
||||
addressB_int <= 20;
|
||||
dataB_int <= 10;
|
||||
enB <= '1';
|
||||
writeEnB <= '1';
|
||||
wait for clockPeriodB;
|
||||
enB <= '0';
|
||||
writeEnB <= '0';
|
||||
-- read data written on port A
|
||||
wait for 2*clockPeriodB;
|
||||
addressB_int <= 10;
|
||||
enB <= '1';
|
||||
wait for clockPeriodB;
|
||||
enB <= '0';
|
||||
|
||||
wait;
|
||||
end process portB;
|
||||
|
||||
addressB <= std_ulogic_vector(to_unsigned(addressB_int, addressB'length));
|
||||
dataInB <= std_ulogic_vector(to_signed(dataB_int, dataInB'length));
|
||||
|
||||
END ARCHITECTURE test;
|
339
Libs/Memory_test/hdl/fifo_tester_test.vhd
Normal file
339
Libs/Memory_test/hdl/fifo_tester_test.vhd
Normal file
@ -0,0 +1,339 @@
|
||||
--LIBRARY std;
|
||||
-- USE std.textio.ALL;
|
||||
LIBRARY COMMON_TEST;
|
||||
USE COMMON_TEST.testUtils.all;
|
||||
|
||||
ARCHITECTURE test OF fifo_tester IS
|
||||
|
||||
constant clockFrequency: real := 66.0E6;
|
||||
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
|
||||
signal clock_int: std_ulogic := '1';
|
||||
|
||||
constant testInterval: time := 10*clockPeriod;
|
||||
signal dataIn_int: integer;
|
||||
signal read_int: std_ulogic;
|
||||
signal dataOffset: integer;
|
||||
|
||||
signal dataValid: std_ulogic;
|
||||
signal dataRead: integer;
|
||||
|
||||
BEGIN
|
||||
------------------------------------------------------------------------------
|
||||
-- reset and clock
|
||||
reset <= '1', '0' after 2*clockPeriod;
|
||||
|
||||
clock_int <= not clock_int after clockPeriod/2;
|
||||
clock <= transport clock_int after clockPeriod*9/10;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- test sequence
|
||||
process
|
||||
variable readIndex: integer;
|
||||
begin
|
||||
write <= '0';
|
||||
read_int <= '0';
|
||||
dataOffset <= -16#10#;
|
||||
wait for 5*clockPeriod;
|
||||
print(
|
||||
lf & lf & lf &
|
||||
"----------------------------------------------------------------" & lf &
|
||||
"Starting testbench" & lf &
|
||||
lf & lf
|
||||
);
|
||||
|
||||
--..........................................................................
|
||||
-- full write / read after end of write
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", full FIFO write direclty followed by full read" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1';
|
||||
for index in 0 to fifoDepth-1 loop
|
||||
dataIn_int <= dataOffset + index;
|
||||
wait for clockPeriod;
|
||||
end loop;
|
||||
write <= '0';
|
||||
-- read FIFO
|
||||
read_int <= '1';
|
||||
readIndex := 0;
|
||||
while empty = '0' loop
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- full write / read after some time
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", full FIFO write and delay before read" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1';
|
||||
for index in 0 to fifoDepth-1 loop
|
||||
dataIn_int <= dataOffset + index;
|
||||
wait for clockPeriod;
|
||||
end loop;
|
||||
write <= '0';
|
||||
-- wait before read
|
||||
wait for 4*clockPeriod;
|
||||
-- read FIFO
|
||||
read_int <= '1';
|
||||
readIndex := 0;
|
||||
while empty = '0' loop
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- write / read direct
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", full FIFO write with asynchronous direct read" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1', '0' after 8*clockPeriod;
|
||||
dataIn_int <= dataOffset + 16#00#,
|
||||
dataOffset + 16#01# after 1*clockPeriod,
|
||||
dataOffset + 16#02# after 2*clockPeriod,
|
||||
dataOffset + 16#03# after 3*clockPeriod,
|
||||
dataOffset + 16#04# after 4*clockPeriod,
|
||||
dataOffset + 16#05# after 5*clockPeriod,
|
||||
dataOffset + 16#06# after 6*clockPeriod,
|
||||
dataOffset + 16#07# after 7*clockPeriod;
|
||||
-- read FIFO
|
||||
wait until empty = '0';
|
||||
read_int <= '1';
|
||||
readIndex := -1;
|
||||
while empty = '0' loop
|
||||
if readIndex >= 0 then
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
end if;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- write / read direct with clock period delay
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", full FIFO write with synchronous direct read" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1', '0' after 8*clockPeriod;
|
||||
dataIn_int <= dataOffset + 16#00#,
|
||||
dataOffset + 16#01# after 1*clockPeriod,
|
||||
dataOffset + 16#02# after 2*clockPeriod,
|
||||
dataOffset + 16#03# after 3*clockPeriod,
|
||||
dataOffset + 16#04# after 4*clockPeriod,
|
||||
dataOffset + 16#05# after 5*clockPeriod,
|
||||
dataOffset + 16#06# after 6*clockPeriod,
|
||||
dataOffset + 16#07# after 7*clockPeriod;
|
||||
-- read FIFO
|
||||
wait until empty = '0';
|
||||
wait until rising_edge(clock_int);
|
||||
read_int <= '1';
|
||||
readIndex := 0;
|
||||
while empty = '0' loop
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- slow read sets FIFO full
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", slow reading sets FIFO full and requires waiting before writing on" &
|
||||
lf & lf
|
||||
);
|
||||
-- prepare slow FIFO reading
|
||||
wait until rising_edge(clock_int);
|
||||
wait for 2*clockPeriod;
|
||||
read_int <= '1' after 4*clockPeriod,
|
||||
'0' after 5*clockPeriod,
|
||||
'1' after 14*clockPeriod,
|
||||
'0' after 15*clockPeriod,
|
||||
'1' after 24*clockPeriod,
|
||||
'0' after 25*clockPeriod,
|
||||
'1' after 34*clockPeriod,
|
||||
'0' after 35*clockPeriod,
|
||||
'1' after 44*clockPeriod,
|
||||
'0' after (45+2*fifoDepth-5)*clockPeriod;
|
||||
-- write 2*FIFO depth
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
for index in 0 to 2*fifoDepth-1 loop
|
||||
dataIn_int <= dataOffset + index;
|
||||
if full = '1' then
|
||||
wait until full = '0';
|
||||
wait for clockPeriod/8;
|
||||
end if;
|
||||
write <= '1';
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '0';
|
||||
end loop;
|
||||
|
||||
--..........................................................................
|
||||
-- write over full
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", attempt to write after FIFO full" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1';
|
||||
for index in 0 to fifoDepth+3 loop
|
||||
dataIn_int <= dataOffset + index;
|
||||
wait for clockPeriod;
|
||||
end loop;
|
||||
write <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- read FIFO once too much
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", attempt to read after FIFO empty" &
|
||||
lf & lf
|
||||
);
|
||||
read_int <= '1';
|
||||
wait for clockPeriod;
|
||||
wait until empty = '1';
|
||||
wait for clockPeriod;
|
||||
read_int <= '0';
|
||||
-- read when empty
|
||||
wait until rising_edge(clock_int);
|
||||
wait for 2*clockPeriod;
|
||||
read_int <= '1';
|
||||
wait for 2*clockPeriod;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- read constantly
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", reading FIFO constantly (data valid when empty = '0')" &
|
||||
lf & lf
|
||||
);
|
||||
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
read_int <= '1';
|
||||
wait for 2*clockPeriod;
|
||||
wait until rising_edge(clock_int);
|
||||
readIndex := -1;
|
||||
write <= '1';
|
||||
for index in 0 to fifoDepth-1 loop
|
||||
if empty = '0' then
|
||||
readIndex := readIndex + 1;
|
||||
end if;
|
||||
if (readIndex >= 0) and (empty = '0') then
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
end if;
|
||||
dataIn_int <= dataOffset + index;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
write <= '0';
|
||||
|
||||
wait until empty = '1';
|
||||
wait for 2*clockPeriod;
|
||||
read_int <= '0';
|
||||
|
||||
--..........................................................................
|
||||
-- full write / read with breaks
|
||||
wait for testInterval;
|
||||
print(
|
||||
"At time " & sprintf("%9.3tu", now) &
|
||||
", reading FIFO with breaks" &
|
||||
lf & lf
|
||||
);
|
||||
-- write FIFO
|
||||
dataOffset <= dataOffset + 16#10#;
|
||||
wait until rising_edge(clock_int);
|
||||
write <= '1';
|
||||
for index in 0 to fifoDepth-1 loop
|
||||
dataIn_int <= dataOffset + index;
|
||||
wait for clockPeriod;
|
||||
end loop;
|
||||
write <= '0';
|
||||
-- wait before read
|
||||
wait for 2*clockPeriod;
|
||||
-- read FIFO
|
||||
wait until rising_edge(clock_int);
|
||||
readIndex := 0;
|
||||
for index in 0 to fifoDepth/4-1 loop
|
||||
read_int <= '1';
|
||||
for rdIndex in 1 to 2 loop
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
wait for 2*clockPeriod;
|
||||
end loop;
|
||||
read_int <= '1';
|
||||
while empty = '0' loop
|
||||
assert unsigned(dataOut) = dataOffset + readIndex
|
||||
report "FIFO readback error"
|
||||
severity error;
|
||||
readIndex := readIndex + 1;
|
||||
wait until rising_edge(clock_int);
|
||||
end loop;
|
||||
read_int <= '0';
|
||||
--..........................................................................
|
||||
-- end of tests
|
||||
wait for testInterval;
|
||||
assert false
|
||||
report "END SIMULATION"
|
||||
severity failure;
|
||||
wait;
|
||||
end process;
|
||||
|
||||
dataIn <= std_ulogic_vector(to_signed(dataIn_int, dataIn'length));
|
||||
read <= read_int;
|
||||
|
||||
dataValid <= '1' when (read_int = '1') and (empty = '0')
|
||||
else '0';
|
||||
dataRead <= to_integer(signed(dataOut)) when dataValid = '1'
|
||||
else 0;
|
||||
|
||||
END ARCHITECTURE test;
|
88
Libs/Memory_test/hdl/flashController_tester_test.vhd
Normal file
88
Libs/Memory_test/hdl/flashController_tester_test.vhd
Normal file
@ -0,0 +1,88 @@
|
||||
LIBRARY BoardTester_test;
|
||||
USE BoardTester_test.testUtils.all;
|
||||
|
||||
ARCHITECTURE test OF flashController_tester IS
|
||||
|
||||
constant clockFrequency: real := 66.0E6;
|
||||
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
|
||||
signal clock_int: std_uLogic := '1';
|
||||
|
||||
signal flashAddr_int: natural := 0;
|
||||
signal flashDataOut_int: natural := 0;
|
||||
|
||||
signal refreshEn: std_uLogic := '0';
|
||||
|
||||
constant separator : string(1 to 80) := (others => '-');
|
||||
constant indent : string(1 to 2) := (others => ' ');
|
||||
|
||||
BEGIN
|
||||
------------------------------------------------------------------------------
|
||||
-- reset and clock
|
||||
reset <= '1', '0' after 2*clockPeriod;
|
||||
|
||||
clock_int <= not clock_int after clockPeriod/2;
|
||||
clock <= transport clock_int after clockPeriod*9/10;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- flash access
|
||||
process
|
||||
begin
|
||||
flashRd <= '0';
|
||||
flashWr <= '0';
|
||||
flashEn <= '1';
|
||||
wait for 1 us;
|
||||
print(cr & separator);
|
||||
-- erase block 0
|
||||
print(sprintf("%tu", now) & ": Erasing block 0");
|
||||
flashAddr_int <= 16#10000#;
|
||||
flashDataOut_int <= 16#0020#;
|
||||
flashWr <= '1', '0' after clockPeriod;
|
||||
wait until falling_edge(flashDataValid);
|
||||
wait for clockPeriod/10;
|
||||
flashDataOut_int <= 16#00D0#;
|
||||
flashWr <= '1', '0' after clockPeriod;
|
||||
wait for 2 us;
|
||||
-- program word
|
||||
print(sprintf("%tu", now) & ": Writing data into Flash");
|
||||
flashAddr_int <= 16#0000#;
|
||||
flashDataOut_int <= 16#0040#;
|
||||
flashWr <= '1', '0' after clockPeriod;
|
||||
wait until falling_edge(flashDataValid);
|
||||
wait for clockPeriod/10;
|
||||
flashAddr_int <= 16#0010#;
|
||||
flashDataOut_int <= 16#CAFE#;
|
||||
flashWr <= '1', '0' after clockPeriod;
|
||||
wait for 2 us;
|
||||
-- read word
|
||||
print(sprintf("%tu", now) & ": Reading data from Flash");
|
||||
flashAddr_int <= 16#0000#;
|
||||
flashRd <= '1', '0' after clockPeriod;
|
||||
wait for 1 us;
|
||||
-- read word
|
||||
print(sprintf("%tu", now) & ": Reading data from Flash");
|
||||
flashAddr_int <= 16#000F#;
|
||||
flashRd <= '1', '0' after clockPeriod;
|
||||
wait for 500 ns;
|
||||
flashAddr_int <= 16#0010#;
|
||||
flashRd <= '1', '0' after clockPeriod;
|
||||
wait for 500 ns;
|
||||
flashAddr_int <= 16#0011#;
|
||||
flashRd <= '1', '0' after clockPeriod;
|
||||
wait for 500 ns;
|
||||
|
||||
wait;
|
||||
end process;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- address and data
|
||||
flashAddr <= to_unsigned(flashAddr_int, flashAddr'length);
|
||||
flashDataOut <= std_ulogic_vector(to_unsigned(flashDataOut_int, flashDataOut'length));
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- memory bus hold
|
||||
refreshEn <= '1' after 15*clockPeriod when refreshEn = '0'
|
||||
else '0' after clockPeriod;
|
||||
memBusEn_n <= refreshEn;
|
||||
|
||||
END ARCHITECTURE test;
|
||||
|
102
Libs/Memory_test/hdl/flash_tester_test.vhd
Normal file
102
Libs/Memory_test/hdl/flash_tester_test.vhd
Normal file
@ -0,0 +1,102 @@
|
||||
LIBRARY BoardTester_test;
|
||||
USE BoardTester_test.testUtils.all;
|
||||
|
||||
ARCHITECTURE test OF flash_tester IS
|
||||
|
||||
constant T_W2: time := 0 ns;
|
||||
constant T_W3: time := 70 ns;
|
||||
constant T_W4: time := 50 ns;
|
||||
constant T_W5: time := 55 ns;
|
||||
constant T_W6: time := 10 ns;
|
||||
constant T_R3: time := 120 ns;
|
||||
|
||||
signal addr: natural;
|
||||
signal data: integer;
|
||||
|
||||
signal writeFlash: std_ulogic := '0';
|
||||
signal readFlash: std_ulogic := '0';
|
||||
|
||||
constant separator : string(1 to 80) := (others => '-');
|
||||
constant indent : string(1 to 2) := (others => ' ');
|
||||
|
||||
BEGIN
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- Test
|
||||
------------------------------------------------------------------------------
|
||||
process
|
||||
begin
|
||||
RP_n <= '1';
|
||||
wait for 1 us;
|
||||
print(cr & separator);
|
||||
-- erase block 0
|
||||
print(sprintf("%tu", now) & ": Erasing block 0");
|
||||
addr <= 16#10000#;
|
||||
data <= 16#20#;
|
||||
writeFlash <= '1', '0' after 1 ns;
|
||||
wait for 100 ns;
|
||||
data <= 16#D0#;
|
||||
writeFlash <= '1', '0' after 1 ns;
|
||||
wait for 2 us;
|
||||
-- program word
|
||||
print(sprintf("%tu", now) & ": Writing data into Flash");
|
||||
addr <= 16#0000#;
|
||||
data <= 16#0040#;
|
||||
writeFlash <= '1', '0' after 1 ns;
|
||||
wait for 100 ns;
|
||||
addr <= 16#0010#;
|
||||
data <= 16#CAFE#;
|
||||
writeFlash <= '1', '0' after 1 ns;
|
||||
wait for 2 us;
|
||||
-- read word
|
||||
print(sprintf("%tu", now) & ": Reading data from Flash");
|
||||
addr <= 16#0000#;
|
||||
readFlash <= '1', '0' after 1 ns;
|
||||
wait for 500 ns;
|
||||
-- read word
|
||||
print(sprintf("%tu", now) & ": Reading data from Flash");
|
||||
addr <= 16#0010#;
|
||||
readFlash <= '1', '0' after 1 ns;
|
||||
wait for 500 ns;
|
||||
|
||||
wait;
|
||||
end process;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- Board connections
|
||||
------------------------------------------------------------------------------
|
||||
CE(2 downto 1) <= (others => '0');
|
||||
BYTE_n <= '1';
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- Write access
|
||||
------------------------------------------------------------------------------
|
||||
process
|
||||
begin
|
||||
CE(0) <= '1';
|
||||
WE_N <= '1';
|
||||
OE_N <= '1';
|
||||
DQ <= (others => 'Z');
|
||||
wait on writeFlash, readFlash;
|
||||
if rising_edge(writeFlash) then
|
||||
A <= to_unsigned(addr, A'length) after T_W3 - T_W5;
|
||||
DQ <= std_logic_vector(to_unsigned(data, DQ'length)) after T_W3 - T_W4;
|
||||
CE(0) <= '0';
|
||||
wait for T_W2;
|
||||
WE_N <= '0';
|
||||
wait for T_W3;
|
||||
WE_N <= '1';
|
||||
wait for T_W6;
|
||||
-- CE(0) <= '1';
|
||||
elsif rising_edge(readFlash) then
|
||||
OE_N <= '0';
|
||||
A <= to_unsigned(addr, A'length);
|
||||
CE(0) <= '0';
|
||||
wait for T_R3 + 10 ns;
|
||||
-- CE(0) <= '1';
|
||||
end if;
|
||||
end process;
|
||||
|
||||
END ARCHITECTURE test;
|
||||
|
18
Libs/Memory_test/hdl/mti_pkg_pkg.vhd
Normal file
18
Libs/Memory_test/hdl/mti_pkg_pkg.vhd
Normal file
@ -0,0 +1,18 @@
|
||||
LIBRARY ieee;
|
||||
USE ieee.std_logic_1164.ALL;
|
||||
USE std.textio.all;
|
||||
|
||||
PACKAGE mti_pkg IS
|
||||
|
||||
FUNCTION To_StdLogic (s : BIT) RETURN STD_LOGIC;
|
||||
FUNCTION TO_INTEGER (input : STD_LOGIC) RETURN INTEGER;
|
||||
FUNCTION TO_INTEGER (input : BIT_VECTOR) RETURN INTEGER;
|
||||
FUNCTION TO_INTEGER (input : STD_LOGIC_VECTOR) RETURN INTEGER;
|
||||
FUNCTION TO_INTEGER (input : STD_ULOGIC_VECTOR) RETURN INTEGER;
|
||||
PROCEDURE TO_BITVECTOR (VARIABLE input : IN INTEGER; VARIABLE output : OUT BIT_VECTOR);
|
||||
|
||||
function conv_std_logic_vector(i : integer; w : integer) return std_logic_vector;
|
||||
procedure hexread(L : inout line; value:out bit_vector);
|
||||
procedure hexread(L : inout line; value:out std_logic_vector);
|
||||
|
||||
END mti_pkg;
|
234
Libs/Memory_test/hdl/mti_pkg_pkg_body.vhd
Normal file
234
Libs/Memory_test/hdl/mti_pkg_pkg_body.vhd
Normal file
@ -0,0 +1,234 @@
|
||||
LIBRARY ieee;
|
||||
USE ieee.numeric_std.all;
|
||||
|
||||
PACKAGE BODY mti_pkg IS
|
||||
|
||||
-- Convert BIT to STD_LOGIC
|
||||
FUNCTION To_StdLogic (s : BIT) RETURN STD_LOGIC IS
|
||||
BEGIN
|
||||
CASE s IS
|
||||
WHEN '0' => RETURN ('0');
|
||||
WHEN '1' => RETURN ('1');
|
||||
WHEN OTHERS => RETURN ('0');
|
||||
END CASE;
|
||||
END;
|
||||
|
||||
-- Convert STD_LOGIC to INTEGER
|
||||
FUNCTION TO_INTEGER (input : STD_LOGIC) RETURN INTEGER IS
|
||||
VARIABLE result : INTEGER := 0;
|
||||
VARIABLE weight : INTEGER := 1;
|
||||
BEGIN
|
||||
IF input = '1' THEN
|
||||
result := weight;
|
||||
ELSE
|
||||
result := 0; -- if unknowns, default to logic 0
|
||||
END IF;
|
||||
RETURN result;
|
||||
END TO_INTEGER;
|
||||
|
||||
-- Convert BIT_VECTOR to INTEGER
|
||||
FUNCTION TO_INTEGER (input : BIT_VECTOR) RETURN INTEGER IS
|
||||
VARIABLE result : INTEGER := 0;
|
||||
VARIABLE weight : INTEGER := 1;
|
||||
BEGIN
|
||||
FOR i IN input'LOW TO input'HIGH LOOP
|
||||
IF input(i) = '1' THEN
|
||||
result := result + weight;
|
||||
ELSE
|
||||
result := result + 0; -- if unknowns, default to logic 0
|
||||
END IF;
|
||||
weight := weight * 2;
|
||||
END LOOP;
|
||||
RETURN result;
|
||||
END TO_INTEGER;
|
||||
|
||||
-- Convert STD_LOGIC_VECTOR to INTEGER
|
||||
FUNCTION TO_INTEGER (input : STD_LOGIC_VECTOR) RETURN INTEGER IS
|
||||
VARIABLE result : INTEGER := 0;
|
||||
VARIABLE weight : INTEGER := 1;
|
||||
BEGIN
|
||||
FOR i IN input'LOW TO input'HIGH LOOP
|
||||
IF input(i) = '1' THEN
|
||||
result := result + weight;
|
||||
ELSE
|
||||
result := result + 0; -- if unknowns, default to logic 0
|
||||
END IF;
|
||||
weight := weight * 2;
|
||||
END LOOP;
|
||||
RETURN result;
|
||||
END TO_INTEGER;
|
||||
|
||||
-- Convert STD_ULOGIC_VECTOR to INTEGER
|
||||
FUNCTION TO_INTEGER (input : STD_ULOGIC_VECTOR) RETURN INTEGER IS
|
||||
VARIABLE result : INTEGER := 0;
|
||||
VARIABLE weight : INTEGER := 1;
|
||||
BEGIN
|
||||
FOR i IN input'LOW TO input'HIGH LOOP
|
||||
IF input(i) = '1' THEN
|
||||
result := result + weight;
|
||||
ELSE
|
||||
result := result + 0; -- if unknowns, default to logic 0
|
||||
END IF;
|
||||
weight := weight * 2;
|
||||
END LOOP;
|
||||
RETURN result;
|
||||
END TO_INTEGER;
|
||||
|
||||
-- Conver INTEGER to BIT_VECTOR
|
||||
PROCEDURE TO_BITVECTOR (VARIABLE input : IN INTEGER; VARIABLE output : OUT BIT_VECTOR) IS
|
||||
VARIABLE work,offset,outputlen,j : INTEGER := 0;
|
||||
BEGIN
|
||||
--length of vector
|
||||
IF output'LENGTH > 32 THEN --'
|
||||
outputlen := 32;
|
||||
offset := output'LENGTH - 32; --'
|
||||
IF input >= 0 THEN
|
||||
FOR i IN offset-1 DOWNTO 0 LOOP
|
||||
output(output'HIGH - i) := '0'; --'
|
||||
END LOOP;
|
||||
ELSE
|
||||
FOR i IN offset-1 DOWNTO 0 LOOP
|
||||
output(output'HIGH - i) := '1'; --'
|
||||
END LOOP;
|
||||
END IF;
|
||||
ELSE
|
||||
outputlen := output'LENGTH; --'
|
||||
END IF;
|
||||
--positive value
|
||||
IF (input >= 0) THEN
|
||||
work := input;
|
||||
j := outputlen - 1;
|
||||
FOR i IN 1 to 32 LOOP
|
||||
IF j >= 0 then
|
||||
IF (work MOD 2) = 0 THEN
|
||||
output(output'HIGH-j-offset) := '0'; --'
|
||||
ELSE
|
||||
output(output'HIGH-j-offset) := '1'; --'
|
||||
END IF;
|
||||
END IF;
|
||||
work := work / 2;
|
||||
j := j - 1;
|
||||
END LOOP;
|
||||
IF outputlen = 32 THEN
|
||||
output(output'HIGH) := '0'; --'
|
||||
END IF;
|
||||
--negative value
|
||||
ELSE
|
||||
work := (-input) - 1;
|
||||
j := outputlen - 1;
|
||||
FOR i IN 1 TO 32 LOOP
|
||||
IF j>= 0 THEN
|
||||
IF (work MOD 2) = 0 THEN
|
||||
output(output'HIGH-j-offset) := '1'; --'
|
||||
ELSE
|
||||
output(output'HIGH-j-offset) := '0'; --'
|
||||
END IF;
|
||||
END IF;
|
||||
work := work / 2;
|
||||
j := j - 1;
|
||||
END LOOP;
|
||||
IF outputlen = 32 THEN
|
||||
output(output'HIGH) := '1'; --'
|
||||
END IF;
|
||||
END IF;
|
||||
END TO_BITVECTOR;
|
||||
|
||||
|
||||
function conv_std_logic_vector(i : integer; w : integer) return std_logic_vector is
|
||||
variable tmp : std_logic_vector(w-1 downto 0);
|
||||
begin
|
||||
tmp := std_logic_vector(to_unsigned(i, w));
|
||||
return(tmp);
|
||||
end;
|
||||
|
||||
procedure char2hex(C: character; result: out bit_vector(3 downto 0);
|
||||
good: out boolean; report_error: in boolean) is
|
||||
begin
|
||||
good := true;
|
||||
case C is
|
||||
when '0' => result := x"0";
|
||||
when '1' => result := x"1";
|
||||
when '2' => result := X"2";
|
||||
when '3' => result := X"3";
|
||||
when '4' => result := X"4";
|
||||
when '5' => result := X"5";
|
||||
when '6' => result := X"6";
|
||||
when '7' => result := X"7";
|
||||
when '8' => result := X"8";
|
||||
when '9' => result := X"9";
|
||||
when 'A' => result := X"A";
|
||||
when 'B' => result := X"B";
|
||||
when 'C' => result := X"C";
|
||||
when 'D' => result := X"D";
|
||||
when 'E' => result := X"E";
|
||||
when 'F' => result := X"F";
|
||||
|
||||
when 'a' => result := X"A";
|
||||
when 'b' => result := X"B";
|
||||
when 'c' => result := X"C";
|
||||
when 'd' => result := X"D";
|
||||
when 'e' => result := X"E";
|
||||
when 'f' => result := X"F";
|
||||
when others =>
|
||||
if report_error then
|
||||
assert false report
|
||||
"hexread error: read a '" & C & "', expected a hex character (0-F).";
|
||||
end if;
|
||||
good := false;
|
||||
end case;
|
||||
end;
|
||||
|
||||
procedure hexread(L:inout line; value:out bit_vector) is
|
||||
variable OK: boolean;
|
||||
variable C: character;
|
||||
constant NE: integer := value'length/4; --'
|
||||
variable BV: bit_vector(0 to value'length-1); --'
|
||||
variable S: string(1 to NE-1);
|
||||
begin
|
||||
if value'length mod 4 /= 0 then --'
|
||||
assert false report
|
||||
"hexread Error: Trying to read vector " &
|
||||
"with an odd (non multiple of 4) length";
|
||||
return;
|
||||
end if;
|
||||
|
||||
loop -- skip white space
|
||||
read(L,C);
|
||||
exit when ((C /= ' ') and (C /= CR) and (C /= HT));
|
||||
end loop;
|
||||
|
||||
char2hex(C, BV(0 to 3), OK, false);
|
||||
if not OK then
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(L, S, OK);
|
||||
-- if not OK then
|
||||
-- assert false report "hexread Error: Failed to read the STRING";
|
||||
-- return;
|
||||
-- end if;
|
||||
|
||||
for I in 1 to NE-1 loop
|
||||
char2hex(S(I), BV(4*I to 4*I+3), OK, false);
|
||||
if not OK then
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
value := BV;
|
||||
end hexread;
|
||||
|
||||
procedure hexread(L:inout line; value:out std_ulogic_vector) is
|
||||
variable tmp: bit_vector(value'length-1 downto 0); --'
|
||||
begin
|
||||
hexread(L, tmp);
|
||||
value := TO_X01(tmp);
|
||||
end hexread;
|
||||
|
||||
procedure hexread(L:inout line; value:out std_logic_vector) is
|
||||
variable tmp: std_ulogic_vector(value'length-1 downto 0); --'
|
||||
begin
|
||||
hexread(L, tmp);
|
||||
value := std_logic_vector(tmp);
|
||||
end hexread;
|
||||
|
||||
END mti_pkg;
|
82
Libs/Memory_test/hdl/sdramController_tester_test.vhd
Normal file
82
Libs/Memory_test/hdl/sdramController_tester_test.vhd
Normal file
@ -0,0 +1,82 @@
|
||||
ARCHITECTURE test OF sdramController_tester IS
|
||||
|
||||
constant clockFrequency: real := 66.0E6;
|
||||
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
|
||||
signal clock_int: std_uLogic := '1';
|
||||
|
||||
signal ramAddr_int: natural := 0;
|
||||
signal ramDataOut_int: natural := 0;
|
||||
|
||||
BEGIN
|
||||
------------------------------------------------------------------------------
|
||||
-- reset and clock
|
||||
reset <= '1', '0' after 2*clockPeriod;
|
||||
|
||||
clock_int <= not clock_int after clockPeriod/2;
|
||||
clock <= transport clock_int after clockPeriod*9/10;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- test sequence
|
||||
process
|
||||
begin
|
||||
ramRd <= '0';
|
||||
ramWr <= '0';
|
||||
ramEn <= '1';
|
||||
-- wait for SDRAM ready
|
||||
wait for 154.3 us - now;
|
||||
-- write AAAA at address 000010
|
||||
ramAddr_int <= 16#000010#;
|
||||
ramDataOut_int <= 16#AAAA#;
|
||||
ramWr <= '1', '0' after clockPeriod;
|
||||
-- wait for SDRAM ready
|
||||
wait for 164.5 us - now;
|
||||
-- write AAAA at address 000011
|
||||
ramAddr_int <= 16#000011#;
|
||||
ramDataOut_int <= 16#BBBD#;
|
||||
ramWr <= '1', '0' after clockPeriod;
|
||||
-- wait for SDRAM ready
|
||||
wait for 196.1 us - now;
|
||||
-- read back from address 000010
|
||||
ramAddr_int <= 16#000010#;
|
||||
ramRd <= '1', '0' after clockPeriod;
|
||||
-- -- wait for SDRAM ready
|
||||
-- wait for 130 us;
|
||||
-- -- write AAAA at address 000010
|
||||
-- ramAddr_int <= 16#000010#;
|
||||
-- ramDataOut_int <= 16#AAAA#;
|
||||
-- ramWr <= '1', '0' after clockPeriod;
|
||||
-- -- read back from same address
|
||||
-- wait for 10*clockPeriod;
|
||||
-- ramRd <= '1', '0' after clockPeriod;
|
||||
-- -- wait for a refresh
|
||||
-- wait for 140.3 us - now;
|
||||
-- -- write 5555 at address 600010
|
||||
-- ramAddr_int <= 16#600020#;
|
||||
-- ramDataOut_int <= 16#5555#;
|
||||
-- ramWr <= '1', '0' after clockPeriod;
|
||||
-- -- read back from same address
|
||||
-- wait for 1*clockPeriod;
|
||||
-- ramRd <= '1', '0' after clockPeriod;
|
||||
-- -- read back from address 600010
|
||||
-- addr_from_up_int <= 16#600010#;
|
||||
-- mem_read <= '1', '0' after clockPeriod;
|
||||
-- wait for 10*clockPeriod;
|
||||
-- -- wait for 3 refresh periods
|
||||
-- wait until falling_edge(dram_busy);
|
||||
-- wait until falling_edge(dram_busy);
|
||||
-- wait until falling_edge(dram_busy);
|
||||
-- -- read back from address 000010
|
||||
-- addr_from_up_int <= 16#000010#;
|
||||
-- mem_read <= '1', '0' after clockPeriod;
|
||||
-- wait for 10*clockPeriod;
|
||||
-- end of tests
|
||||
wait;
|
||||
end process;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
-- address and data
|
||||
ramAddr <= to_unsigned(ramAddr_int, ramAddr'length);
|
||||
ramDataOut <= std_ulogic_vector(to_unsigned(ramDataOut_int, ramDataOut'length));
|
||||
|
||||
END ARCHITECTURE test;
|
||||
|
1363
Libs/Memory_test/hdl/sdram_mt48lc16m16a2_sim.vhd
Normal file
1363
Libs/Memory_test/hdl/sdram_mt48lc16m16a2_sim.vhd
Normal file
File diff suppressed because it is too large
Load Diff
1
Libs/Memory_test/hds/.hdlsidedata/_Flash_behav.vhd._fpf
Normal file
1
Libs/Memory_test/hds/.hdlsidedata/_Flash_behav.vhd._fpf
Normal file
@ -0,0 +1 @@
|
||||
DIALECT atom VHDL_2008
|
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_2008
|
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_2008
|
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_2008
|
@ -0,0 +1 @@
|
||||
DIALECT atom VHDL_2008
|
4
Libs/Memory_test/hds/.hdlsidedata/_mti_pkg_pkg.vhd._fpf
Normal file
4
Libs/Memory_test/hds/.hdlsidedata/_mti_pkg_pkg.vhd._fpf
Normal file
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_93
|
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_93
|
@ -0,0 +1 @@
|
||||
DIALECT atom VHDL_2008
|
@ -0,0 +1,4 @@
|
||||
INCLUDE list {
|
||||
DEFAULT atom 1
|
||||
}
|
||||
DIALECT atom VHDL_2008
|
3
Libs/Memory_test/hds/_bram_tb._epf
Normal file
3
Libs/Memory_test/hds/_bram_tb._epf
Normal file
@ -0,0 +1,3 @@
|
||||
DEFAULT_FILE atom bram_tb/struct.bd
|
||||
DEFAULT_ARCHITECTURE atom struct
|
||||
TOP_MARKER atom 1
|
2
Libs/Memory_test/hds/_bram_tester._epf
Normal file
2
Libs/Memory_test/hds/_bram_tester._epf
Normal file
@ -0,0 +1,2 @@
|
||||
DEFAULT_ARCHITECTURE atom test
|
||||
DEFAULT_FILE atom bram_tester_test.vhd
|
3
Libs/Memory_test/hds/_fifo_tb._epf
Normal file
3
Libs/Memory_test/hds/_fifo_tb._epf
Normal file
@ -0,0 +1,3 @@
|
||||
DEFAULT_ARCHITECTURE atom struct
|
||||
DEFAULT_FILE atom fifo_tb/struct.bd
|
||||
TOP_MARKER atom 1
|
2
Libs/Memory_test/hds/_flash_28f128j3a._epf
Normal file
2
Libs/Memory_test/hds/_flash_28f128j3a._epf
Normal file
@ -0,0 +1,2 @@
|
||||
DEFAULT_FILE atom Flash_behav.vhd
|
||||
DEFAULT_ARCHITECTURE atom behav
|
3
Libs/Memory_test/hds/_flash_tb._epf
Normal file
3
Libs/Memory_test/hds/_flash_tb._epf
Normal file
@ -0,0 +1,3 @@
|
||||
DEFAULT_FILE atom flash_tb/struct.bd
|
||||
DEFAULT_ARCHITECTURE atom struct
|
||||
TOP_MARKER atom 1
|
2
Libs/Memory_test/hds/_flash_tester._epf
Normal file
2
Libs/Memory_test/hds/_flash_tester._epf
Normal file
@ -0,0 +1,2 @@
|
||||
DEFAULT_FILE atom flash_tester_test.vhd
|
||||
DEFAULT_ARCHITECTURE atom test
|
3
Libs/Memory_test/hds/_flashcontroller_tb._epf
Normal file
3
Libs/Memory_test/hds/_flashcontroller_tb._epf
Normal file
@ -0,0 +1,3 @@
|
||||
DEFAULT_FILE atom flash@controller_tb/struct.bd
|
||||
DEFAULT_ARCHITECTURE atom struct
|
||||
TOP_MARKER atom 1
|
2
Libs/Memory_test/hds/_flashcontroller_tester._epf
Normal file
2
Libs/Memory_test/hds/_flashcontroller_tester._epf
Normal file
@ -0,0 +1,2 @@
|
||||
DEFAULT_ARCHITECTURE atom test
|
||||
DEFAULT_FILE atom flashController_tester_test.vhd
|
3
Libs/Memory_test/hds/_sdramcontroller_tb._epf
Normal file
3
Libs/Memory_test/hds/_sdramcontroller_tb._epf
Normal file
@ -0,0 +1,3 @@
|
||||
DEFAULT_FILE atom sdram@controller_tb/struct.bd
|
||||
DEFAULT_ARCHITECTURE atom struct
|
||||
TOP_MARKER atom 1
|
2
Libs/Memory_test/hds/_sdramcontroller_tester._epf
Normal file
2
Libs/Memory_test/hds/_sdramcontroller_tester._epf
Normal file
@ -0,0 +1,2 @@
|
||||
DEFAULT_FILE atom sdramController_tester_test.vhd
|
||||
DEFAULT_ARCHITECTURE atom test
|
3661
Libs/Memory_test/hds/bram_tb/struct.bd
Normal file
3661
Libs/Memory_test/hds/bram_tb/struct.bd
Normal file
File diff suppressed because it is too large
Load Diff
1256
Libs/Memory_test/hds/bram_tb/symbol.sb
Normal file
1256
Libs/Memory_test/hds/bram_tb/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
2134
Libs/Memory_test/hds/bram_tester/interface
Normal file
2134
Libs/Memory_test/hds/bram_tester/interface
Normal file
File diff suppressed because it is too large
Load Diff
3219
Libs/Memory_test/hds/fifo_tb/struct.bd
Normal file
3219
Libs/Memory_test/hds/fifo_tb/struct.bd
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,3 @@
|
||||
# Script to replay the last simulation run
|
||||
cd $HDS_PROJECT_DIR\..\Memory_test\work
|
||||
"C:/eda/mentor/questasim64_10.1b/win64/vsim" -f hds_args.tmp
|
1256
Libs/Memory_test/hds/fifo_tb/symbol.sb
Normal file
1256
Libs/Memory_test/hds/fifo_tb/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
1504
Libs/Memory_test/hds/fifo_tester/interface
Normal file
1504
Libs/Memory_test/hds/fifo_tester/interface
Normal file
File diff suppressed because it is too large
Load Diff
5566
Libs/Memory_test/hds/flash@controller_tb/struct.bd
Normal file
5566
Libs/Memory_test/hds/flash@controller_tb/struct.bd
Normal file
File diff suppressed because it is too large
Load Diff
1256
Libs/Memory_test/hds/flash@controller_tb/symbol.sb
Normal file
1256
Libs/Memory_test/hds/flash@controller_tb/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
1973
Libs/Memory_test/hds/flash@controller_tester/interface
Normal file
1973
Libs/Memory_test/hds/flash@controller_tester/interface
Normal file
File diff suppressed because it is too large
Load Diff
1951
Libs/Memory_test/hds/flash_28@f128@j3@a/symbol.sb
Normal file
1951
Libs/Memory_test/hds/flash_28@f128@j3@a/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
3224
Libs/Memory_test/hds/flash_tb/struct.bd
Normal file
3224
Libs/Memory_test/hds/flash_tb/struct.bd
Normal file
File diff suppressed because it is too large
Load Diff
1256
Libs/Memory_test/hds/flash_tb/symbol.sb
Normal file
1256
Libs/Memory_test/hds/flash_tb/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
1841
Libs/Memory_test/hds/flash_tester/interface
Normal file
1841
Libs/Memory_test/hds/flash_tester/interface
Normal file
File diff suppressed because it is too large
Load Diff
6053
Libs/Memory_test/hds/sdram@controller_tb/struct.bd
Normal file
6053
Libs/Memory_test/hds/sdram@controller_tb/struct.bd
Normal file
File diff suppressed because it is too large
Load Diff
1256
Libs/Memory_test/hds/sdram@controller_tb/symbol.sb
Normal file
1256
Libs/Memory_test/hds/sdram@controller_tb/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
1971
Libs/Memory_test/hds/sdram@controller_tester/interface
Normal file
1971
Libs/Memory_test/hds/sdram@controller_tester/interface
Normal file
File diff suppressed because it is too large
Load Diff
2448
Libs/Memory_test/hds/sdram_mt48lc16m16a2/symbol.sb
Normal file
2448
Libs/Memory_test/hds/sdram_mt48lc16m16a2/symbol.sb
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user