📄 jtag_uart.vhd
字号:
-- PORT (
-- signal empty : OUT STD_LOGIC;
-- signal full : OUT STD_LOGIC;
-- signal q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
-- signal usedw : OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
-- signal clock : IN STD_LOGIC;
-- signal data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
-- signal rdreq : IN STD_LOGIC;
-- signal wrreq : IN STD_LOGIC
-- );
-- end component scfifo;
--synthesis read_comments_as_HDL off
signal internal_fifo_FF : STD_LOGIC;
signal internal_r_dat : STD_LOGIC_VECTOR (7 DOWNTO 0);
signal internal_wfifo_empty : STD_LOGIC;
signal internal_wfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0);
begin
--vhdl renameroo for output signals
fifo_FF <= internal_fifo_FF;
--vhdl renameroo for output signals
r_dat <= internal_r_dat;
--vhdl renameroo for output signals
wfifo_empty <= internal_wfifo_empty;
--vhdl renameroo for output signals
wfifo_used <= internal_wfifo_used;
--exemplar translate_off
the_jtag_uart_sim_scfifo_w : jtag_uart_sim_scfifo_w
port map(
fifo_FF => internal_fifo_FF,
r_dat => internal_r_dat,
wfifo_empty => internal_wfifo_empty,
wfifo_used => internal_wfifo_used,
clk => clk,
fifo_wdata => fifo_wdata,
fifo_wr => fifo_wr
);
--exemplar translate_on
--synthesis read_comments_as_HDL on
-- wfifo : scfifo
-- generic map(
-- lpm_hint => "RAM_BLOCK_TYPE=AUTO",
-- lpm_numwords => 64,
-- lpm_showahead => "OFF",
-- lpm_type => "scfifo",
-- lpm_width => 8,
-- lpm_widthu => 6,
-- overflow_checking => "OFF",
-- underflow_checking => "OFF",
-- use_eab => "ON"
-- )
-- port map(
-- clock => clk,
-- data => fifo_wdata,
-- empty => internal_wfifo_empty,
-- full => internal_fifo_FF,
-- q => internal_r_dat,
-- rdreq => rd_wfifo,
-- usedw => internal_wfifo_used,
-- wrreq => fifo_wr
-- );
--
--synthesis read_comments_as_HDL off
end europa;
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 jtag_uart_drom_module is
generic (
POLL_RATE : integer := 100
);
port (
-- inputs:
signal clk : IN STD_LOGIC;
signal incr_addr : IN STD_LOGIC;
signal reset_n : IN STD_LOGIC;
-- outputs:
signal new_rom : OUT STD_LOGIC;
signal num_bytes : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
signal q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
signal safe : OUT STD_LOGIC
);
end entity jtag_uart_drom_module;
architecture europa of jtag_uart_drom_module is
signal address : STD_LOGIC_VECTOR (11 DOWNTO 0);
signal d1_pre : STD_LOGIC;
signal d2_pre : STD_LOGIC;
signal d3_pre : STD_LOGIC;
signal d4_pre : STD_LOGIC;
signal d5_pre : STD_LOGIC;
signal d6_pre : STD_LOGIC;
signal d7_pre : STD_LOGIC;
signal d8_pre : STD_LOGIC;
signal d9_pre : STD_LOGIC;
TYPE mem_type is ARRAY( 2047 DOWNTO 0) of STD_LOGIC_VECTOR(7 DOWNTO 0);
signal mem_array : mem_type;
TYPE mem_type1 is ARRAY( 1 DOWNTO 0) of STD_LOGIC_VECTOR(31 DOWNTO 0);
signal mutex : mem_type1;
signal pre : STD_LOGIC;
signal safe_wire : STD_LOGIC; -- deal with bogus VHDL type casting
signal safe_delay : STD_LOGIC;
FILE mutex_handle : TEXT ; -- open this for read and write manually.
-- stream can be opened simply for read...
FILE stream_handle : TEXT open READ_MODE is "c:/pabst/test_scratch/test/full_featured/full_1c20_sim/jtag_uart_input_stream.dat";
-- exemplar translate_off
-- convert functions deadlifted from e_rom.pm
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 "convert_string_to_number: 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_chars : INTEGER)
RETURN STD_LOGIC_VECTOR is
VARIABLE num_bits: integer := mem_width_chars * 4;
VARIABLE result: std_logic_vector(num_bits-1 downto 0);
VARIABLE curr_char : integer;
VARIABLE min_width : integer := mem_width_chars;
VARIABLE num_nibbles : integer := 0;
BEGIN
result := (others => '0');
num_nibbles := mem_width_chars;
IF (mem_width_chars > num_chars) THEN
num_nibbles := num_chars;
END IF;
FOR I IN 1 TO num_nibbles LOOP
curr_char := num_nibbles - (I-1);
CASE value(I) IS
WHEN '0' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0000";
WHEN '1' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0001";
WHEN '2' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0010";
WHEN '3' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0011";
WHEN '4' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0100";
WHEN '5' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0101";
WHEN '6' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0110";
WHEN '7' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "0111";
WHEN '8' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1000";
WHEN '9' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1001";
WHEN 'A' | 'a' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1010";
WHEN 'B' | 'b' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1011";
WHEN 'C' | 'c' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1100";
WHEN 'D' | 'd' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1101";
WHEN 'E' | 'e' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1110";
WHEN 'F' | 'f' => result((4*curr_char)-1 DOWNTO 4*(curr_char-1)) := "1111";
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;
RETURN result;
END convert_string_to_std_logic;
-- purpose: open mutex/discard @address/convert value to std_logic_vector
function get_mutex_val (file_name : string)
return STD_LOGIC_VECTOR is
VARIABLE result : STD_LOGIC_VECTOR (31 downto 0) := X"00000000";
FILE handle : TEXT ;
VARIABLE status : file_open_status; -- status for fopen
VARIABLE data_line : LINE;
VARIABLE the_character_from_data_line : CHARACTER;
VARIABLE converted_number : NATURAL := 0;
VARIABLE found_string_array : STRING(1 TO 128);
VARIABLE string_index : NATURAL := 0;
VARIABLE line_length : NATURAL := 0;
begin -- get_mutex_val
file_open (status, handle, file_name, READ_MODE);
WHILE NOT(endfile(handle)) LOOP
readline(handle, data_line);
line_length := data_line'LENGTH; -- match ' for emacs font-lock
WHILE line_length > 0 LOOP
read(data_line, the_character_from_data_line);
-- check for the @ character indicating a new address wad
-- if found, ignore the line! This is just protection
IF '@' = the_character_from_data_line THEN
exit; -- bail out of this line
end if;
-- process the hex address, character by character ...
IF NOT(' ' = the_character_from_data_line) THEN
string_index := string_index + 1;
found_string_array(string_index) := the_character_from_data_line;
END IF;
line_length := line_length - 1;
end loop; -- read characters
end loop; -- read lines
file_close (handle);
if string_index /= 0 then
result := convert_string_to_std_logic(found_string_array, string_index, 8);
end if;
return result;
end get_mutex_val;
-- purpose: emulate verilogs readmemh function (mostly)
-- in verilog you say: $readmemh ("file", array);
-- in VHDL, we say: array <= readmemh("file"); -- which makes more sense.
function readmemh (file_name : string)
return mem_type is
VARIABLE result : mem_type;
FILE handle : TEXT ;
VARIABLE status : file_open_status; -- status for fopen
VARIABLE data_line : LINE;
VARIABLE b_address : BOOLEAN := FALSE; -- distinguish between addrs and data
VARIABLE the_character_from_data_line : CHARACTER;
VARIABLE converted_number : NATURAL := 0;
VARIABLE found_string_array : STRING(1 TO 128);
VARIABLE string_index : NATURAL := 0;
VARIABLE line_length : NATURAL := 0;
VARIABLE load_address : NATURAL := 0;
VARIABLE mem_index : NATURAL := 0;
begin -- readmemh
file_open (status, handle, file_name, READ_MODE);
WHILE NOT(endfile(handle)) LOOP
readline(handle, data_line);
line_length := data_line'LENGTH; -- match ' for emacs font-lock
b_address := false;
WHILE line_length > 0 LOOP
read(data_line, the_character_from_data_line);
-- check for the @ character indicating a new address wad
-- if found, ignore the line! This is just protection
IF '@' = the_character_from_data_line and not b_address then -- is addr
b_address := true;
end if;
-- process the hex address, character by character ...
IF NOT((' ' = the_character_from_data_line) or
('@' = the_character_from_data_line) or
(lf = the_character_from_data_line) or
(cr = the_character_from_data_line)) THEN
string_index := string_index + 1;
found_string_array(string_index) := the_character_from_data_line;
END IF;
line_length := line_length - 1;
end loop; -- read characters
if b_address then
mem_index := convert_string_to_number(found_string_array, string_index);
b_address := FALSE;
else
result(mem_index) := convert_string_to_std_logic(found_string_array, string_index, 2);
end if;
string_index := 0;
end loop; -- read lines
file_close (handle);
return result;
end readmemh;
-- purpose: emulate verilogs readmemb function (mostly)
-- in verilog you say: $readmemb ("file", array);
-- in VHDL, we say: array <= readmemb("file"); -- which makes more sense.
function readmemb (file_name : string)
return mem_type is
VARIABLE result : mem_type;
FILE handle : TEXT ;
VARIABLE status : file_open_status; -- status for fopen
VARIABLE data_line : LINE;
VARIABLE the_character_from_data_line : BIT_VECTOR(7 DOWNTO 0); -- '0' & '1's
VARIABLE line_length : NATURAL := 0;
VARIABLE mem_index : NATURAL := 0;
begin -- readmemb
file_open (status, handle, file_name, READ_MODE);
WHILE NOT(endfile(handle)) LOOP
readline(handle, data_line);
line_length := data_line'LENGTH; -- match ' for emacs font-lock
WHILE line_length > 7 LOOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -