📄 jtag_uart.vhd
字号:
-- signal aclr : IN STD_LOGIC;-- signal data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);-- signal clock : 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;--synthesis translate_off --the_jtag_uart_sim_scfifo_w, which is an e_instance 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 );--synthesis 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(-- aclr => fifo_clear,-- 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 offend europa;-- turn off superfluous VHDL processor warnings -- altera message_level Level1 -- altera message_off 10034 10035 10036 10037 10230 10240 10030 library altera;use altera.altera_europa_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 "/data/job/20061127/2047501/examples/vhdl/niosII_cycloneII_2c35/standard/std_2C35_sim/jtag_uart_input_stream.dat";-- synthesis translate_off-- convert functions deadlifted from e_rom.pmFUNCTION 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_vectorfunction 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 read(data_line, the_character_from_data_line); -- No @ characters allowed in binary/bit_vector mode result(mem_index) := To_stdlogicvector(the_character_from_data_line); mem_index := mem_index + 1; line_length := line_length - 8; end loop; -- read characters end loop; -- read lines file_close (handle);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -