📄 sdram_test_component.vhd
字号:
--Copyright (C) 1991-2004 Altera Corporation
--Any megafunction design, and related net list (encrypted or decrypted),
--support information, device programming or simulation file, and any other
--associated documentation or information provided by Altera or a partner
--under Altera's Megafunction Partnership Program may be used only to
--program PLD devices (but not masked PLD devices) from Altera. Any other
--use of such megafunction design, net list, support information, device
--programming or simulation file, or any other related documentation or
--information is prohibited for any other purpose, including, but not
--limited to modification, reverse engineering, de-compiling, or use with
--any other silicon devices, unless such use is explicitly licensed under
--a separate agreement with Altera or a megafunction partner. Title to
--the intellectual property, including patents, copyrights, trademarks,
--trade secrets, or maskworks, embodied in any such megafunction design,
--net list, support information, device programming or simulation file, or
--any other related documentation or information provided by Altera or a
--megafunction partner, remains with Altera, the megafunction partner, or
--their respective licensors. No other licenses, including any licenses
--needed under any third party's intellectual property, are provided herein.
--Copying or modifying any file, or portion thereof, to which this notice
--is attached violates this copyright.
--exemplar translate_off
library altera_vhdl_support;
use altera_vhdl_support.altera_vhdl_support_lib.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library std;
use std.textio.all;
entity sdram_test_component_ram_module is
port (
-- inputs:
signal data : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
signal rdaddress : IN STD_LOGIC_VECTOR (21 DOWNTO 0);
signal rdclken : IN STD_LOGIC;
signal wraddress : IN STD_LOGIC_VECTOR (21 DOWNTO 0);
signal wrclock : IN STD_LOGIC;
signal wren : IN STD_LOGIC;
-- outputs:
signal q : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
end entity sdram_test_component_ram_module;
architecture europa of sdram_test_component_ram_module is
signal internal_q : STD_LOGIC_VECTOR (31 DOWNTO 0);
TYPE mem_array is ARRAY( 4194303 DOWNTO 0) of STD_LOGIC_VECTOR(31 DOWNTO 0);
signal memory_has_been_read : STD_LOGIC;
signal read_address : STD_LOGIC_VECTOR (21 DOWNTO 0);
FUNCTION convert_string_to_number(string_to_convert : STRING;
final_char_index : NATURAL := 0)
RETURN NATURAL IS
VARIABLE result: NATURAL := 0;
VARIABLE current_index : NATURAL := 1;
VARIABLE the_char : CHARACTER;
BEGIN
IF final_char_index = 0 THEN
result := 0;
ELSE
WHILE current_index <= final_char_index LOOP
the_char := string_to_convert(current_index);
IF '0' <= the_char AND the_char <= '9' THEN
result := result * 16 + character'pos(the_char) - character'pos('0');
ELSIF 'A' <= the_char AND the_char <= 'F' THEN
result := result * 16 + character'pos(the_char) - character'pos('A') + 10;
ELSIF 'a' <= the_char AND the_char <= 'f' THEN
result := result * 16 + character'pos(the_char) - character'pos('a') + 10;
ELSE
report "Ack, a formatting error!";
END IF;
current_index := current_index + 1;
END LOOP;
END IF;
RETURN result;
END convert_string_to_number;
FUNCTION convert_string_to_std_logic(value : STRING; num_chars : INTEGER; mem_width_bits : INTEGER)
RETURN STD_LOGIC_VECTOR is
VARIABLE conv_string: std_logic_vector((mem_width_bits + 4)-1 downto 0);
VARIABLE result : std_logic_vector((mem_width_bits -1) downto 0);
VARIABLE curr_char : integer;
BEGIN
result := (others => '0');
conv_string := (others => '0');
FOR I IN 1 TO num_chars LOOP
curr_char := num_chars - (I-1);
CASE value(I) IS
WHEN '0' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0000";
WHEN '1' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0001";
WHEN '2' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0010";
WHEN '3' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0011";
WHEN '4' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0100";
WHEN '5' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0101";
WHEN '6' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0110";
WHEN '7' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0111";
WHEN '8' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1000";
WHEN '9' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1001";
WHEN 'A' | 'a' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1010";
WHEN 'B' | 'b' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1011";
WHEN 'C' | 'c' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1100";
WHEN 'D' | 'd' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1101";
WHEN 'E' | 'e' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1110";
WHEN 'F' | 'f' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1111";
WHEN 'X' | 'x' => conv_string((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "XXXX";
WHEN ' ' => EXIT;
WHEN HT => exit;
WHEN others =>
ASSERT False
REPORT "function From_Hex: string """ & value & """ contains non-hex character"
severity Error;
EXIT;
END case;
END loop;
-- convert back to normal bit size
result(mem_width_bits - 1 downto 0) := conv_string(mem_width_bits - 1 downto 0);
RETURN result;
END convert_string_to_std_logic;
begin
process (wrclock, rdaddress) -- MG
VARIABLE data_line : LINE;
VARIABLE the_character_from_data_line : CHARACTER;
VARIABLE b_munging_address : BOOLEAN := FALSE;
VARIABLE converted_number : NATURAL := 0;
VARIABLE found_string_array : STRING(1 TO 128);
VARIABLE string_index : NATURAL := 0;
VARIABLE line_length : NATURAL := 0;
VARIABLE b_convert : BOOLEAN := FALSE;
VARIABLE b_found_new_val : BOOLEAN := FALSE;
VARIABLE load_address : NATURAL := 0;
VARIABLE mem_index : NATURAL := 0;
VARIABLE mem_init : BOOLEAN := FALSE;
VARIABLE wr_address_internal : STD_LOGIC_VECTOR (21 DOWNTO 0) := (others => '0');
FILE memory_contents_file : TEXT OPEN read_mode IS "sdram.dat";
variable Marc_Gaucherons_Memory_Variable : mem_array; -- MG
begin
-- need an initialization process
-- this process initializes the whole memory array from a named file by copying the
-- contents of the *.dat file to the memory array.
-- find the @<address> thingy to load the memory from this point
IF(NOT mem_init) THEN
WHILE NOT(endfile(memory_contents_file)) LOOP
readline(memory_contents_file, data_line);
line_length := data_line'LENGTH;
WHILE line_length > 0 LOOP
read(data_line, the_character_from_data_line);
-- check for the @ character indicating a new address wad
-- if not found, we're either still reading the new address _or_loading data
IF '@' = the_character_from_data_line AND NOT b_munging_address THEN
b_munging_address := TRUE;
b_found_new_val := TRUE;
-- get the rest of characters before white space and then convert them
-- to a number
ELSE
IF (' ' = the_character_from_data_line AND b_found_new_val)
OR (line_length = 1) THEN
b_convert := TRUE;
END IF;
IF NOT(' ' = the_character_from_data_line) THEN
string_index := string_index + 1;
found_string_array(string_index) := the_character_from_data_line;
-- IF NOT(b_munging_address) THEN
-- dat_string_array(string_index) := the_character_from_data_line;
-- END IF;
b_found_new_val := TRUE;
END IF;
END IF;
IF b_convert THEN
IF b_munging_address THEN
converted_number := convert_string_to_number(found_string_array, string_index);
load_address := converted_number;
mem_index := load_address;
-- mem_index := load_address / 4;
b_munging_address := FALSE;
ELSE
IF (mem_index < 4194304) THEN
Marc_Gaucherons_Memory_Variable(mem_index) := convert_string_to_std_logic(found_string_array, string_index, 32);
mem_index := mem_index + 1;
END IF;
END IF;
b_convert := FALSE;
b_found_new_val := FALSE;
string_index := 0;
END IF;
line_length := line_length - 1;
END LOOP;
END LOOP;
-- get the first _real_ block of data, sized to our memory width
-- and keep on loading.
mem_init := TRUE;
END IF;
-- END OF READMEM
-- Write data
if wrclock'event and wrclock = '1' then
wr_address_internal := wraddress;
if wren = '1' then
Marc_Gaucherons_Memory_Variable(CONV_INTEGER(UNSIGNED(wr_address_internal))) := data;
end if;
end if;
-- read data
q <= Marc_Gaucherons_Memory_Variable(CONV_INTEGER(UNSIGNED(rdaddress)));
end process;
end europa;
--exemplar translate_on
--synthesis read_comments_as_HDL on
--library altera_vhdl_support;
--use altera_vhdl_support.altera_vhdl_support_lib.all;
--
--library ieee;
--use ieee.std_logic_1164.all;
--use ieee.std_logic_arith.all;
--use ieee.std_logic_unsigned.all;
--
--library std;
--use std.textio.all;
--
--entity sdram_test_component_ram_module is
-- port (
--
-- signal data : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
-- signal rdaddress : IN STD_LOGIC_VECTOR (21 DOWNTO 0);
-- signal rdclken : IN STD_LOGIC;
-- signal wraddress : IN STD_LOGIC_VECTOR (21 DOWNTO 0);
-- signal wrclock : IN STD_LOGIC;
-- signal wren : IN STD_LOGIC;
--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -