--Legal Notice: (C)2018 Altera Corporation. All rights reserved. Your --use of Altera Corporation's design tools, logic functions and other --software and tools, and its AMPP partner logic functions, and any --output files any of the foregoing (including device programming or --simulation files), and any associated documentation or information are --expressly subject to the terms and conditions of the Altera Program --License Subscription Agreement or other applicable license agreement, --including, without limitation, that your use is for the sole purpose --of programming logic devices manufactured by Altera and sold by Altera --or its authorized distributors. Please refer to the applicable --agreement for further details. -- 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 altera_mf; use altera_mf.altera_mf_components.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_0_log_module is port ( -- inputs: signal clk : IN STD_LOGIC; signal data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal strobe : IN STD_LOGIC; signal valid : IN STD_LOGIC ); end entity jtag_uart_0_log_module; architecture europa of jtag_uart_0_log_module is file text_handle : TEXT ; -- synthesis translate_off -- purpose: convert 8 bit signal data to 8 bit string FUNCTION bin_to_char(vec_to_convert : STD_LOGIC_VECTOR (7 downto 0)) RETURN CHARACTER IS VARIABLE result: CHARACTER; BEGIN CASE vec_to_convert IS -- cover basic ascii printable characters... when X"0a" => result := lf; -- \n, linefeed when X"0d" => result := nul; -- \r, Ctrl-M when X"09" => result := ht; -- \t, Ctrl-I, TAB when X"20" => result := ' ' ; when X"21" => result := '!' ; when X"22" => result := '"' ; when X"23" => result := '#' ; when X"24" => result := '$' ; when X"25" => result := '%' ; when X"26" => result := '&' ; when X"27" => result := ''' ; -- sync ' char for hilighting txt editors when X"28" => result := '(' ; when X"29" => result := ')' ; when X"2a" => result := '*' ; when X"2b" => result := '+' ; when X"2c" => result := ',' ; when X"2d" => result := '-' ; when X"2e" => result := '.' ; when X"2f" => result := '/' ; when X"30" => result := '0' ; when X"31" => result := '1' ; when X"32" => result := '2' ; when X"33" => result := '3' ; when X"34" => result := '4' ; when X"35" => result := '5' ; when X"36" => result := '6' ; when X"37" => result := '7' ; when X"38" => result := '8' ; when X"39" => result := '9' ; when X"3a" => result := ':' ; when X"3b" => result := ';' ; when X"3c" => result := '<' ; when X"3d" => result := '=' ; when X"3e" => result := '>' ; when X"3f" => result := '?' ; when X"40" => result := '@' ; when X"41" => result := 'A' ; when X"42" => result := 'B' ; when X"43" => result := 'C' ; when X"44" => result := 'D' ; when X"45" => result := 'E' ; when X"46" => result := 'F' ; when X"47" => result := 'G' ; when X"48" => result := 'H' ; when X"49" => result := 'I' ; when X"4a" => result := 'J' ; when X"4b" => result := 'K' ; when X"4c" => result := 'L' ; when X"4d" => result := 'M' ; when X"4e" => result := 'N' ; when X"4f" => result := 'O' ; when X"50" => result := 'P' ; when X"51" => result := 'Q' ; when X"52" => result := 'R' ; when X"53" => result := 'S' ; when X"54" => result := 'T' ; when X"55" => result := 'U' ; when X"56" => result := 'V' ; when X"57" => result := 'W' ; when X"58" => result := 'X' ; when X"59" => result := 'Y' ; when X"5a" => result := 'Z' ; when X"5b" => result := '[' ; when X"5c" => result := '\' ; when X"5d" => result := ']' ; when X"5e" => result := '^' ; when X"5f" => result := '_' ; when X"60" => result := '`' ; when X"61" => result := 'a' ; when X"62" => result := 'b' ; when X"63" => result := 'c' ; when X"64" => result := 'd' ; when X"65" => result := 'e' ; when X"66" => result := 'f' ; when X"67" => result := 'g' ; when X"68" => result := 'h' ; when X"69" => result := 'i' ; when X"6a" => result := 'j' ; when X"6b" => result := 'k' ; when X"6c" => result := 'l' ; when X"6d" => result := 'm' ; when X"6e" => result := 'n' ; when X"6f" => result := 'o' ; when X"70" => result := 'p' ; when X"71" => result := 'q' ; when X"72" => result := 'r' ; when X"73" => result := 's' ; when X"74" => result := 't' ; when X"75" => result := 'u' ; when X"76" => result := 'v' ; when X"77" => result := 'w' ; when X"78" => result := 'x' ; when X"79" => result := 'y' ; when X"7a" => result := 'z' ; when X"7b" => result := '{' ; when X"7c" => result := '|' ; when X"7d" => result := '}' ; when X"7e" => result := '~' ; when X"7f" => result := '_' ; WHEN others => ASSERT False REPORT "data contains a non-printable character" SEVERITY Warning; result := nul; END case; RETURN result; end bin_to_char; -- synthesis translate_on begin --synthesis translate_off -- purpose: simulate verilog initial function to open file in write mode -- type : combinational -- inputs : initial -- outputs: process is variable initial : boolean := true; -- not initialized yet variable status : file_open_status; -- status for fopen begin -- process if initial = true then file_open (status, text_handle, "jtag_uart_0_output_stream.dat", WRITE_MODE); initial := false; -- done! end if; wait; -- wait forever end process; process (clk) variable data_string : LINE; -- for line buffer to file variable status : file_open_status; -- status for fopen variable echo_string : LINE; -- for line buffer to screen (stdout) begin -- process clk if clk'event and clk = '1' then -- sync ' chars for hilighting txt editors if (valid and strobe) = '1' then write (data_string,To_bitvector(data)); -- every char flushes line writeline (text_handle,data_string); file_close (text_handle); -- flush buffer file_open (status, text_handle, "jtag_uart_0_output_stream.dat", APPEND_MODE); -- save up characters into a line to send to the screen write (echo_string,bin_to_char(data)); if data = X"0a" or data = X"0d" then -- \n or \r will flush line writeline (output,echo_string); end if; end if; end if; end process; --synthesis translate_on end 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 altera_mf; use altera_mf.altera_mf_components.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity jtag_uart_0_sim_scfifo_w is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_wdata : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wr : IN STD_LOGIC; -- outputs: signal fifo_FF : OUT STD_LOGIC; signal r_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal wfifo_empty : OUT STD_LOGIC; signal wfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end entity jtag_uart_0_sim_scfifo_w; architecture europa of jtag_uart_0_sim_scfifo_w is --synthesis translate_off component jtag_uart_0_log_module is port ( -- inputs: signal clk : IN STD_LOGIC; signal data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal strobe : IN STD_LOGIC; signal valid : IN STD_LOGIC ); end component jtag_uart_0_log_module; --synthesis translate_on begin --synthesis translate_off --jtag_uart_0_log, which is an e_log jtag_uart_0_log : jtag_uart_0_log_module port map( clk => clk, data => fifo_wdata, strobe => fifo_wr, valid => fifo_wr ); wfifo_used <= A_REP(std_logic'('0'), 6); r_dat <= A_REP(std_logic'('0'), 8); fifo_FF <= std_logic'('0'); wfifo_empty <= std_logic'('1'); --synthesis translate_on end 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 altera_mf; use altera_mf.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library lpm; use lpm.all; entity jtag_uart_0_scfifo_w is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_clear : IN STD_LOGIC; signal fifo_wdata : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wr : IN STD_LOGIC; signal rd_wfifo : IN STD_LOGIC; -- outputs: signal fifo_FF : OUT STD_LOGIC; signal r_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal wfifo_empty : OUT STD_LOGIC; signal wfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end entity jtag_uart_0_scfifo_w; architecture europa of jtag_uart_0_scfifo_w is --synthesis translate_off component jtag_uart_0_sim_scfifo_w is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_wdata : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wr : IN STD_LOGIC; -- outputs: signal fifo_FF : OUT STD_LOGIC; signal r_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal wfifo_empty : OUT STD_LOGIC; signal wfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end component jtag_uart_0_sim_scfifo_w; --synthesis translate_on --synthesis read_comments_as_HDL on -- component scfifo is --GENERIC ( -- lpm_hint : STRING; -- lpm_numwords : NATURAL; -- lpm_showahead : STRING; -- lpm_type : STRING; -- lpm_width : NATURAL; -- lpm_widthu : NATURAL; -- overflow_checking : STRING; -- underflow_checking : STRING; -- use_eab : STRING -- ); -- PORT ( -- signal full : OUT STD_LOGIC; -- signal q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- signal usedw : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); -- signal empty : OUT STD_LOGIC; -- signal rdreq : IN STD_LOGIC; -- 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_0_sim_scfifo_w, which is an e_instance the_jtag_uart_0_sim_scfifo_w : jtag_uart_0_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 off end 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 altera_mf; use altera_mf.altera_mf_components.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_0_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_0_drom_module; architecture europa of jtag_uart_0_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 "jtag_uart_0_input_stream.dat"; -- synthesis 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); IF (status=OPEN_OK) THEN 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 END IF; 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); return result; end readmemb; -- synthesis translate_on begin --synthesis translate_off q <= mem_array(CONV_INTEGER(UNSIGNED((address)))); process (clk, reset_n) begin if reset_n = '0' then d1_pre <= std_logic'('0'); d2_pre <= std_logic'('0'); d3_pre <= std_logic'('0'); d4_pre <= std_logic'('0'); d5_pre <= std_logic'('0'); d6_pre <= std_logic'('0'); d7_pre <= std_logic'('0'); d8_pre <= std_logic'('0'); d9_pre <= std_logic'('0'); new_rom <= std_logic'('0'); elsif clk'event and clk = '1' then d1_pre <= pre; d2_pre <= d1_pre; d3_pre <= d2_pre; d4_pre <= d3_pre; d5_pre <= d4_pre; d6_pre <= d5_pre; d7_pre <= d6_pre; d8_pre <= d7_pre; d9_pre <= d8_pre; new_rom <= d9_pre; end if; end process; num_bytes <= mutex(1); safe <= safe_wire; safe_wire <= to_std_logic( address < mutex(1) ); process (clk, reset_n) begin if reset_n = '0' then safe_delay <= '0'; elsif clk'event and clk = '1' then -- balance ' for emacs quoting safe_delay <= safe_wire; end if; end process; process (clk, reset_n) variable poll_count : integer := POLL_RATE; -- STD_LOGIC_VECTOR (31:0); variable status : file_open_status; -- status for fopen variable mutex_string : LINE; -- temp space for read/write data variable stream_string : LINE; -- temp space for read data variable init_done : BOOLEAN; -- only used if non-interactive variable interactive : BOOLEAN := FALSE; begin if reset_n /= '1' then address <= "000000000000"; mem_array(0) <= X"00"; mutex(0) <= X"00000000"; mutex(1) <= X"00000000"; pre <= '0'; init_done := FALSE; elsif clk'event and clk = '1' then -- balance ' for emacs quoting pre <= '0'; if incr_addr = '1' and safe_wire = '1' then address <= address + "000000000001"; end if; -- blast mutex via textio after falling edge of safe if mutex(0) /= X"00000000" and safe_wire = '0' and safe_delay = '1' then if interactive then -- bash mutex file_open (status, mutex_handle, "jtag_uart_0_input_mutex.dat", WRITE_MODE); write (mutex_string, string'("0")); -- balance ' for emacs quoting writeline (mutex_handle, mutex_string); file_close (mutex_handle); mutex(0) <= X"00000000"; else -- non-nteractive does not bash mutex: it stops poll counter init_done := TRUE; end if; end if; if poll_count < POLL_RATE then -- wait if not init_done then -- stop counting if init_done is TRUE poll_count := poll_count + 1; end if; else -- do the real work poll_count := 0; -- get mutex via textio ... mutex(0) <= get_mutex_val ("jtag_uart_0_input_mutex.dat"); if mutex(0) /= X"00000000" and safe_wire = '0' then -- read stream into array after previous stream is complete mutex (1) <= mutex (0); -- save mutex value for address compare -- get mem_array via textio ... mem_array <= readmemb("jtag_uart_0_input_stream.dat"); -- prep address and pre-pulse to alert world to new contents address <= "000000000000"; pre <= '1'; end if; -- poll_count end if; -- clock end if; -- reset end process; --synthesis translate_on end 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 altera_mf; use altera_mf.altera_mf_components.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity jtag_uart_0_sim_scfifo_r is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_rd : IN STD_LOGIC; signal rst_n : IN STD_LOGIC; -- outputs: signal fifo_EF : OUT STD_LOGIC; signal fifo_rdata : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal rfifo_full : OUT STD_LOGIC; signal rfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end entity jtag_uart_0_sim_scfifo_r; architecture europa of jtag_uart_0_sim_scfifo_r is --synthesis translate_off component jtag_uart_0_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 component jtag_uart_0_drom_module; --synthesis translate_on signal bytes_left : STD_LOGIC_VECTOR (31 DOWNTO 0); signal fifo_rd_d : STD_LOGIC; signal internal_fifo_rdata1 : STD_LOGIC_VECTOR (7 DOWNTO 0); signal internal_rfifo_full1 : STD_LOGIC; signal new_rom : STD_LOGIC; signal num_bytes : STD_LOGIC_VECTOR (31 DOWNTO 0); signal rfifo_entries : STD_LOGIC_VECTOR (6 DOWNTO 0); signal safe : STD_LOGIC; begin --vhdl renameroo for output signals fifo_rdata <= internal_fifo_rdata1; --vhdl renameroo for output signals rfifo_full <= internal_rfifo_full1; --synthesis translate_off --jtag_uart_0_drom, which is an e_drom jtag_uart_0_drom : jtag_uart_0_drom_module port map( new_rom => new_rom, num_bytes => num_bytes, q => internal_fifo_rdata1, safe => safe, clk => clk, incr_addr => fifo_rd_d, reset_n => rst_n ); -- Generate rfifo_entries for simulation process (clk, rst_n) begin if rst_n = '0' then bytes_left <= std_logic_vector'("00000000000000000000000000000000"); fifo_rd_d <= std_logic'('0'); elsif clk'event and clk = '1' then fifo_rd_d <= fifo_rd; -- decrement on read if std_logic'(fifo_rd_d) = '1' then bytes_left <= A_EXT (((std_logic_vector'("0") & (bytes_left)) - (std_logic_vector'("00000000000000000000000000000000") & (A_TOSTDLOGICVECTOR(std_logic'('1'))))), 32); end if; -- catch new contents if std_logic'(new_rom) = '1' then bytes_left <= num_bytes; end if; end if; end process; fifo_EF <= to_std_logic((bytes_left = std_logic_vector'("00000000000000000000000000000000"))); internal_rfifo_full1 <= to_std_logic((bytes_left>std_logic_vector'("00000000000000000000000001000000"))); rfifo_entries <= A_EXT (A_WE_StdLogicVector((std_logic'((internal_rfifo_full1)) = '1'), std_logic_vector'("00000000000000000000000001000000"), bytes_left), 7); rfifo_used <= rfifo_entries(5 DOWNTO 0); --synthesis translate_on end 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 altera_mf; use altera_mf.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library lpm; use lpm.all; entity jtag_uart_0_scfifo_r is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_clear : IN STD_LOGIC; signal fifo_rd : IN STD_LOGIC; signal rst_n : IN STD_LOGIC; signal t_dat : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal wr_rfifo : IN STD_LOGIC; -- outputs: signal fifo_EF : OUT STD_LOGIC; signal fifo_rdata : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal rfifo_full : OUT STD_LOGIC; signal rfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end entity jtag_uart_0_scfifo_r; architecture europa of jtag_uart_0_scfifo_r is --synthesis translate_off component jtag_uart_0_sim_scfifo_r is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_rd : IN STD_LOGIC; signal rst_n : IN STD_LOGIC; -- outputs: signal fifo_EF : OUT STD_LOGIC; signal fifo_rdata : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal rfifo_full : OUT STD_LOGIC; signal rfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end component jtag_uart_0_sim_scfifo_r; --synthesis translate_on --synthesis read_comments_as_HDL on -- component scfifo is --GENERIC ( -- lpm_hint : STRING; -- lpm_numwords : NATURAL; -- lpm_showahead : STRING; -- lpm_type : STRING; -- lpm_width : NATURAL; -- lpm_widthu : NATURAL; -- overflow_checking : STRING; -- underflow_checking : STRING; -- use_eab : STRING -- ); -- PORT ( -- signal full : OUT STD_LOGIC; -- signal q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- signal usedw : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); -- signal empty : OUT STD_LOGIC; -- signal rdreq : IN STD_LOGIC; -- 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_EF : STD_LOGIC; signal internal_fifo_rdata : STD_LOGIC_VECTOR (7 DOWNTO 0); signal internal_rfifo_full : STD_LOGIC; signal internal_rfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0); begin --vhdl renameroo for output signals fifo_EF <= internal_fifo_EF; --vhdl renameroo for output signals fifo_rdata <= internal_fifo_rdata; --vhdl renameroo for output signals rfifo_full <= internal_rfifo_full; --vhdl renameroo for output signals rfifo_used <= internal_rfifo_used; --synthesis translate_off --the_jtag_uart_0_sim_scfifo_r, which is an e_instance the_jtag_uart_0_sim_scfifo_r : jtag_uart_0_sim_scfifo_r port map( fifo_EF => internal_fifo_EF, fifo_rdata => internal_fifo_rdata, rfifo_full => internal_rfifo_full, rfifo_used => internal_rfifo_used, clk => clk, fifo_rd => fifo_rd, rst_n => rst_n ); --synthesis translate_on --synthesis read_comments_as_HDL on -- rfifo : 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 => t_dat, -- empty => internal_fifo_EF, -- full => internal_rfifo_full, -- q => internal_fifo_rdata, -- rdreq => fifo_rd, -- usedw => internal_rfifo_used, -- wrreq => wr_rfifo -- ); -- --synthesis read_comments_as_HDL off end 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 altera_mf; use altera_mf.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library lpm; use lpm.all; entity jtag_uart_0 is port ( -- inputs: signal av_address : IN STD_LOGIC; signal av_chipselect : IN STD_LOGIC; signal av_read_n : IN STD_LOGIC; signal av_write_n : IN STD_LOGIC; signal av_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); signal clk : IN STD_LOGIC; signal rst_n : IN STD_LOGIC; -- outputs: signal av_irq : OUT STD_LOGIC; signal av_readdata : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); signal av_waitrequest : OUT STD_LOGIC; signal dataavailable : OUT STD_LOGIC; signal readyfordata : OUT STD_LOGIC ); attribute ALTERA_ATTRIBUTE : string; attribute ALTERA_ATTRIBUTE of jtag_uart_0 : entity is "SUPPRESS_DA_RULE_INTERNAL=""R101,C106,D101,D103"""; end entity jtag_uart_0; architecture europa of jtag_uart_0 is component jtag_uart_0_scfifo_w is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_clear : IN STD_LOGIC; signal fifo_wdata : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wr : IN STD_LOGIC; signal rd_wfifo : IN STD_LOGIC; -- outputs: signal fifo_FF : OUT STD_LOGIC; signal r_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal wfifo_empty : OUT STD_LOGIC; signal wfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end component jtag_uart_0_scfifo_w; component jtag_uart_0_scfifo_r is port ( -- inputs: signal clk : IN STD_LOGIC; signal fifo_clear : IN STD_LOGIC; signal fifo_rd : IN STD_LOGIC; signal rst_n : IN STD_LOGIC; signal t_dat : IN STD_LOGIC_VECTOR (7 DOWNTO 0); signal wr_rfifo : IN STD_LOGIC; -- outputs: signal fifo_EF : OUT STD_LOGIC; signal fifo_rdata : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); signal rfifo_full : OUT STD_LOGIC; signal rfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); end component jtag_uart_0_scfifo_r; --synthesis read_comments_as_HDL on -- component alt_jtag_atlantic is --GENERIC ( -- INSTANCE_ID : NATURAL; -- LOG2_RXFIFO_DEPTH : NATURAL; -- LOG2_TXFIFO_DEPTH : NATURAL; -- SLD_AUTO_INSTANCE_INDEX : STRING -- ); -- PORT ( -- signal t_pause : OUT STD_LOGIC; -- signal r_ena : OUT STD_LOGIC; -- signal t_ena : OUT STD_LOGIC; -- signal t_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- signal t_dav : IN STD_LOGIC; -- signal rst_n : IN STD_LOGIC; -- signal r_dat : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- signal r_val : IN STD_LOGIC; -- signal clk : IN STD_LOGIC -- ); -- end component alt_jtag_atlantic; --synthesis read_comments_as_HDL off signal ac : STD_LOGIC; signal activity : STD_LOGIC; signal fifo_AE : STD_LOGIC; signal fifo_AF : STD_LOGIC; signal fifo_EF : STD_LOGIC; signal fifo_FF : STD_LOGIC; signal fifo_clear : STD_LOGIC; signal fifo_rd : STD_LOGIC; signal fifo_rdata : STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wdata : STD_LOGIC_VECTOR (7 DOWNTO 0); signal fifo_wr : STD_LOGIC; signal ien_AE : STD_LOGIC; signal ien_AF : STD_LOGIC; signal internal_av_waitrequest : STD_LOGIC; signal ipen_AE : STD_LOGIC; signal ipen_AF : STD_LOGIC; signal pause_irq : STD_LOGIC; signal r_dat : STD_LOGIC_VECTOR (7 DOWNTO 0); signal r_ena : STD_LOGIC; signal r_val : STD_LOGIC; signal rd_wfifo : STD_LOGIC; signal read_0 : STD_LOGIC; signal rfifo_full : STD_LOGIC; signal rfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0); signal rvalid : STD_LOGIC; signal sim_r_ena : STD_LOGIC; signal sim_t_dat : STD_LOGIC; signal sim_t_ena : STD_LOGIC; signal sim_t_pause : STD_LOGIC; signal t_dat : STD_LOGIC_VECTOR (7 DOWNTO 0); signal t_dav : STD_LOGIC; signal t_ena : STD_LOGIC; signal t_pause : STD_LOGIC; signal wfifo_empty : STD_LOGIC; signal wfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0); signal woverflow : STD_LOGIC; signal wr_rfifo : STD_LOGIC; begin --avalon_jtag_slave, which is an e_avalon_slave rd_wfifo <= r_ena AND NOT wfifo_empty; wr_rfifo <= t_ena AND NOT rfifo_full; fifo_clear <= NOT rst_n; --the_jtag_uart_0_scfifo_w, which is an e_instance the_jtag_uart_0_scfifo_w : jtag_uart_0_scfifo_w port map( fifo_FF => fifo_FF, r_dat => r_dat, wfifo_empty => wfifo_empty, wfifo_used => wfifo_used, clk => clk, fifo_clear => fifo_clear, fifo_wdata => fifo_wdata, fifo_wr => fifo_wr, rd_wfifo => rd_wfifo ); --the_jtag_uart_0_scfifo_r, which is an e_instance the_jtag_uart_0_scfifo_r : jtag_uart_0_scfifo_r port map( fifo_EF => fifo_EF, fifo_rdata => fifo_rdata, rfifo_full => rfifo_full, rfifo_used => rfifo_used, clk => clk, fifo_clear => fifo_clear, fifo_rd => fifo_rd, rst_n => rst_n, t_dat => t_dat, wr_rfifo => wr_rfifo ); ipen_AE <= ien_AE AND fifo_AE; ipen_AF <= ien_AF AND ((pause_irq OR fifo_AF)); av_irq <= ipen_AE OR ipen_AF; activity <= t_pause OR t_ena; process (clk, rst_n) begin if rst_n = '0' then pause_irq <= std_logic'('0'); elsif clk'event and clk = '1' then -- only if fifo is not empty... if std_logic'((t_pause AND NOT fifo_EF)) = '1' then pause_irq <= std_logic'('1'); elsif std_logic'(read_0) = '1' then pause_irq <= std_logic'('0'); end if; end if; end process; process (clk, rst_n) begin if rst_n = '0' then r_val <= std_logic'('0'); t_dav <= std_logic'('1'); elsif clk'event and clk = '1' then r_val <= r_ena AND NOT wfifo_empty; t_dav <= NOT rfifo_full; end if; end process; process (clk, rst_n) begin if rst_n = '0' then fifo_AE <= std_logic'('0'); fifo_AF <= std_logic'('0'); fifo_wr <= std_logic'('0'); rvalid <= std_logic'('0'); read_0 <= std_logic'('0'); ien_AE <= std_logic'('0'); ien_AF <= std_logic'('0'); ac <= std_logic'('0'); woverflow <= std_logic'('0'); internal_av_waitrequest <= std_logic'('1'); elsif clk'event and clk = '1' then fifo_AE <= to_std_logic(((std_logic_vector'("0000000000000000000000000") & (Std_Logic_Vector'(A_ToStdLogicVector(fifo_FF) & wfifo_used)))<=std_logic_vector'("00000000000000000000000000001000"))); fifo_AF <= to_std_logic(((std_logic_vector'("000000000000000000000000") & (((std_logic_vector'("01000000") - (std_logic_vector'("0") & (Std_Logic_Vector'(A_ToStdLogicVector(rfifo_full) & rfifo_used)))))))<=std_logic_vector'("00000000000000000000000000001000"))); fifo_wr <= std_logic'('0'); read_0 <= std_logic'('0'); internal_av_waitrequest <= NOT (((av_chipselect AND ((NOT av_write_n OR NOT av_read_n))) AND internal_av_waitrequest)); if std_logic'(activity) = '1' then ac <= std_logic'('1'); end if; -- write if std_logic'(((av_chipselect AND NOT av_write_n) AND internal_av_waitrequest)) = '1' then -- addr 1 is control; addr 0 is data if std_logic'(av_address) = '1' then ien_AF <= av_writedata(0); ien_AE <= av_writedata(1); if std_logic'((av_writedata(10) AND NOT activity)) = '1' then ac <= std_logic'('0'); end if; else fifo_wr <= NOT fifo_FF; woverflow <= fifo_FF; end if; end if; -- read if std_logic'(((av_chipselect AND NOT av_read_n) AND internal_av_waitrequest)) = '1' then -- addr 1 is interrupt; addr 0 is data if std_logic'(NOT av_address) = '1' then rvalid <= NOT fifo_EF; end if; read_0 <= NOT av_address; end if; end if; end process; fifo_wdata <= av_writedata(7 DOWNTO 0); fifo_rd <= A_WE_StdLogic((std_logic'(((((av_chipselect AND NOT av_read_n) AND internal_av_waitrequest) AND NOT av_address))) = '1'), NOT fifo_EF, std_logic'('0')); av_readdata <= A_EXT (A_WE_StdLogicVector((std_logic'(read_0) = '1'), (std_logic_vector'("0") & ((A_REP(std_logic'('0'), 9) & A_ToStdLogicVector(rfifo_full) & rfifo_used & A_ToStdLogicVector(rvalid) & A_ToStdLogicVector(woverflow) & A_ToStdLogicVector(NOT fifo_FF) & A_ToStdLogicVector(NOT fifo_EF) & A_ToStdLogicVector(std_logic'('0')) & A_ToStdLogicVector(ac) & A_ToStdLogicVector(ipen_AE) & A_ToStdLogicVector(ipen_AF) & fifo_rdata))), (A_REP(std_logic'('0'), 9) & ((std_logic_vector'("01000000") - (std_logic_vector'("0") & (Std_Logic_Vector'(A_ToStdLogicVector(fifo_FF) & wfifo_used))))) & A_ToStdLogicVector(rvalid) & A_ToStdLogicVector(woverflow) & A_ToStdLogicVector(NOT fifo_FF) & A_ToStdLogicVector(NOT fifo_EF) & A_ToStdLogicVector(std_logic'('0')) & A_ToStdLogicVector(ac) & A_ToStdLogicVector(ipen_AE) & A_ToStdLogicVector(ipen_AF) & A_REP(std_logic'('0'), 6) & A_ToStdLogicVector(ien_AE) & A_ToStdLogicVector(ien_AF))), 32); process (clk, rst_n) begin if rst_n = '0' then readyfordata <= std_logic'('0'); elsif clk'event and clk = '1' then readyfordata <= NOT fifo_FF; end if; end process; --vhdl renameroo for output signals av_waitrequest <= internal_av_waitrequest; --synthesis translate_off -- Tie off Atlantic Interface signals not used for simulation process (clk) begin if clk'event and clk = '1' then sim_t_pause <= std_logic'('0'); sim_t_ena <= std_logic'('0'); sim_t_dat <= Vector_To_Std_Logic(A_WE_StdLogicVector((std_logic'(t_dav) = '1'), r_dat, A_REP(r_val, 8))); sim_r_ena <= std_logic'('0'); end if; end process; r_ena <= sim_r_ena; t_ena <= sim_t_ena; t_dat <= std_logic_vector'("0000000") & (A_TOSTDLOGICVECTOR(sim_t_dat)); t_pause <= sim_t_pause; process (fifo_EF) begin dataavailable <= NOT fifo_EF; end process; --synthesis translate_on --synthesis read_comments_as_HDL on -- jtag_uart_0_alt_jtag_atlantic : alt_jtag_atlantic -- generic map( -- INSTANCE_ID => 0, -- LOG2_RXFIFO_DEPTH => 6, -- LOG2_TXFIFO_DEPTH => 6, -- SLD_AUTO_INSTANCE_INDEX => "YES" -- ) -- port map( -- clk => clk, -- r_dat => r_dat, -- r_ena => r_ena, -- r_val => r_val, -- rst_n => rst_n, -- t_dat => t_dat, -- t_dav => t_dav, -- t_ena => t_ena, -- t_pause => t_pause -- ); -- -- process (clk, rst_n) -- begin -- if rst_n = '0' then -- dataavailable <= std_logic'('0'); -- elsif clk'event and clk = '1' then -- dataavailable <= NOT fifo_EF; -- end if; -- -- end process; -- --synthesis read_comments_as_HDL off end europa;