//Legal Notice: (C)2005 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. // synthesis translate_off `timescale 1ns / 100ps // synthesis translate_on module jtag_uart_0_log_module ( // inputs: clk, data, strobe, valid ); input clk; input [ 7: 0] data; input strobe; input valid; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS reg [31:0] text_handle; // for $fopen initial text_handle = $fopen ("C:/DE2/DE2_NET/nios_0_sim/jtag_uart_0_output_stream.dat"); always @(posedge clk) begin if (valid && strobe) begin $fwrite (text_handle, "%b\n", data); // echo raw binary strings to file as ascii to screen $write("%s", ((data == 8'hd) ? 8'ha : data)); // non-standard; poorly documented; required to get real data stream. $fflush (text_handle); end end // clk //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on endmodule module jtag_uart_0_sim_scfifo_w ( // inputs: clk, fifo_wdata, fifo_wr, // outputs: fifo_FF, r_dat, wfifo_empty, wfifo_used ); output fifo_FF; output [ 7: 0] r_dat; output wfifo_empty; output [ 5: 0] wfifo_used; input clk; input [ 7: 0] fifo_wdata; input fifo_wr; wire fifo_FF; wire [ 7: 0] r_dat; wire wfifo_empty; wire [ 5: 0] wfifo_used; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS //jtag_uart_0_log, which is an e_log jtag_uart_0_log_module jtag_uart_0_log ( .clk (clk), .data (fifo_wdata), .strobe (fifo_wr), .valid (fifo_wr) ); assign wfifo_used = {6{1'b0}}; assign r_dat = {8{1'b0}}; assign fifo_FF = 1'b0; assign wfifo_empty = 1'b1; //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on endmodule module jtag_uart_0_scfifo_w ( // inputs: clk, fifo_wdata, fifo_wr, rd_wfifo, // outputs: fifo_FF, r_dat, wfifo_empty, wfifo_used ); output fifo_FF; output [ 7: 0] r_dat; output wfifo_empty; output [ 5: 0] wfifo_used; input clk; input [ 7: 0] fifo_wdata; input fifo_wr; input rd_wfifo; wire fifo_FF; wire [ 7: 0] r_dat; wire wfifo_empty; wire [ 5: 0] wfifo_used; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS jtag_uart_0_sim_scfifo_w the_jtag_uart_0_sim_scfifo_w ( .clk (clk), .fifo_FF (fifo_FF), .fifo_wdata (fifo_wdata), .fifo_wr (fifo_wr), .r_dat (r_dat), .wfifo_empty (wfifo_empty), .wfifo_used (wfifo_used) ); //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on //synthesis read_comments_as_HDL on // scfifo wfifo // ( // .clock (clk), // .data (fifo_wdata), // .empty (wfifo_empty), // .full (fifo_FF), // .q (r_dat), // .rdreq (rd_wfifo), // .usedw (wfifo_used), // .wrreq (fifo_wr) // ); // // defparam wfifo.lpm_hint = "RAM_BLOCK_TYPE=AUTO", // wfifo.lpm_numwords = 64, // wfifo.lpm_showahead = "OFF", // wfifo.lpm_type = "scfifo", // wfifo.lpm_width = 8, // wfifo.lpm_widthu = 6, // wfifo.overflow_checking = "OFF", // wfifo.underflow_checking = "OFF", // wfifo.use_eab = "ON"; // //synthesis read_comments_as_HDL off endmodule module jtag_uart_0_drom_module ( // inputs: clk, incr_addr, reset_n, // outputs: new_rom, num_bytes, q, safe ); parameter POLL_RATE = 100; output new_rom; output [ 31: 0] num_bytes; output [ 7: 0] q; output safe; input clk; input incr_addr; input reset_n; reg [ 11: 0] address; reg d1_pre; reg d2_pre; reg d3_pre; reg d4_pre; reg d5_pre; reg d6_pre; reg d7_pre; reg d8_pre; reg d9_pre; reg [ 7: 0] mem_array [2047: 0]; reg [ 31: 0] mutex [ 1: 0]; reg new_rom; wire [ 31: 0] num_bytes; reg pre; wire [ 7: 0] q; wire safe; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS assign q = mem_array[address]; always @(posedge clk or negedge reset_n) begin if (reset_n == 0) begin d1_pre <= 0; d2_pre <= 0; d3_pre <= 0; d4_pre <= 0; d5_pre <= 0; d6_pre <= 0; d7_pre <= 0; d8_pre <= 0; d9_pre <= 0; new_rom <= 0; end else if (1) begin 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 end assign num_bytes = mutex[1]; reg safe_delay; reg [31:0] poll_count; reg [31:0] mutex_handle; wire interactive = 1'b0 ; // ' assign safe = (address < mutex[1]); initial poll_count = POLL_RATE; always @(posedge clk or negedge reset_n) begin if (reset_n !== 1) begin safe_delay <= 0; end else begin safe_delay <= safe; end end // safe_delay always @(posedge clk or negedge reset_n) begin if (reset_n !== 1) begin // dont worry about null _stream.dat file address <= 0; mem_array[0] <= 0; mutex[0] <= 0; mutex[1] <= 0; pre <= 0; end else begin // deal with the non-reset case pre <= 0; if (incr_addr && safe) address <= address + 1; if (mutex[0] && !safe && safe_delay) begin // and blast the mutex after falling edge of safe if interactive if (interactive) begin mutex_handle = $fopen ("C:/DE2/DE2_NET/nios_0_sim/jtag_uart_0_input_mutex.dat"); $fdisplay (mutex_handle, "0"); $fclose (mutex_handle); // $display ($stime, "\t%m:\n\t\tMutex cleared!"); end else begin // sleep until next reset, do not bash mutex. wait (!reset_n); end end // OK to bash mutex. if (poll_count < POLL_RATE) begin // wait poll_count = poll_count + 1; end else begin // do the interesting stuff. poll_count = 0; $readmemh ("C:/DE2/DE2_NET/nios_0_sim/jtag_uart_0_input_mutex.dat", mutex); if (mutex[0] && !safe) begin // read stream into mem_array after current characters are gone! // save mutex[0] value to compare to address (generates 'safe') mutex[1] <= mutex[0]; // $display ($stime, "\t%m:\n\t\tMutex hit: Trying to read %d bytes...", mutex[0]); $readmemb("C:/DE2/DE2_NET/nios_0_sim/jtag_uart_0_input_stream.dat", mem_array); // bash address and send pulse outside to send the char: address <= 0; pre <= -1; end // else mutex miss... end // poll_count end // reset end // posedge clk //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on endmodule module jtag_uart_0_sim_scfifo_r ( // inputs: clk, fifo_rd, rst_n, // outputs: fifo_EF, fifo_rdata, rfifo_full, rfifo_used ); output fifo_EF; output [ 7: 0] fifo_rdata; output rfifo_full; output [ 5: 0] rfifo_used; input clk; input fifo_rd; input rst_n; reg [ 31: 0] bytes_left; wire fifo_EF; reg fifo_rd_d; wire [ 7: 0] fifo_rdata; wire new_rom; wire [ 31: 0] num_bytes; wire [ 6: 0] rfifo_entries; wire rfifo_full; wire [ 5: 0] rfifo_used; wire safe; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS //jtag_uart_0_drom, which is an e_drom jtag_uart_0_drom_module jtag_uart_0_drom ( .clk (clk), .incr_addr (fifo_rd_d), .new_rom (new_rom), .num_bytes (num_bytes), .q (fifo_rdata), .reset_n (rst_n), .safe (safe) ); // Generate rfifo_entries for simulation always @(posedge clk or negedge rst_n) begin if (rst_n == 0) begin bytes_left <= 32'h0; fifo_rd_d <= 1'b0; end else begin fifo_rd_d <= fifo_rd; // decrement on read if (fifo_rd_d) bytes_left <= bytes_left - 1'b1; // catch new contents if (new_rom) bytes_left <= num_bytes; end end assign fifo_EF = bytes_left == 32'b0; assign rfifo_full = bytes_left > 7'h40; assign rfifo_entries = (rfifo_full) ? 7'h40 : bytes_left; assign rfifo_used = rfifo_entries[5 : 0]; //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on endmodule module jtag_uart_0_scfifo_r ( // inputs: clk, fifo_rd, rst_n, t_dat, wr_rfifo, // outputs: fifo_EF, fifo_rdata, rfifo_full, rfifo_used ); output fifo_EF; output [ 7: 0] fifo_rdata; output rfifo_full; output [ 5: 0] rfifo_used; input clk; input fifo_rd; input rst_n; input [ 7: 0] t_dat; input wr_rfifo; wire fifo_EF; wire [ 7: 0] fifo_rdata; wire rfifo_full; wire [ 5: 0] rfifo_used; //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS jtag_uart_0_sim_scfifo_r the_jtag_uart_0_sim_scfifo_r ( .clk (clk), .fifo_EF (fifo_EF), .fifo_rd (fifo_rd), .fifo_rdata (fifo_rdata), .rfifo_full (rfifo_full), .rfifo_used (rfifo_used), .rst_n (rst_n) ); //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on //synthesis read_comments_as_HDL on // scfifo rfifo // ( // .clock (clk), // .data (t_dat), // .empty (fifo_EF), // .full (rfifo_full), // .q (fifo_rdata), // .rdreq (fifo_rd), // .usedw (rfifo_used), // .wrreq (wr_rfifo) // ); // // defparam rfifo.lpm_hint = "RAM_BLOCK_TYPE=AUTO", // rfifo.lpm_numwords = 64, // rfifo.lpm_showahead = "OFF", // rfifo.lpm_type = "scfifo", // rfifo.lpm_width = 8, // rfifo.lpm_widthu = 6, // rfifo.overflow_checking = "OFF", // rfifo.underflow_checking = "OFF", // rfifo.use_eab = "ON"; // //synthesis read_comments_as_HDL off endmodule module jtag_uart_0 ( // inputs: av_address, av_chipselect, av_read_n, av_write_n, av_writedata, clk, rst_n, // outputs: av_irq, av_readdata, av_waitrequest, dataavailable, readyfordata ); output av_irq; output [ 31: 0] av_readdata; output av_waitrequest; output dataavailable; output readyfordata; input av_address; input av_chipselect; input av_read_n; input av_write_n; input [ 31: 0] av_writedata; input clk; input rst_n; reg ac; wire activity; wire av_irq; wire [ 31: 0] av_readdata; reg av_waitrequest; reg dataavailable; reg fifo_AE; reg fifo_AF; wire fifo_EF; wire fifo_FF; wire fifo_rd; wire [ 7: 0] fifo_rdata; wire [ 7: 0] fifo_wdata; reg fifo_wr; reg ien_AE; reg ien_AF; wire ipen_AE; wire ipen_AF; reg pause_irq; wire [ 7: 0] r_dat; reg r_ena; reg r_val; wire rd_wfifo; reg read_0; reg readyfordata; wire rfifo_full; wire [ 5: 0] rfifo_used; reg rvalid; reg [ 7: 0] t_dat; reg t_dav; reg t_ena; reg t_pause; wire wfifo_empty; wire [ 5: 0] wfifo_used; reg woverflow; wire wr_rfifo; //avalon_jtag_slave, which is an e_avalon_slave assign rd_wfifo = r_ena & ~wfifo_empty; assign wr_rfifo = t_ena & ~rfifo_full; jtag_uart_0_scfifo_w the_jtag_uart_0_scfifo_w ( .clk (clk), .fifo_FF (fifo_FF), .fifo_wdata (fifo_wdata), .fifo_wr (fifo_wr), .r_dat (r_dat), .rd_wfifo (rd_wfifo), .wfifo_empty (wfifo_empty), .wfifo_used (wfifo_used) ); jtag_uart_0_scfifo_r the_jtag_uart_0_scfifo_r ( .clk (clk), .fifo_EF (fifo_EF), .fifo_rd (fifo_rd), .fifo_rdata (fifo_rdata), .rfifo_full (rfifo_full), .rfifo_used (rfifo_used), .rst_n (rst_n), .t_dat (t_dat), .wr_rfifo (wr_rfifo) ); assign ipen_AE = ien_AE & fifo_AE; assign ipen_AF = ien_AF & (pause_irq | fifo_AF); assign av_irq = ipen_AE | ipen_AF; assign activity = t_pause | t_ena; always @(posedge clk or negedge rst_n) begin if (rst_n == 0) pause_irq <= 1'b0; else // only if fifo is not empty... if (t_pause & ~fifo_EF) pause_irq <= 1'b1; else if (read_0) pause_irq <= 1'b0; end always @(posedge clk or negedge rst_n) begin if (rst_n == 0) begin r_val <= 1'b0; t_dav <= 1'b1; end else begin r_val <= r_ena & ~wfifo_empty; t_dav <= ~rfifo_full; end end always @(posedge clk or negedge rst_n) begin if (rst_n == 0) begin fifo_AE <= 1'b0; fifo_AF <= 1'b0; fifo_wr <= 1'b0; rvalid <= 1'b0; read_0 <= 1'b0; ien_AE <= 1'b0; ien_AF <= 1'b0; ac <= 1'b0; woverflow <= 1'b0; av_waitrequest <= 1'b1; end else begin fifo_AE <= {fifo_FF,wfifo_used} <= 8; fifo_AF <= (7'h40 - {rfifo_full,rfifo_used}) <= 8; fifo_wr <= 1'b0; read_0 <= 1'b0; av_waitrequest <= ~(av_chipselect & (~av_write_n | ~av_read_n) & av_waitrequest); if (activity) ac <= 1'b1; // write if (av_chipselect & ~av_write_n & av_waitrequest) // addr 1 is control; addr 0 is data if (av_address) begin ien_AF <= av_writedata[0]; ien_AE <= av_writedata[1]; if (av_writedata[10] & ~activity) ac <= 1'b0; end else begin fifo_wr <= ~fifo_FF; woverflow <= fifo_FF; end // read if (av_chipselect & ~av_read_n & av_waitrequest) begin // addr 1 is interrupt; addr 0 is data if (~av_address) rvalid <= ~fifo_EF; read_0 <= ~av_address; end end end assign fifo_wdata = av_writedata[7 : 0]; assign fifo_rd = (av_chipselect & ~av_read_n & av_waitrequest & ~av_address) ? ~fifo_EF : 1'b0; assign av_readdata = read_0 ? { {9{1'b0}},rfifo_full,rfifo_used,rvalid,woverflow,~fifo_FF,~fifo_EF,1'b0,ac,ipen_AE,ipen_AF,fifo_rdata } : { {9{1'b0}},(7'h40 - {fifo_FF,wfifo_used}),rvalid,woverflow,~fifo_FF,~fifo_EF,1'b0,ac,ipen_AE,ipen_AF,{6{1'b0}},ien_AE,ien_AF }; always @(posedge clk or negedge rst_n) begin if (rst_n == 0) readyfordata <= 0; else if (1) readyfordata <= ~fifo_FF; end //synthesis translate_off //////////////// SIMULATION-ONLY CONTENTS // Tie off Atlantic Interface signals not used for simulation always @(posedge clk) begin t_pause <= 1'b0; t_ena <= 1'b0; t_dat <= t_dav ? r_dat : {8{r_val}}; r_ena <= 1'b0; end always @(fifo_EF) begin if (1) dataavailable <= ~fifo_EF; end //////////////// END SIMULATION-ONLY CONTENTS //synthesis translate_on //synthesis read_comments_as_HDL on // alt_jtag_atlantic jtag_uart_0_alt_jtag_atlantic // ( // .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) // ); // // defparam jtag_uart_0_alt_jtag_atlantic.INSTANCE_ID = 0, // jtag_uart_0_alt_jtag_atlantic.LOG2_RXFIFO_DEPTH = 6, // jtag_uart_0_alt_jtag_atlantic.LOG2_TXFIFO_DEPTH = 6; // // always @(posedge clk or negedge rst_n) // begin // if (rst_n == 0) // dataavailable <= 0; // else if (1) // dataavailable <= ~fifo_EF; // end // // //synthesis read_comments_as_HDL off endmodule