Files
zjui-ece385-final/qsys/synthesis/submodules/ECE385_nios2_dma.v

3645 lines
132 KiB
Verilog

//Legal Notice: (C)2019 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 / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module control_status_slave_which_resides_within_ECE385_nios2_dma (
// inputs:
atlantic_error,
chain_run,
clk,
command_fifo_empty,
csr_address,
csr_chipselect,
csr_read,
csr_write,
csr_writedata,
desc_address_fifo_empty,
descriptor_read_address,
descriptor_read_read,
descriptor_write_busy,
descriptor_write_write,
owned_by_hw,
read_go,
reset_n,
status_token_fifo_empty,
status_token_fifo_rdreq,
write_go,
// outputs:
csr_irq,
csr_readdata,
descriptor_pointer_lower_reg_out,
descriptor_pointer_upper_reg_out,
park,
pollen_clear_run,
run,
sw_reset
)
;
output csr_irq;
output [ 31: 0] csr_readdata;
output [ 31: 0] descriptor_pointer_lower_reg_out;
output [ 31: 0] descriptor_pointer_upper_reg_out;
output park;
output pollen_clear_run;
output run;
output sw_reset;
input atlantic_error;
input chain_run;
input clk;
input command_fifo_empty;
input [ 3: 0] csr_address;
input csr_chipselect;
input csr_read;
input csr_write;
input [ 31: 0] csr_writedata;
input desc_address_fifo_empty;
input [ 31: 0] descriptor_read_address;
input descriptor_read_read;
input descriptor_write_busy;
input descriptor_write_write;
input owned_by_hw;
input read_go;
input reset_n;
input status_token_fifo_empty;
input status_token_fifo_rdreq;
input write_go;
reg busy;
reg can_have_new_chain_complete;
reg chain_completed;
reg chain_completed_int;
wire chain_completed_int_rise;
wire clear_chain_completed;
wire clear_descriptor_completed;
wire clear_error;
reg clear_interrupt;
wire clear_run;
reg [ 31: 0] control_reg;
wire control_reg_en;
wire csr_control;
reg csr_irq;
reg [ 31: 0] csr_readdata;
wire csr_status;
reg delayed_chain_completed_int;
reg delayed_csr_write;
reg [ 7: 0] delayed_descriptor_counter;
reg delayed_descriptor_write_write;
reg delayed_eop_encountered;
wire [ 7: 0] delayed_max_desc_processed;
reg delayed_run;
reg descriptor_completed;
reg [ 7: 0] descriptor_counter;
wire [ 31: 0] descriptor_pointer_data;
reg [ 31: 0] descriptor_pointer_lower_reg;
wire descriptor_pointer_lower_reg_en;
wire [ 31: 0] descriptor_pointer_lower_reg_out;
reg [ 31: 0] descriptor_pointer_upper_reg;
wire descriptor_pointer_upper_reg_en;
wire [ 31: 0] descriptor_pointer_upper_reg_out;
reg descriptor_read_read_r;
wire descriptor_read_read_rising;
wire descriptor_write_write_fall;
reg do_restart;
reg do_restart_compare;
wire eop_encountered;
wire eop_encountered_rise;
reg error;
wire [ 3: 0] hw_version;
wire ie_chain_completed;
wire ie_descriptor_completed;
wire ie_eop_encountered;
wire ie_error;
wire ie_global;
wire ie_max_desc_processed;
wire [ 7: 0] max_desc_processed;
wire park;
wire poll_en;
wire pollen_clear_run;
wire run;
wire [ 31: 0] status_reg;
wire stop_dma_error;
wire sw_reset;
reg [ 15: 0] timeout_counter;
wire [ 10: 0] timeout_reg;
wire version_reg;
//csr, which is an e_avalon_slave
//Control Status Register (Readdata)
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
csr_readdata <= 0;
else if (csr_read)
case (csr_address) // synthesis parallel_case
{4'b0000}: begin
csr_readdata <= status_reg;
end // {4'b0000}
{4'b0001}: begin
csr_readdata <= version_reg;
end // {4'b0001}
{4'b0100}: begin
csr_readdata <= control_reg;
end // {4'b0100}
{4'b1000}: begin
csr_readdata <= descriptor_pointer_lower_reg;
end // {4'b1000}
{4'b1100}: begin
csr_readdata <= descriptor_pointer_upper_reg;
end // {4'b1100}
default: begin
csr_readdata <= 32'b0;
end // default
endcase // csr_address
end
//register outs
assign descriptor_pointer_upper_reg_out = descriptor_pointer_upper_reg;
assign descriptor_pointer_lower_reg_out = descriptor_pointer_lower_reg;
//control register bits
assign ie_error = control_reg[0];
assign ie_eop_encountered = control_reg[1];
assign ie_descriptor_completed = control_reg[2];
assign ie_chain_completed = control_reg[3];
assign ie_global = control_reg[4];
assign run = control_reg[5] && (!(stop_dma_error && error) && ((!chain_completed_int ) ||( do_restart && poll_en && chain_completed_int)));
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_run <= 0;
else
delayed_run <= run;
end
assign stop_dma_error = control_reg[6];
assign ie_max_desc_processed = control_reg[7];
assign max_desc_processed = control_reg[15 : 8];
assign sw_reset = control_reg[16];
assign park = control_reg[17];
assign poll_en = control_reg[18];
assign timeout_reg = control_reg[30 : 20];
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
timeout_counter <= 0;
else if ((control_reg[5] && !busy && poll_en )|| do_restart)
timeout_counter <= do_restart ? 0:(timeout_counter + 1'b1);
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
do_restart_compare <= 0;
else
do_restart_compare <= timeout_counter == {timeout_reg,5'b11111};
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
do_restart <= 0;
else
do_restart <= poll_en && do_restart_compare;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
clear_interrupt <= 0;
else
clear_interrupt <= control_reg_en ? csr_writedata[31] : 0;
end
//control register
assign control_reg_en = (csr_address == { 4'b0100}) && csr_write && csr_chipselect;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
control_reg <= 0;
else if (control_reg_en)
control_reg <= {1'b0, csr_writedata[30 : 0]};
end
//descriptor_pointer_upper_reg
assign descriptor_pointer_upper_reg_en = (csr_address == { 4'b1100}) && csr_write && csr_chipselect;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_pointer_upper_reg <= 0;
else if (descriptor_pointer_upper_reg_en)
descriptor_pointer_upper_reg <= csr_writedata;
end
//section to update the descriptor pointer
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_read_read_r <= 0;
else
descriptor_read_read_r <= descriptor_read_read;
end
assign descriptor_read_read_rising = descriptor_read_read && !descriptor_read_read_r;
assign descriptor_pointer_data = descriptor_read_read_rising ? descriptor_read_address:csr_writedata;
//descriptor_pointer_lower_reg
assign descriptor_pointer_lower_reg_en = ((csr_address == { 4'b1000}) && csr_write && csr_chipselect) || (poll_en && descriptor_read_read_rising);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_pointer_lower_reg <= 0;
else if (descriptor_pointer_lower_reg_en)
descriptor_pointer_lower_reg <= descriptor_pointer_data;
end
//Hardware Version Register
assign hw_version = 4'b0001;
assign version_reg = {24'h000000, hw_version};
//status register
assign status_reg = {27'b0, busy, chain_completed, descriptor_completed, eop_encountered, error};
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
busy <= 0;
else
busy <= ~command_fifo_empty || ~status_token_fifo_empty || ~desc_address_fifo_empty || chain_run || descriptor_write_busy || delayed_csr_write || owned_by_hw || write_go || read_go;
end
//Chain Completed Status Register
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
chain_completed <= 0;
else if ((run && ~owned_by_hw && ~busy) || clear_chain_completed || do_restart)
chain_completed <= (clear_chain_completed || do_restart)? 1'b0 : ~delayed_csr_write;
end
//chain_completed_int is the internal chain completed state for SGDMA.
//Will not be affected with clearing of chain_completed Status Register,to prevent SGDMA being restarted when the status bit is cleared
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
chain_completed_int <= 0;
else if ((run && ~owned_by_hw && ~busy) || clear_run || do_restart)
chain_completed_int <= (clear_run || do_restart) ? 1'b0 : ~delayed_csr_write;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_csr_write <= 0;
else
delayed_csr_write <= csr_write;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_completed <= 0;
else if (descriptor_write_write_fall || clear_descriptor_completed)
descriptor_completed <= ~clear_descriptor_completed;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
error <= 0;
else if (atlantic_error || clear_error)
error <= ~clear_error;
end
assign csr_status = csr_write && csr_chipselect && (csr_address == 4'b0);
assign clear_chain_completed = csr_writedata[3] && csr_status;
assign clear_descriptor_completed = csr_writedata[2] && csr_status;
assign clear_error = csr_writedata[0] && csr_status;
assign csr_control = csr_write && csr_chipselect && (csr_address == 4'h4);
assign clear_run = !csr_writedata[5] && csr_control;
assign pollen_clear_run = poll_en & clear_run;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_eop_encountered <= 0;
else
delayed_eop_encountered <= eop_encountered;
end
assign eop_encountered_rise = ~delayed_eop_encountered && eop_encountered;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_descriptor_write_write <= 0;
else
delayed_descriptor_write_write <= descriptor_write_write;
end
assign descriptor_write_write_fall = delayed_descriptor_write_write && ~descriptor_write_write;
assign eop_encountered = 1'b0;
//chain_completed rising edge detector
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_chain_completed_int <= 0;
else
delayed_chain_completed_int <= chain_completed_int;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
can_have_new_chain_complete <= 0;
else if (descriptor_write_write || (~delayed_chain_completed_int && chain_completed_int))
can_have_new_chain_complete <= descriptor_write_write;
end
assign chain_completed_int_rise = ~delayed_chain_completed_int && chain_completed_int && can_have_new_chain_complete;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_counter <= 0;
else if (status_token_fifo_rdreq)
descriptor_counter <= descriptor_counter + 1'b1;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_descriptor_counter <= 0;
else
delayed_descriptor_counter <= descriptor_counter;
end
assign delayed_max_desc_processed = max_desc_processed - 1;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
csr_irq <= 0;
else
csr_irq <= csr_irq ? ~clear_interrupt : (delayed_run && ie_global && ((ie_error && error) || (ie_eop_encountered && eop_encountered_rise) || (ie_descriptor_completed && descriptor_write_write_fall) || (ie_chain_completed && chain_completed_int_rise) || (ie_max_desc_processed && (descriptor_counter == max_desc_processed) && (delayed_descriptor_counter == delayed_max_desc_processed) )));
end
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo (
// inputs:
clk,
controlbitsfifo_data,
controlbitsfifo_rdreq,
controlbitsfifo_wrreq,
reset,
// outputs:
controlbitsfifo_empty,
controlbitsfifo_full,
controlbitsfifo_q
)
;
output controlbitsfifo_empty;
output controlbitsfifo_full;
output [ 6: 0] controlbitsfifo_q;
input clk;
input [ 6: 0] controlbitsfifo_data;
input controlbitsfifo_rdreq;
input controlbitsfifo_wrreq;
input reset;
wire controlbitsfifo_empty;
wire controlbitsfifo_full;
wire [ 6: 0] controlbitsfifo_q;
scfifo descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo
(
.aclr (reset),
.clock (clk),
.data (controlbitsfifo_data),
.empty (controlbitsfifo_empty),
.full (controlbitsfifo_full),
.q (controlbitsfifo_q),
.rdreq (controlbitsfifo_rdreq),
.wrreq (controlbitsfifo_wrreq)
);
defparam descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.add_ram_output_register = "ON",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.intended_device_family = "CYCLONEIVE",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.lpm_numwords = 2,
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.lpm_showahead = "OFF",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.lpm_type = "scfifo",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.lpm_width = 7,
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.lpm_widthu = 1,
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.overflow_checking = "ON",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.underflow_checking = "ON",
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo_controlbitsfifo.use_eab = "OFF";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module descriptor_read_which_resides_within_ECE385_nios2_dma (
// inputs:
clk,
command_fifo_full,
controlbitsfifo_rdreq,
desc_address_fifo_full,
descriptor_pointer_lower_reg_out,
descriptor_pointer_upper_reg_out,
descriptor_read_readdata,
descriptor_read_readdatavalid,
descriptor_read_waitrequest,
pollen_clear_run,
reset,
reset_n,
run,
// outputs:
atlantic_channel,
chain_run,
command_fifo_data,
command_fifo_wrreq,
control,
controlbitsfifo_q,
desc_address_fifo_data,
desc_address_fifo_wrreq,
descriptor_read_address,
descriptor_read_read,
generate_eop,
next_desc,
owned_by_hw,
read_fixed_address,
write_fixed_address
)
;
output [ 3: 0] atlantic_channel;
output chain_run;
output [103: 0] command_fifo_data;
output command_fifo_wrreq;
output [ 7: 0] control;
output [ 6: 0] controlbitsfifo_q;
output [ 31: 0] desc_address_fifo_data;
output desc_address_fifo_wrreq;
output [ 31: 0] descriptor_read_address;
output descriptor_read_read;
output generate_eop;
output [ 31: 0] next_desc;
output owned_by_hw;
output read_fixed_address;
output write_fixed_address;
input clk;
input command_fifo_full;
input controlbitsfifo_rdreq;
input desc_address_fifo_full;
input [ 31: 0] descriptor_pointer_lower_reg_out;
input [ 31: 0] descriptor_pointer_upper_reg_out;
input [ 31: 0] descriptor_read_readdata;
input descriptor_read_readdatavalid;
input descriptor_read_waitrequest;
input pollen_clear_run;
input reset;
input reset_n;
input run;
wire [ 3: 0] atlantic_channel;
wire [ 15: 0] bytes_to_transfer;
reg chain_run;
wire [103: 0] command_fifo_data;
reg command_fifo_wrreq;
wire command_fifo_wrreq_in;
wire [ 7: 0] control;
wire [ 6: 0] controlbitsfifo_data;
wire controlbitsfifo_empty;
wire controlbitsfifo_full;
wire [ 6: 0] controlbitsfifo_q;
wire controlbitsfifo_wrreq;
reg delayed_desc_reg_en;
reg delayed_run;
reg [ 31: 0] desc_address_fifo_data;
wire desc_address_fifo_wrreq;
reg [255: 0] desc_assembler;
reg desc_read_start;
reg [255: 0] desc_reg;
wire desc_reg_en;
reg [ 31: 0] descriptor_read_address;
reg descriptor_read_completed;
wire descriptor_read_completed_in;
reg descriptor_read_read;
wire fifos_not_full;
wire generate_eop;
wire got_one_descriptor;
wire [255: 0] init_descriptor;
wire [ 31: 0] next_desc;
wire owned_by_hw;
wire [255: 0] pollen_clear_run_desc;
reg [ 3: 0] posted_desc_counter;
reg posted_read_queued;
wire [ 31: 0] read_address;
wire [ 7: 0] read_burst;
wire read_fixed_address;
reg [ 3: 0] received_desc_counter;
reg run_rising_edge;
wire run_rising_edge_in;
reg started;
wire started_in;
wire [ 31: 0] write_address;
wire [ 7: 0] write_burst;
wire write_fixed_address;
//descriptor_read, which is an e_avalon_master
//Control assignments
assign command_fifo_wrreq_in = chain_run && fifos_not_full && delayed_desc_reg_en && owned_by_hw;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
command_fifo_wrreq <= 0;
else
command_fifo_wrreq <= command_fifo_wrreq_in;
end
assign desc_address_fifo_wrreq = command_fifo_wrreq;
assign fifos_not_full = ~command_fifo_full && ~desc_address_fifo_full;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_desc_reg_en <= 0;
else
delayed_desc_reg_en <= desc_reg_en;
end
assign read_address = desc_reg[31 : 0];
assign write_address = desc_reg[95 : 64];
assign next_desc = desc_reg[159 : 128];
assign bytes_to_transfer = desc_reg[207 : 192];
assign read_burst = desc_reg[215 : 208];
assign write_burst = desc_reg[223 : 216];
assign control = desc_reg[255 : 248];
assign command_fifo_data = {control, write_burst, read_burst, bytes_to_transfer, write_address, read_address};
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
desc_address_fifo_data <= 0;
else if (desc_reg_en)
desc_address_fifo_data <= next_desc;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
received_desc_counter <= 0;
else
received_desc_counter <= (received_desc_counter == 8)? 0 : (descriptor_read_readdatavalid ? (received_desc_counter + 1) : received_desc_counter);
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
posted_desc_counter <= 0;
else
posted_desc_counter <= (desc_read_start & owned_by_hw & (posted_desc_counter != 8)) ? 8 : ((|posted_desc_counter & ~descriptor_read_waitrequest & fifos_not_full) ? (posted_desc_counter - 1) : posted_desc_counter);
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
desc_read_start <= 0;
else if (~descriptor_read_waitrequest)
desc_read_start <= desc_read_start ? 0 : ((~(desc_reg_en | delayed_desc_reg_en | command_fifo_wrreq | |received_desc_counter)) ? (chain_run & fifos_not_full & ~|posted_desc_counter & ~posted_read_queued) : 0);
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
chain_run <= 0;
else
chain_run <= (run && owned_by_hw | (delayed_desc_reg_en | desc_reg_en) | |posted_desc_counter | |received_desc_counter) || run_rising_edge_in;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_read_read <= 0;
else if (~descriptor_read_waitrequest)
descriptor_read_read <= |posted_desc_counter & fifos_not_full;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_read_address <= 0;
else if (~descriptor_read_waitrequest)
descriptor_read_address <= (descriptor_read_read)? (descriptor_read_address + 4) : next_desc;
end
assign descriptor_read_completed_in = started ? (run && ~owned_by_hw && ~|posted_desc_counter) : descriptor_read_completed;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
posted_read_queued <= 0;
else
posted_read_queued <= posted_read_queued ? ~(got_one_descriptor) : (descriptor_read_read);
end
//control bits
assign generate_eop = control[0];
assign read_fixed_address = control[1];
assign write_fixed_address = control[2];
assign atlantic_channel = control[6 : 3];
assign owned_by_hw = control[7];
assign got_one_descriptor = received_desc_counter == 8;
//read descriptor
assign desc_reg_en = chain_run && got_one_descriptor;
assign init_descriptor = {1'b1, 31'b0, 32'b0, descriptor_pointer_upper_reg_out, descriptor_pointer_lower_reg_out, 128'b0};
//Clear owned_by_hw bit when run is clear in Descriptor Polling Mode
assign pollen_clear_run_desc = {1'b0, 31'b0, 32'b0, descriptor_pointer_upper_reg_out, descriptor_pointer_lower_reg_out, 128'b0};
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
desc_reg <= 0;
else if (desc_reg_en || run_rising_edge_in || pollen_clear_run)
desc_reg <= run_rising_edge_in ? init_descriptor : pollen_clear_run ? pollen_clear_run_desc: desc_assembler;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
desc_assembler <= 0;
else if (descriptor_read_readdatavalid)
desc_assembler <= desc_assembler >> 32 | {descriptor_read_readdata, 224'b0};
end
//descriptor_read_completed register
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_read_completed <= 0;
else
descriptor_read_completed <= descriptor_read_completed_in;
end
//started register
assign started_in = (run_rising_edge || run_rising_edge_in) ? 1'b1 : (descriptor_read_completed ? 1'b0 : started);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
started <= 0;
else
started <= started_in;
end
//delayed_run signal for the rising edge detector
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_run <= 0;
else
delayed_run <= run;
end
//Run rising edge detector
assign run_rising_edge_in = run & ~delayed_run;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
run_rising_edge <= 0;
else if (run_rising_edge_in || desc_reg_en)
run_rising_edge <= run_rising_edge_in;
end
//the_descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo, which is an e_instance
descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo the_descriptor_read_which_resides_within_ECE385_nios2_dma_control_bits_fifo
(
.clk (clk),
.controlbitsfifo_data (controlbitsfifo_data),
.controlbitsfifo_empty (controlbitsfifo_empty),
.controlbitsfifo_full (controlbitsfifo_full),
.controlbitsfifo_q (controlbitsfifo_q),
.controlbitsfifo_rdreq (controlbitsfifo_rdreq),
.controlbitsfifo_wrreq (controlbitsfifo_wrreq),
.reset (reset)
);
assign controlbitsfifo_data = control[6 : 0];
assign controlbitsfifo_wrreq = command_fifo_wrreq;
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module descriptor_write_which_resides_within_ECE385_nios2_dma (
// inputs:
clk,
controlbitsfifo_q,
desc_address_fifo_empty,
desc_address_fifo_q,
descriptor_write_waitrequest,
park,
reset_n,
status_token_fifo_data,
status_token_fifo_empty,
status_token_fifo_q,
// outputs:
atlantic_error,
controlbitsfifo_rdreq,
desc_address_fifo_rdreq,
descriptor_write_address,
descriptor_write_busy,
descriptor_write_write,
descriptor_write_writedata,
status_token_fifo_rdreq,
t_eop
)
;
output atlantic_error;
output controlbitsfifo_rdreq;
output desc_address_fifo_rdreq;
output [ 31: 0] descriptor_write_address;
output descriptor_write_busy;
output descriptor_write_write;
output [ 31: 0] descriptor_write_writedata;
output status_token_fifo_rdreq;
output t_eop;
input clk;
input [ 6: 0] controlbitsfifo_q;
input desc_address_fifo_empty;
input [ 31: 0] desc_address_fifo_q;
input descriptor_write_waitrequest;
input park;
input reset_n;
input [ 23: 0] status_token_fifo_data;
input status_token_fifo_empty;
input [ 23: 0] status_token_fifo_q;
wire atlantic_error;
wire can_write;
wire controlbitsfifo_rdreq;
wire desc_address_fifo_rdreq;
reg [ 31: 0] descriptor_write_address;
wire descriptor_write_busy;
reg descriptor_write_write;
reg descriptor_write_write0;
reg [ 31: 0] descriptor_write_writedata;
wire fifos_not_empty;
wire [ 7: 0] status_reg;
reg status_token_fifo_rdreq;
wire status_token_fifo_rdreq_in;
wire t_eop;
//descriptor_write, which is an e_avalon_master
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_write_writedata <= 0;
else if (~descriptor_write_waitrequest)
descriptor_write_writedata <= {park, controlbitsfifo_q, status_token_fifo_q};
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_write_address <= 0;
else if (~descriptor_write_waitrequest)
descriptor_write_address <= desc_address_fifo_q + 28;
end
assign fifos_not_empty = ~status_token_fifo_empty && ~desc_address_fifo_empty;
assign can_write = ~descriptor_write_waitrequest && fifos_not_empty;
//write register
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_write_write0 <= 0;
else if (~descriptor_write_waitrequest)
descriptor_write_write0 <= status_token_fifo_rdreq;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
descriptor_write_write <= 0;
else if (~descriptor_write_waitrequest)
descriptor_write_write <= descriptor_write_write0;
end
//status_token_fifo_rdreq register
assign status_token_fifo_rdreq_in = status_token_fifo_rdreq ? 1'b0 : can_write;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
status_token_fifo_rdreq <= 0;
else
status_token_fifo_rdreq <= status_token_fifo_rdreq_in;
end
assign desc_address_fifo_rdreq = status_token_fifo_rdreq;
assign descriptor_write_busy = descriptor_write_write0 | descriptor_write_write;
assign status_reg = status_token_fifo_data[23 : 16];
assign t_eop = status_reg[7];
assign atlantic_error = status_reg[6] | status_reg[5] | status_reg[4] | status_reg[3] | status_reg[2] | status_reg[1] | status_reg[0];
assign controlbitsfifo_rdreq = status_token_fifo_rdreq;
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_chain (
// inputs:
clk,
command_fifo_empty,
command_fifo_full,
csr_address,
csr_chipselect,
csr_read,
csr_write,
csr_writedata,
desc_address_fifo_empty,
desc_address_fifo_full,
desc_address_fifo_q,
descriptor_read_readdata,
descriptor_read_readdatavalid,
descriptor_read_waitrequest,
descriptor_write_waitrequest,
read_go,
reset,
reset_n,
status_token_fifo_data,
status_token_fifo_empty,
status_token_fifo_q,
write_go,
// outputs:
command_fifo_data,
command_fifo_wrreq,
csr_irq,
csr_readdata,
desc_address_fifo_data,
desc_address_fifo_rdreq,
desc_address_fifo_wrreq,
descriptor_read_address,
descriptor_read_read,
descriptor_write_address,
descriptor_write_write,
descriptor_write_writedata,
status_token_fifo_rdreq,
sw_reset
)
;
output [103: 0] command_fifo_data;
output command_fifo_wrreq;
output csr_irq;
output [ 31: 0] csr_readdata;
output [ 31: 0] desc_address_fifo_data;
output desc_address_fifo_rdreq;
output desc_address_fifo_wrreq;
output [ 31: 0] descriptor_read_address;
output descriptor_read_read;
output [ 31: 0] descriptor_write_address;
output descriptor_write_write;
output [ 31: 0] descriptor_write_writedata;
output status_token_fifo_rdreq;
output sw_reset;
input clk;
input command_fifo_empty;
input command_fifo_full;
input [ 3: 0] csr_address;
input csr_chipselect;
input csr_read;
input csr_write;
input [ 31: 0] csr_writedata;
input desc_address_fifo_empty;
input desc_address_fifo_full;
input [ 31: 0] desc_address_fifo_q;
input [ 31: 0] descriptor_read_readdata;
input descriptor_read_readdatavalid;
input descriptor_read_waitrequest;
input descriptor_write_waitrequest;
input read_go;
input reset;
input reset_n;
input [ 23: 0] status_token_fifo_data;
input status_token_fifo_empty;
input [ 23: 0] status_token_fifo_q;
input write_go;
wire [ 3: 0] atlantic_channel;
wire atlantic_error;
wire chain_run;
wire [103: 0] command_fifo_data;
wire command_fifo_wrreq;
wire [ 7: 0] control;
wire [ 6: 0] controlbitsfifo_q;
wire controlbitsfifo_rdreq;
wire csr_irq;
wire [ 31: 0] csr_readdata;
wire [ 31: 0] desc_address_fifo_data;
wire desc_address_fifo_rdreq;
wire desc_address_fifo_wrreq;
wire [ 31: 0] descriptor_pointer_lower_reg_out;
wire [ 31: 0] descriptor_pointer_upper_reg_out;
wire [ 31: 0] descriptor_read_address;
wire descriptor_read_read;
wire [ 31: 0] descriptor_write_address;
wire descriptor_write_busy;
wire descriptor_write_write;
wire [ 31: 0] descriptor_write_writedata;
wire generate_eop;
wire [ 31: 0] next_desc;
wire owned_by_hw;
wire park;
wire pollen_clear_run;
wire read_fixed_address;
wire run;
wire status_token_fifo_rdreq;
wire sw_reset;
wire t_eop;
wire write_fixed_address;
control_status_slave_which_resides_within_ECE385_nios2_dma the_control_status_slave_which_resides_within_ECE385_nios2_dma
(
.atlantic_error (atlantic_error),
.chain_run (chain_run),
.clk (clk),
.command_fifo_empty (command_fifo_empty),
.csr_address (csr_address),
.csr_chipselect (csr_chipselect),
.csr_irq (csr_irq),
.csr_read (csr_read),
.csr_readdata (csr_readdata),
.csr_write (csr_write),
.csr_writedata (csr_writedata),
.desc_address_fifo_empty (desc_address_fifo_empty),
.descriptor_pointer_lower_reg_out (descriptor_pointer_lower_reg_out),
.descriptor_pointer_upper_reg_out (descriptor_pointer_upper_reg_out),
.descriptor_read_address (descriptor_read_address),
.descriptor_read_read (descriptor_read_read),
.descriptor_write_busy (descriptor_write_busy),
.descriptor_write_write (descriptor_write_write),
.owned_by_hw (owned_by_hw),
.park (park),
.pollen_clear_run (pollen_clear_run),
.read_go (read_go),
.reset_n (reset_n),
.run (run),
.status_token_fifo_empty (status_token_fifo_empty),
.status_token_fifo_rdreq (status_token_fifo_rdreq),
.sw_reset (sw_reset),
.write_go (write_go)
);
descriptor_read_which_resides_within_ECE385_nios2_dma the_descriptor_read_which_resides_within_ECE385_nios2_dma
(
.atlantic_channel (atlantic_channel),
.chain_run (chain_run),
.clk (clk),
.command_fifo_data (command_fifo_data),
.command_fifo_full (command_fifo_full),
.command_fifo_wrreq (command_fifo_wrreq),
.control (control),
.controlbitsfifo_q (controlbitsfifo_q),
.controlbitsfifo_rdreq (controlbitsfifo_rdreq),
.desc_address_fifo_data (desc_address_fifo_data),
.desc_address_fifo_full (desc_address_fifo_full),
.desc_address_fifo_wrreq (desc_address_fifo_wrreq),
.descriptor_pointer_lower_reg_out (descriptor_pointer_lower_reg_out),
.descriptor_pointer_upper_reg_out (descriptor_pointer_upper_reg_out),
.descriptor_read_address (descriptor_read_address),
.descriptor_read_read (descriptor_read_read),
.descriptor_read_readdata (descriptor_read_readdata),
.descriptor_read_readdatavalid (descriptor_read_readdatavalid),
.descriptor_read_waitrequest (descriptor_read_waitrequest),
.generate_eop (generate_eop),
.next_desc (next_desc),
.owned_by_hw (owned_by_hw),
.pollen_clear_run (pollen_clear_run),
.read_fixed_address (read_fixed_address),
.reset (reset),
.reset_n (reset_n),
.run (run),
.write_fixed_address (write_fixed_address)
);
descriptor_write_which_resides_within_ECE385_nios2_dma the_descriptor_write_which_resides_within_ECE385_nios2_dma
(
.atlantic_error (atlantic_error),
.clk (clk),
.controlbitsfifo_q (controlbitsfifo_q),
.controlbitsfifo_rdreq (controlbitsfifo_rdreq),
.desc_address_fifo_empty (desc_address_fifo_empty),
.desc_address_fifo_q (desc_address_fifo_q),
.desc_address_fifo_rdreq (desc_address_fifo_rdreq),
.descriptor_write_address (descriptor_write_address),
.descriptor_write_busy (descriptor_write_busy),
.descriptor_write_waitrequest (descriptor_write_waitrequest),
.descriptor_write_write (descriptor_write_write),
.descriptor_write_writedata (descriptor_write_writedata),
.park (park),
.reset_n (reset_n),
.status_token_fifo_data (status_token_fifo_data),
.status_token_fifo_empty (status_token_fifo_empty),
.status_token_fifo_q (status_token_fifo_q),
.status_token_fifo_rdreq (status_token_fifo_rdreq),
.t_eop (t_eop)
);
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_command_grabber (
// inputs:
clk,
command_fifo_empty,
command_fifo_q,
m_read_waitrequest,
m_write_waitrequest,
read_go,
reset_n,
write_go,
// outputs:
command_fifo_rdreq,
read_command_data,
read_command_valid,
write_command_data,
write_command_valid
)
;
output command_fifo_rdreq;
output [ 58: 0] read_command_data;
output read_command_valid;
output [ 56: 0] write_command_data;
output write_command_valid;
input clk;
input command_fifo_empty;
input [103: 0] command_fifo_q;
input m_read_waitrequest;
input m_write_waitrequest;
input read_go;
input reset_n;
input write_go;
wire [ 3: 0] atlantic_channel;
wire [ 15: 0] bytes_to_transfer;
wire command_fifo_rdreq;
wire command_fifo_rdreq_in;
reg command_fifo_rdreq_reg;
reg command_valid;
wire [ 7: 0] control;
reg delay1_command_valid;
wire generate_eop;
wire [ 31: 0] read_address;
wire [ 7: 0] read_burst;
reg [ 58: 0] read_command_data;
wire read_command_valid;
wire read_fixed_address;
wire [ 31: 0] write_address;
wire [ 7: 0] write_burst;
reg [ 56: 0] write_command_data;
wire write_command_valid;
wire write_fixed_address;
//Descriptor components
assign read_address = command_fifo_q[31 : 0];
assign write_address = command_fifo_q[63 : 32];
assign bytes_to_transfer = command_fifo_q[79 : 64];
assign read_burst = command_fifo_q[87 : 80];
assign write_burst = command_fifo_q[95 : 88];
assign control = command_fifo_q[103 : 96];
//control bits
assign generate_eop = control[0];
assign read_fixed_address = control[1];
assign write_fixed_address = control[2];
assign atlantic_channel = control[6 : 3];
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
read_command_data <= 0;
else
read_command_data <= {write_fixed_address, generate_eop, ~read_fixed_address, read_burst, bytes_to_transfer, read_address};
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
write_command_data <= 0;
else
write_command_data <= {~write_fixed_address, write_burst, bytes_to_transfer, write_address};
end
assign read_command_valid = command_valid;
assign write_command_valid = command_valid;
//command_fifo_rdreq register
assign command_fifo_rdreq_in = (command_fifo_rdreq_reg || command_valid) ? 1'b0 : (~read_go && ~write_go && ~m_read_waitrequest && ~m_write_waitrequest);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
command_fifo_rdreq_reg <= 0;
else if (~command_fifo_empty)
command_fifo_rdreq_reg <= command_fifo_rdreq_in;
end
assign command_fifo_rdreq = command_fifo_rdreq_reg;
//command_valid register
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delay1_command_valid <= 0;
else
delay1_command_valid <= command_fifo_rdreq_reg;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
command_valid <= 0;
else
command_valid <= delay1_command_valid;
end
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_m_read (
// inputs:
clk,
m_read_readdata,
m_read_readdatavalid,
m_read_waitrequest,
read_command_data,
read_command_valid,
reset_n,
source_stream_ready,
// outputs:
m_read_address,
m_read_read,
read_go,
source_stream_data,
source_stream_empty,
source_stream_endofpacket,
source_stream_startofpacket,
source_stream_valid,
tx_shift
)
;
output [ 31: 0] m_read_address;
output m_read_read;
output read_go;
output [ 31: 0] source_stream_data;
output [ 1: 0] source_stream_empty;
output source_stream_endofpacket;
output source_stream_startofpacket;
output source_stream_valid;
output [ 1: 0] tx_shift;
input clk;
input [ 31: 0] m_read_readdata;
input m_read_readdatavalid;
input m_read_waitrequest;
input [ 58: 0] read_command_data;
input read_command_valid;
input reset_n;
input source_stream_ready;
wire [ 2: 0] additional_transaction;
wire [ 3: 0] burst_size;
wire [ 5: 0] burst_size_right_shifted;
wire burst_value;
wire [ 15: 0] bytes_to_transfer;
wire [ 2: 0] empty_operand;
reg [ 2: 0] empty_value;
wire endofpacket;
wire generate_eop;
wire generate_sop;
wire has_transactions_to_post;
wire increment_address;
reg [ 31: 0] m_read_address;
wire [ 31: 0] m_read_address_inc;
reg m_read_read;
reg [ 6: 0] m_read_state;
wire maximum_transactions_in_queue;
reg [ 58: 0] read_command_data_reg;
wire read_go;
wire read_posted;
reg [ 15: 0] received_data_counter;
wire received_enough_data;
reg [ 15: 0] remaining_transactions;
wire single_transfer;
wire [ 31: 0] source_stream_data;
wire [ 1: 0] source_stream_empty;
wire source_stream_endofpacket;
reg source_stream_startofpacket;
wire source_stream_valid;
wire [ 31: 0] start_address;
wire still_got_full_burst;
reg [ 6: 0] transactions_in_queue;
reg [ 15: 0] transactions_left_to_post;
reg [ 1: 0] tx_shift;
//m_read, which is an e_avalon_master
//read_command_data_reg
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
read_command_data_reg <= 0;
else if (read_command_valid)
read_command_data_reg <= read_command_data;
end
//command input
assign start_address = read_command_data_reg[31 : 0];
assign bytes_to_transfer = read_command_data_reg[47 : 32];
assign increment_address = read_command_data_reg[56];
assign generate_eop = read_command_data_reg[57];
assign generate_sop = read_command_data_reg[58];
assign burst_size = 1;
assign burst_size_right_shifted = {burst_size, 2'b0};
//Request Path
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
transactions_left_to_post <= 0;
else if (m_read_state == 7'b0000100)
transactions_left_to_post <= (bytes_to_transfer >> 2) + additional_transaction[2] + |additional_transaction[1 : 0];
else if (~m_read_waitrequest)
begin
if (m_read_state == 7'b0001000 )
transactions_left_to_post <= transactions_left_to_post - burst_value;
end
else if (m_read_state == 7'b1000000)
transactions_left_to_post <= 0;
end
assign still_got_full_burst = transactions_left_to_post >= burst_size;
assign burst_value = still_got_full_burst ? burst_size : transactions_left_to_post;
assign has_transactions_to_post = |transactions_left_to_post;
assign read_posted = m_read_read & ~m_read_waitrequest;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
transactions_in_queue <= 0;
else
transactions_in_queue <= (read_posted & ~m_read_readdatavalid) ? (transactions_in_queue + 1) : ((~read_posted & m_read_readdatavalid) ? (transactions_in_queue - 1) : transactions_in_queue);
end
assign maximum_transactions_in_queue = transactions_in_queue >= (31 - 1);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_read_read <= 0;
else if (~m_read_waitrequest)
m_read_read <= read_go & (m_read_state == 7'b0001000) & has_transactions_to_post;
end
assign m_read_address_inc = increment_address ? (m_read_address + burst_size_right_shifted) : m_read_address;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_read_address <= 0;
else if (m_read_state == 7'b0000100)
m_read_address <= {start_address[31 : 2], 2'b0};
else if (~m_read_waitrequest)
if (read_go & m_read_read)
m_read_address <= m_read_address_inc;
end
assign additional_transaction = bytes_to_transfer[1 : 0] + tx_shift;
//Response Path
assign single_transfer = source_stream_startofpacket & source_stream_endofpacket;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
received_data_counter <= 0;
else if (m_read_readdatavalid)
begin
if (single_transfer)
received_data_counter <= received_data_counter + 4 - tx_shift - source_stream_empty;
else if (endofpacket)
received_data_counter <= received_data_counter + (4 - source_stream_empty);
else if (~|received_data_counter)
received_data_counter <= received_data_counter + 4 - tx_shift;
else
received_data_counter <= received_data_counter + 4;
end
else if (m_read_state == 7'b0000010)
received_data_counter <= 0;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
remaining_transactions <= 0;
else if (m_read_state == 7'b0000100)
remaining_transactions <= (bytes_to_transfer >> 2) + additional_transaction[2] + |additional_transaction[1 : 0];
else if (read_go & m_read_readdatavalid)
remaining_transactions <= remaining_transactions -1;
end
assign endofpacket = remaining_transactions == 1;
//FSM
assign received_enough_data = received_data_counter >= bytes_to_transfer;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_read_state <= 7'b0000001;
else if (1)
case (m_read_state) // synthesis parallel_case
7'b0000001: begin
if (read_command_valid)
m_read_state <= 7'b0000010;
end // 7'b0000001
7'b0000010: begin
m_read_state <= 7'b0000100;
end // 7'b0000010
7'b0000100: begin
if (~source_stream_ready)
m_read_state <= 7'b0010000;
else
m_read_state <= 7'b0001000;
end // 7'b0000100
7'b0001000: begin
if (~source_stream_ready | maximum_transactions_in_queue)
m_read_state <= 7'b0010000;
else if (~has_transactions_to_post)
m_read_state <= 7'b0100000;
else if (received_enough_data)
m_read_state <= 7'b1000000;
end // 7'b0001000
7'b0010000: begin
if (received_enough_data)
m_read_state <= 7'b1000000;
else if (~has_transactions_to_post)
m_read_state <= 7'b0100000;
else if (source_stream_ready & ~m_read_waitrequest & ~maximum_transactions_in_queue)
m_read_state <= 7'b0001000;
end // 7'b0010000
7'b0100000: begin
if (received_enough_data)
m_read_state <= 7'b1000000;
end // 7'b0100000
7'b1000000: begin
m_read_state <= 7'b0000001;
end // 7'b1000000
default: begin
m_read_state <= 7'b0000001;
end // default
endcase // m_read_state
end
assign read_go = |(m_read_state & (7'b0001000 | 7'b0010000 | 7'b0100000 | 7'b1000000));
//Output on the Av-ST Source
assign source_stream_data = m_read_readdata;
assign source_stream_valid = read_go & m_read_readdatavalid;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
source_stream_startofpacket <= 0;
else if (~source_stream_startofpacket)
source_stream_startofpacket <= m_read_state == 7'b0000100;
else if (source_stream_valid)
source_stream_startofpacket <= ~source_stream_ready;
end
assign source_stream_endofpacket = read_go & endofpacket & m_read_readdatavalid;
assign source_stream_empty = (endofpacket && source_stream_valid) ? empty_value : 0;
assign empty_operand = 3'b100;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
empty_value <= 0;
else
empty_value <= empty_operand - bytes_to_transfer[1 : 0] - tx_shift;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
tx_shift <= 0;
else if (m_read_state == 7'b0000010)
tx_shift <= start_address[1 : 0];
end
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_m_readfifo_m_readfifo (
// inputs:
clk,
m_readfifo_data,
m_readfifo_rdreq,
m_readfifo_wrreq,
reset,
// outputs:
m_readfifo_empty,
m_readfifo_full,
m_readfifo_q,
m_readfifo_usedw
)
;
output m_readfifo_empty;
output m_readfifo_full;
output [ 37: 0] m_readfifo_q;
output [ 5: 0] m_readfifo_usedw;
input clk;
input [ 37: 0] m_readfifo_data;
input m_readfifo_rdreq;
input m_readfifo_wrreq;
input reset;
wire m_readfifo_empty;
wire m_readfifo_full;
wire [ 37: 0] m_readfifo_q;
wire [ 5: 0] m_readfifo_usedw;
scfifo ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo
(
.aclr (reset),
.clock (clk),
.data (m_readfifo_data),
.empty (m_readfifo_empty),
.full (m_readfifo_full),
.q (m_readfifo_q),
.rdreq (m_readfifo_rdreq),
.usedw (m_readfifo_usedw),
.wrreq (m_readfifo_wrreq)
);
defparam ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.add_ram_output_register = "ON",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.intended_device_family = "CYCLONEIVE",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.lpm_numwords = 64,
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.lpm_showahead = "OFF",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.lpm_type = "scfifo",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.lpm_width = 38,
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.lpm_widthu = 6,
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.overflow_checking = "ON",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.underflow_checking = "ON",
ECE385_nios2_dma_m_readfifo_m_readfifo_m_readfifo.use_eab = "ON";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_m_readfifo (
// inputs:
clk,
reset,
reset_n,
sink_stream_data,
sink_stream_empty,
sink_stream_endofpacket,
sink_stream_startofpacket,
sink_stream_valid,
source_stream_ready,
tx_shift_in,
// outputs:
sink_stream_ready,
source_stream_data,
source_stream_empty,
source_stream_endofpacket,
source_stream_startofpacket,
source_stream_valid,
tx_shift_out
)
;
output sink_stream_ready;
output [ 31: 0] source_stream_data;
output [ 1: 0] source_stream_empty;
output source_stream_endofpacket;
output source_stream_startofpacket;
output source_stream_valid;
output [ 1: 0] tx_shift_out;
input clk;
input reset;
input reset_n;
input [ 31: 0] sink_stream_data;
input [ 1: 0] sink_stream_empty;
input sink_stream_endofpacket;
input sink_stream_startofpacket;
input sink_stream_valid;
input source_stream_ready;
input [ 1: 0] tx_shift_in;
reg delayed_m_readfifo_empty;
wire hold_condition;
reg [ 37: 0] m_readfifo_data;
wire m_readfifo_empty;
wire m_readfifo_empty_fall;
wire m_readfifo_full;
wire [ 37: 0] m_readfifo_q;
wire m_readfifo_rdreq;
reg m_readfifo_rdreq_delay;
wire [ 5: 0] m_readfifo_usedw;
reg m_readfifo_wrreq;
wire sink_stream_ready;
wire [ 31: 0] source_stream_data;
wire [ 1: 0] source_stream_empty;
reg [ 1: 0] source_stream_empty_hold;
wire [ 1: 0] source_stream_empty_sig;
wire source_stream_endofpacket;
wire source_stream_endofpacket_from_fifo;
reg source_stream_endofpacket_hold;
wire source_stream_endofpacket_sig;
wire source_stream_startofpacket;
wire source_stream_valid;
reg source_stream_valid_reg;
reg transmitted_eop;
wire [ 1: 0] tx_shift_out;
//the_ECE385_nios2_dma_m_readfifo_m_readfifo, which is an e_instance
ECE385_nios2_dma_m_readfifo_m_readfifo the_ECE385_nios2_dma_m_readfifo_m_readfifo
(
.clk (clk),
.m_readfifo_data (m_readfifo_data),
.m_readfifo_empty (m_readfifo_empty),
.m_readfifo_full (m_readfifo_full),
.m_readfifo_q (m_readfifo_q),
.m_readfifo_rdreq (m_readfifo_rdreq),
.m_readfifo_usedw (m_readfifo_usedw),
.m_readfifo_wrreq (m_readfifo_wrreq),
.reset (reset)
);
assign sink_stream_ready = ~m_readfifo_usedw[5] && ~m_readfifo_full;
assign m_readfifo_rdreq = ~m_readfifo_empty & source_stream_ready | m_readfifo_empty_fall & ~hold_condition;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_m_readfifo_empty <= 0;
else
delayed_m_readfifo_empty <= m_readfifo_empty;
end
assign m_readfifo_empty_fall = ~m_readfifo_empty & delayed_m_readfifo_empty;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
source_stream_valid_reg <= 0;
else if (source_stream_ready | m_readfifo_rdreq)
source_stream_valid_reg <= m_readfifo_rdreq;
end
assign source_stream_valid = source_stream_valid_reg;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_readfifo_wrreq <= 0;
else
m_readfifo_wrreq <= sink_stream_valid;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_readfifo_rdreq_delay <= 0;
else
m_readfifo_rdreq_delay <= m_readfifo_rdreq;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
transmitted_eop <= 0;
else
transmitted_eop <= transmitted_eop ? ~m_readfifo_rdreq : source_stream_endofpacket & source_stream_ready & source_stream_valid;
end
assign source_stream_endofpacket_sig = m_readfifo_rdreq_delay? source_stream_endofpacket_from_fifo | source_stream_endofpacket_hold : (source_stream_endofpacket_from_fifo & ~transmitted_eop) | source_stream_endofpacket_hold;
assign source_stream_endofpacket = source_stream_endofpacket_sig;
assign hold_condition = source_stream_valid & ~source_stream_ready;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
source_stream_endofpacket_hold <= 0;
else
source_stream_endofpacket_hold <= hold_condition ? source_stream_endofpacket_sig : (source_stream_ready ? 0 : source_stream_endofpacket_hold);
end
assign source_stream_empty_sig = m_readfifo_q[33 : 32];
assign source_stream_empty = source_stream_empty_sig | source_stream_empty_hold;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
source_stream_empty_hold <= 0;
else
source_stream_empty_hold <= hold_condition ? source_stream_empty_sig : (source_stream_ready ? 0 : source_stream_empty_hold);
end
assign tx_shift_out = m_readfifo_q[37 : 36];
assign source_stream_data = m_readfifo_q[31 : 0];
assign source_stream_endofpacket_from_fifo = m_readfifo_q[34];
assign source_stream_startofpacket = m_readfifo_q[35];
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_readfifo_data <= 0;
else
m_readfifo_data <= {tx_shift_in, sink_stream_startofpacket, sink_stream_endofpacket, sink_stream_empty, sink_stream_data};
end
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module sixteen_bit_byteenable_FSM_which_resides_within_ECE385_nios2_dma (
// inputs:
byteenable_in,
clk,
reset_n,
waitrequest_in,
write_in,
// outputs:
byteenable_out,
waitrequest_out
)
;
output [ 1: 0] byteenable_out;
output waitrequest_out;
input [ 1: 0] byteenable_in;
input clk;
input reset_n;
input waitrequest_in;
input write_in;
wire [ 1: 0] byteenable_out;
wire waitrequest_out;
assign byteenable_out = byteenable_in & {2{write_in}};
assign waitrequest_out = waitrequest_in | ((write_in == 1) & (waitrequest_in == 1));
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module thirty_two_bit_byteenable_FSM_which_resides_within_ECE385_nios2_dma (
// inputs:
byteenable_in,
clk,
reset_n,
waitrequest_in,
write_in,
// outputs:
byteenable_out,
waitrequest_out
)
;
output [ 3: 0] byteenable_out;
output waitrequest_out;
input [ 3: 0] byteenable_in;
input clk;
input reset_n;
input waitrequest_in;
input write_in;
wire advance_to_next_state;
wire [ 3: 0] byteenable_out;
wire full_lower_half_transfer;
wire full_upper_half_transfer;
wire full_word_transfer;
wire lower_enable;
wire lower_stall;
wire partial_lower_half_transfer;
wire partial_upper_half_transfer;
reg state_bit;
wire transfer_done;
wire two_stage_transfer;
wire upper_enable;
wire upper_stall;
wire waitrequest_out;
assign partial_lower_half_transfer = byteenable_in[1 : 0] != 0;
assign full_lower_half_transfer = byteenable_in[1 : 0] == {2 {1'b1}};
assign partial_upper_half_transfer = byteenable_in[3 : 2] != 0;
assign full_upper_half_transfer = byteenable_in[3 : 2] == {2 {1'b1}};
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
state_bit <= 0;
else if (transfer_done == 1)
state_bit <= 0;
else if (advance_to_next_state == 1)
state_bit <= 1;
end
assign full_word_transfer = (full_lower_half_transfer == 1) & (full_upper_half_transfer == 1);
assign two_stage_transfer = (full_word_transfer == 0) & (partial_lower_half_transfer == 1) & (partial_upper_half_transfer == 1);
assign advance_to_next_state = (two_stage_transfer == 1) & (lower_stall == 0) & (write_in == 1) & (state_bit == 0) & (waitrequest_in == 0);
assign transfer_done = ((full_word_transfer == 1) & (waitrequest_in == 0) & (write_in == 1)) |
((two_stage_transfer == 0) & (lower_stall == 0) & (upper_stall == 0) & (write_in == 1) & (waitrequest_in == 0)) |
((two_stage_transfer == 1) & (state_bit == 1) & (upper_stall == 0) & (write_in == 1) & (waitrequest_in == 0));
assign lower_enable = ((write_in == 1) & (full_word_transfer == 1)) |
((write_in == 1) & (two_stage_transfer == 0) & (partial_lower_half_transfer == 1)) |
((write_in == 1) & (two_stage_transfer == 1) & (partial_lower_half_transfer == 1) & (state_bit == 0));
assign upper_enable = ((write_in == 1) & (full_word_transfer == 1)) |
((write_in == 1) & (two_stage_transfer == 0) & (partial_upper_half_transfer == 1)) |
((write_in == 1) & (two_stage_transfer == 1) & (partial_upper_half_transfer == 1) & (state_bit == 1));
//lower_sixteen_bit_byteenable_FSM, which is an e_instance
sixteen_bit_byteenable_FSM_which_resides_within_ECE385_nios2_dma lower_sixteen_bit_byteenable_FSM
(
.byteenable_in (byteenable_in[1 : 0]),
.byteenable_out (byteenable_out[1 : 0]),
.clk (clk),
.reset_n (reset_n),
.waitrequest_in (waitrequest_in),
.waitrequest_out (lower_stall),
.write_in (lower_enable)
);
//upper_sixteen_bit_byteenable_FSM, which is an e_instance
sixteen_bit_byteenable_FSM_which_resides_within_ECE385_nios2_dma upper_sixteen_bit_byteenable_FSM
(
.byteenable_in (byteenable_in[3 : 2]),
.byteenable_out (byteenable_out[3 : 2]),
.clk (clk),
.reset_n (reset_n),
.waitrequest_in (waitrequest_in),
.waitrequest_out (upper_stall),
.write_in (upper_enable)
);
assign waitrequest_out = waitrequest_in | ((transfer_done == 0) & (write_in == 1));
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module byteenable_gen_which_resides_within_ECE385_nios2_dma (
// inputs:
byteenable_in,
clk,
reset_n,
waitrequest_in,
write_in,
// outputs:
byteenable_out,
waitrequest_out
)
;
output [ 3: 0] byteenable_out;
output waitrequest_out;
input [ 3: 0] byteenable_in;
input clk;
input reset_n;
input waitrequest_in;
input write_in;
wire [ 3: 0] byteenable_out;
wire waitrequest_out;
//the_thirty_two_bit_byteenable_FSM, which is an e_instance
thirty_two_bit_byteenable_FSM_which_resides_within_ECE385_nios2_dma the_thirty_two_bit_byteenable_FSM
(
.byteenable_in (byteenable_in),
.byteenable_out (byteenable_out),
.clk (clk),
.reset_n (reset_n),
.waitrequest_in (waitrequest_in),
.waitrequest_out (waitrequest_out),
.write_in (write_in)
);
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_m_write (
// inputs:
clk,
e_00,
e_01,
e_02,
e_03,
e_04,
e_05,
e_06,
m_write_waitrequest,
reset_n,
sink_stream_data,
sink_stream_empty,
sink_stream_endofpacket,
sink_stream_startofpacket,
sink_stream_valid,
status_token_fifo_full,
write_command_data,
write_command_valid,
// outputs:
m_write_address,
m_write_byteenable,
m_write_write,
m_write_writedata,
rx_shift,
sink_stream_ready,
status_token_fifo_data,
status_token_fifo_wrreq,
write_go
)
;
output [ 31: 0] m_write_address;
output [ 3: 0] m_write_byteenable;
output m_write_write;
output [ 31: 0] m_write_writedata;
output [ 1: 0] rx_shift;
output sink_stream_ready;
output [ 23: 0] status_token_fifo_data;
output status_token_fifo_wrreq;
output write_go;
input clk;
input e_00;
input e_01;
input e_02;
input e_03;
input e_04;
input e_05;
input e_06;
input m_write_waitrequest;
input reset_n;
input [ 31: 0] sink_stream_data;
input [ 1: 0] sink_stream_empty;
input sink_stream_endofpacket;
input sink_stream_startofpacket;
input sink_stream_valid;
input status_token_fifo_full;
input [ 56: 0] write_command_data;
input write_command_valid;
wire [ 15: 0] actual_bytes_transferred;
wire [ 31: 0] aligned_start_address;
wire [ 3: 0] all_one;
wire [ 3: 0] burst_size;
reg byteenable_enable;
wire [ 3: 0] byteenable_eop;
wire [ 3: 0] byteenable_single_transfer;
wire [ 3: 0] byteenable_sop;
wire [ 15: 0] bytes_to_transfer;
reg [ 15: 0] counter;
wire [ 15: 0] counter_in;
reg delayed_write_command_valid;
reg delayed_write_go;
reg eop_reg;
wire eop_wrbe;
wire increment;
wire increment_address;
reg [ 31: 0] m_write_address;
wire [ 3: 0] m_write_byteenable;
wire [ 3: 0] m_write_byteenable_in;
reg [ 3: 0] m_write_byteenable_reg;
wire m_write_waitrequest_out;
reg m_write_write;
reg m_write_write_sig;
wire [ 31: 0] m_write_writedata;
reg [ 31: 0] m_write_writedata_reg;
wire m_writefifo_fill;
reg [ 1: 0] rx_shift;
wire [ 3: 0] rx_shift0;
wire [ 3: 0] rx_shift1;
wire [ 3: 0] rx_shift2;
wire [ 3: 0] rx_shift3;
wire [ 3: 0] shift0;
wire [ 3: 0] shift1;
wire [ 3: 0] shift2;
wire [ 3: 0] shift3;
wire single_transfer;
wire [ 3: 0] sink_stream_empty_shift;
wire sink_stream_ready;
wire sink_stream_really_valid;
wire [ 3: 0] sop_rx_shift;
wire sop_wrbe;
wire [ 31: 0] start_address;
reg [ 7: 0] status_reg;
wire [ 7: 0] status_reg_in;
wire [ 23: 0] status_token_fifo_data;
wire status_token_fifo_wrreq;
wire [ 7: 0] status_word;
wire t_eop;
reg [ 56: 0] write_command_data_reg;
wire write_go;
reg write_go_fall_reg;
wire write_go_fall_reg_in;
reg write_go_reg;
wire write_go_reg_in;
wire write_go_reg_in_teop;
//m_write, which is an e_avalon_master
assign burst_size = 1;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_write_write <= 0;
else if (~m_write_waitrequest_out)
m_write_write <= write_go_reg & (sink_stream_really_valid | m_write_write_sig);
end
assign m_writefifo_fill = 1;
//command input
assign start_address = write_command_data_reg[31 : 0];
assign bytes_to_transfer = write_command_data_reg[47 : 32];
assign increment_address = write_command_data_reg[56];
//increment or keep constant, the m_write_address depending on the command bit
assign m_write_writedata = m_write_writedata_reg;
assign increment = write_go_reg & sink_stream_really_valid;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_write_writedata_reg <= 0;
else if (~m_write_waitrequest_out)
m_write_writedata_reg <= sink_stream_data;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_write_write_sig <= 0;
else if (m_write_waitrequest_out)
m_write_write_sig <= sink_stream_really_valid & ~m_write_write;
end
//Generate an aligned m_write_address for unaligned transfer.
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_write_address <= 0;
else if (~m_write_waitrequest_out)
m_write_address <= delayed_write_command_valid ? aligned_start_address : (increment_address ? (m_write_write ? (m_write_address + 4) : m_write_address) : aligned_start_address);
end
assign aligned_start_address = {start_address[31 : 2], 2'b0};
assign shift3 = {3'b0, all_one[0]};
assign rx_shift3 = {all_one[0], 3'b0};
assign shift2 = {2'b0, all_one[1 : 0]};
assign rx_shift2 = {all_one[1 : 0], 2'b0};
assign shift1 = {1'b0, all_one[2 : 0]};
assign rx_shift1 = {all_one[2 : 0], 1'b0};
assign shift0 = all_one;
assign rx_shift0 = all_one;
assign sink_stream_empty_shift = ((sink_stream_empty == 3) ? shift3 : 0) | ((sink_stream_empty == 2) ? shift2 : 0) | ((sink_stream_empty == 1) ? shift1 : 0) | ((sink_stream_empty == 0) ? shift0 : 0);
assign sop_rx_shift = ((rx_shift == 3) ? rx_shift3: 0) | ((rx_shift == 2) ? rx_shift2: 0) | ((rx_shift == 1) ? rx_shift1: 0) | ((rx_shift == 0) ? rx_shift0: 0);
assign byteenable_single_transfer = sop_rx_shift & sink_stream_empty_shift;
assign byteenable_sop = sop_rx_shift;
assign byteenable_eop = sink_stream_empty_shift;
assign sop_wrbe = sink_stream_startofpacket & ~sink_stream_endofpacket;
assign eop_wrbe = ~sink_stream_startofpacket & sink_stream_endofpacket;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
m_write_byteenable_reg <= 0;
else if (~m_write_waitrequest_out)
m_write_byteenable_reg <= ({4 {single_transfer}} & byteenable_single_transfer) | ({4 {sop_wrbe}} & byteenable_sop) | ({4 {eop_wrbe}} & byteenable_eop);
end
assign all_one = 4'b1111;
assign m_write_byteenable_in = byteenable_enable ? m_write_byteenable_reg : all_one;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
byteenable_enable <= 0;
else if (~m_write_waitrequest_out)
byteenable_enable <= sink_stream_startofpacket | sink_stream_endofpacket;
end
assign sink_stream_ready = write_go_reg & ~m_write_waitrequest_out & ~eop_reg & (|bytes_to_transfer ? ~(counter >= bytes_to_transfer) : 1);
//sink_stream_ready_sig
//sink_stream_valid is only really valid when we're ready
assign sink_stream_really_valid = sink_stream_valid && sink_stream_ready;
//write_command_data_reg
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
write_command_data_reg <= 0;
else if (write_command_valid)
write_command_data_reg <= write_command_data;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_write_command_valid <= 0;
else
delayed_write_command_valid <= write_command_valid;
end
//8-bits up-counter
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
counter <= 0;
else if (~m_write_waitrequest_out)
counter <= counter_in;
end
//write_go bit for all of this operation until count is up
assign write_go_reg_in = (delayed_write_command_valid) ? 1'b1 : (counter >= bytes_to_transfer) ? 1'b0 : write_go_reg;
assign write_go_reg_in_teop = eop_reg ? ~(m_write_write & ~m_write_waitrequest_out) : 1'b1;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
eop_reg <= 0;
else
eop_reg <= eop_reg ? ~(m_write_write & ~m_write_waitrequest_out) : sink_stream_endofpacket & sink_stream_really_valid;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
write_go_reg <= 0;
else if (~m_write_waitrequest_out)
write_go_reg <= (write_go_reg && (bytes_to_transfer == 0)) ? write_go_reg_in_teop : write_go_reg_in;
end
assign write_go = write_go_reg;
assign t_eop = (sink_stream_endofpacket && sink_stream_really_valid) && (bytes_to_transfer == 0);
assign single_transfer = sink_stream_startofpacket & sink_stream_endofpacket;
assign counter_in = (delayed_write_command_valid) ? 16'b0 : (increment ? (single_transfer ? (counter + 4 - rx_shift - sink_stream_empty) : (sink_stream_startofpacket ? (counter + 4 - rx_shift) : (sink_stream_endofpacket ? (counter + 4 - sink_stream_empty) : (counter + 4)))) : counter);
//status register
assign status_reg_in = write_go_fall_reg ? 0 : (status_word | status_reg);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
status_reg <= 0;
else
status_reg <= status_reg_in;
end
//actual_bytes_transferred register
assign actual_bytes_transferred = counter;
//status_token consists of the status signals and actual_bytes_transferred
assign status_token_fifo_data = {status_reg, actual_bytes_transferred};
assign status_word = {t_eop, 7'b0};
//delayed write go register
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
delayed_write_go <= 0;
else
delayed_write_go <= write_go_reg;
end
//write_go falling edge detector
assign write_go_fall_reg_in = delayed_write_go && ~write_go_reg;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
write_go_fall_reg <= 0;
else
write_go_fall_reg <= write_go_fall_reg_in;
end
assign status_token_fifo_wrreq = write_go_fall_reg && ~status_token_fifo_full;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
rx_shift <= 0;
else if (delayed_write_command_valid)
rx_shift <= start_address[1 : 0];
end
byteenable_gen_which_resides_within_ECE385_nios2_dma the_byteenable_gen_which_resides_within_ECE385_nios2_dma
(
.byteenable_in (m_write_byteenable_in),
.byteenable_out (m_write_byteenable),
.clk (clk),
.reset_n (reset_n),
.waitrequest_in (m_write_waitrequest),
.waitrequest_out (m_write_waitrequest_out),
.write_in (m_write_write)
);
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_command_fifo (
// inputs:
clk,
command_fifo_data,
command_fifo_rdreq,
command_fifo_wrreq,
reset,
// outputs:
command_fifo_empty,
command_fifo_full,
command_fifo_q
)
;
output command_fifo_empty;
output command_fifo_full;
output [103: 0] command_fifo_q;
input clk;
input [103: 0] command_fifo_data;
input command_fifo_rdreq;
input command_fifo_wrreq;
input reset;
wire command_fifo_empty;
wire command_fifo_full;
wire [103: 0] command_fifo_q;
scfifo ECE385_nios2_dma_command_fifo_command_fifo
(
.aclr (reset),
.clock (clk),
.data (command_fifo_data),
.empty (command_fifo_empty),
.full (command_fifo_full),
.q (command_fifo_q),
.rdreq (command_fifo_rdreq),
.wrreq (command_fifo_wrreq)
);
defparam ECE385_nios2_dma_command_fifo_command_fifo.add_ram_output_register = "ON",
ECE385_nios2_dma_command_fifo_command_fifo.intended_device_family = "CYCLONEIVE",
ECE385_nios2_dma_command_fifo_command_fifo.lpm_numwords = 2,
ECE385_nios2_dma_command_fifo_command_fifo.lpm_showahead = "OFF",
ECE385_nios2_dma_command_fifo_command_fifo.lpm_type = "scfifo",
ECE385_nios2_dma_command_fifo_command_fifo.lpm_width = 104,
ECE385_nios2_dma_command_fifo_command_fifo.lpm_widthu = 1,
ECE385_nios2_dma_command_fifo_command_fifo.overflow_checking = "ON",
ECE385_nios2_dma_command_fifo_command_fifo.underflow_checking = "ON",
ECE385_nios2_dma_command_fifo_command_fifo.use_eab = "ON";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_desc_address_fifo (
// inputs:
clk,
desc_address_fifo_data,
desc_address_fifo_rdreq,
desc_address_fifo_wrreq,
reset,
// outputs:
desc_address_fifo_empty,
desc_address_fifo_full,
desc_address_fifo_q
)
;
output desc_address_fifo_empty;
output desc_address_fifo_full;
output [ 31: 0] desc_address_fifo_q;
input clk;
input [ 31: 0] desc_address_fifo_data;
input desc_address_fifo_rdreq;
input desc_address_fifo_wrreq;
input reset;
wire desc_address_fifo_empty;
wire desc_address_fifo_full;
wire [ 31: 0] desc_address_fifo_q;
scfifo ECE385_nios2_dma_desc_address_fifo_desc_address_fifo
(
.aclr (reset),
.clock (clk),
.data (desc_address_fifo_data),
.empty (desc_address_fifo_empty),
.full (desc_address_fifo_full),
.q (desc_address_fifo_q),
.rdreq (desc_address_fifo_rdreq),
.wrreq (desc_address_fifo_wrreq)
);
defparam ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.add_ram_output_register = "ON",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.intended_device_family = "CYCLONEIVE",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.lpm_numwords = 2,
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.lpm_showahead = "OFF",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.lpm_type = "scfifo",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.lpm_width = 32,
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.lpm_widthu = 1,
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.overflow_checking = "ON",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.underflow_checking = "ON",
ECE385_nios2_dma_desc_address_fifo_desc_address_fifo.use_eab = "OFF";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_status_token_fifo (
// inputs:
clk,
reset,
status_token_fifo_data,
status_token_fifo_rdreq,
status_token_fifo_wrreq,
// outputs:
status_token_fifo_empty,
status_token_fifo_full,
status_token_fifo_q
)
;
output status_token_fifo_empty;
output status_token_fifo_full;
output [ 23: 0] status_token_fifo_q;
input clk;
input reset;
input [ 23: 0] status_token_fifo_data;
input status_token_fifo_rdreq;
input status_token_fifo_wrreq;
wire status_token_fifo_empty;
wire status_token_fifo_full;
wire [ 23: 0] status_token_fifo_q;
scfifo ECE385_nios2_dma_status_token_fifo_status_token_fifo
(
.aclr (reset),
.clock (clk),
.data (status_token_fifo_data),
.empty (status_token_fifo_empty),
.full (status_token_fifo_full),
.q (status_token_fifo_q),
.rdreq (status_token_fifo_rdreq),
.wrreq (status_token_fifo_wrreq)
);
defparam ECE385_nios2_dma_status_token_fifo_status_token_fifo.add_ram_output_register = "ON",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.intended_device_family = "CYCLONEIVE",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.lpm_numwords = 2,
ECE385_nios2_dma_status_token_fifo_status_token_fifo.lpm_showahead = "OFF",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.lpm_type = "scfifo",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.lpm_width = 24,
ECE385_nios2_dma_status_token_fifo_status_token_fifo.lpm_widthu = 1,
ECE385_nios2_dma_status_token_fifo_status_token_fifo.overflow_checking = "ON",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.underflow_checking = "ON",
ECE385_nios2_dma_status_token_fifo_status_token_fifo.use_eab = "ON";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_stream_fifo (
// inputs:
clk,
reset,
stream_fifo_data,
stream_fifo_rdreq,
stream_fifo_wrreq,
// outputs:
stream_fifo_empty,
stream_fifo_full,
stream_fifo_q
)
;
output stream_fifo_empty;
output stream_fifo_full;
output [ 35: 0] stream_fifo_q;
input clk;
input reset;
input [ 35: 0] stream_fifo_data;
input stream_fifo_rdreq;
input stream_fifo_wrreq;
wire stream_fifo_empty;
wire stream_fifo_full;
wire [ 35: 0] stream_fifo_q;
scfifo ECE385_nios2_dma_stream_fifo_stream_fifo
(
.aclr (reset),
.clock (clk),
.data (stream_fifo_data),
.empty (stream_fifo_empty),
.full (stream_fifo_full),
.q (stream_fifo_q),
.rdreq (stream_fifo_rdreq),
.wrreq (stream_fifo_wrreq)
);
defparam ECE385_nios2_dma_stream_fifo_stream_fifo.add_ram_output_register = "ON",
ECE385_nios2_dma_stream_fifo_stream_fifo.intended_device_family = "CYCLONEIVE",
ECE385_nios2_dma_stream_fifo_stream_fifo.lpm_numwords = 4,
ECE385_nios2_dma_stream_fifo_stream_fifo.lpm_showahead = "OFF",
ECE385_nios2_dma_stream_fifo_stream_fifo.lpm_type = "scfifo",
ECE385_nios2_dma_stream_fifo_stream_fifo.lpm_width = 36,
ECE385_nios2_dma_stream_fifo_stream_fifo.lpm_widthu = 2,
ECE385_nios2_dma_stream_fifo_stream_fifo.overflow_checking = "ON",
ECE385_nios2_dma_stream_fifo_stream_fifo.underflow_checking = "ON",
ECE385_nios2_dma_stream_fifo_stream_fifo.use_eab = "ON";
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_rx_barrel (
// inputs:
clk,
in_data,
in_empty,
in_eop,
in_sop,
in_valid,
out_ready,
reset_n,
shift,
// outputs:
in_ready,
out_data,
out_empty,
out_eop,
out_sop,
out_valid
)
;
output in_ready;
output [ 31: 0] out_data;
output [ 1: 0] out_empty;
output out_eop;
output out_sop;
output out_valid;
input clk;
input [ 31: 0] in_data;
input [ 1: 0] in_empty;
input in_eop;
input in_sop;
input in_valid;
input out_ready;
input reset_n;
input [ 1: 0] shift;
reg [ 31: 0] data_levelone;
reg [ 31: 0] data_leveltwo;
wire [ 1: 0] empty;
reg [ 1: 0] empty_levelone;
reg [ 1: 0] empty_leveltwo;
reg [ 2: 0] empty_minus_shift;
reg eop_levelone;
reg eop_leveltwo;
reg has_remaining_packet;
wire has_valid_data;
wire in_ready;
reg [ 31: 0] out_data;
reg [ 1: 0] out_empty;
reg out_eop;
reg out_sop;
wire out_valid;
wire pipeline_valid;
wire shift_more_than_empty;
reg sop_levelone;
reg sop_leveltwo;
reg [ 3: 0] state;
//Empty generation
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
empty_minus_shift <= 0;
else if (in_valid & in_eop)
empty_minus_shift <= in_empty - shift;
end
assign empty = empty_minus_shift[1 : 0];
//Pipe ready signal right through
assign in_ready = out_ready & ~has_remaining_packet;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
has_remaining_packet <= 0;
else
has_remaining_packet <= has_remaining_packet ? ~(out_ready & out_valid & out_eop) : (in_valid & in_ready & in_eop);
end
//Start off with a 2 level shift register
assign has_valid_data = in_valid | eop_levelone | eop_leveltwo;
assign pipeline_valid = has_valid_data & out_ready;
//Level One Shift Registers
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sop_levelone <= 0;
else if (pipeline_valid)
sop_levelone <= in_sop & in_ready & in_valid;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
eop_levelone <= 0;
else if (pipeline_valid)
eop_levelone <= in_eop;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
empty_levelone <= 0;
else if (pipeline_valid & in_eop)
empty_levelone <= in_empty;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
data_levelone <= 0;
else if (pipeline_valid)
data_levelone <= in_data;
end
//Level Two Shift Registers
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sop_leveltwo <= 0;
else if (pipeline_valid)
sop_leveltwo <= sop_levelone;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
eop_leveltwo <= 0;
else if (pipeline_valid)
eop_leveltwo <= eop_levelone;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
empty_leveltwo <= 0;
else if (pipeline_valid)
empty_leveltwo <= empty_levelone;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
data_leveltwo <= 0;
else if (pipeline_valid)
data_leveltwo <= data_levelone;
end
//Now we generate the outputs based on the given shift input
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_sop <= 0;
else if (pipeline_valid)
out_sop <= sop_levelone;
end
assign shift_more_than_empty = shift > empty_levelone;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_eop <= 0;
else if (out_ready)
out_eop <= out_eop ? 0 : (pipeline_valid & (shift_more_than_empty ? eop_leveltwo : eop_levelone));
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_empty <= 0;
else if (pipeline_valid)
out_empty <= empty;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_data <= 0;
else if (pipeline_valid)
case (shift) // synthesis parallel_case
2'd0: begin
out_data <= data_levelone;
end // 2'd0
2'd1: begin
out_data <= {data_levelone[23 : 0], data_leveltwo[31 : 24]};
end // 2'd1
2'd2: begin
out_data <= {data_levelone[15 : 0], data_leveltwo[31 : 16]};
end // 2'd2
2'd3: begin
out_data <= {data_levelone[7 : 0], data_leveltwo[31 : 8]};
end // 2'd3
endcase // shift
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
state <= 4'b0001;
else if (1)
case (state) // synthesis parallel_case
4'b0001: begin
if ((sop_levelone | sop_leveltwo) & pipeline_valid)
state <= 4'b0010;
end // 4'b0001
4'b0010: begin
if (out_eop & out_ready)
state <= 4'b1000;
else if (has_valid_data)
state <= 4'b0010;
else if (~pipeline_valid & out_ready)
state <= 4'b0100;
else if (~pipeline_valid & ~out_ready)
state <= 4'b0010;
else
state <= 4'b0100;
end // 4'b0010
4'b0100: begin
if (out_ready & pipeline_valid)
state <= 4'b0010;
end // 4'b0100
4'b1000: begin
if (sop_levelone | sop_leveltwo)
state <= 4'b0010;
else if (out_ready)
state <= 4'b0001;
end // 4'b1000
default: begin
state <= 4'b0001;
end // default
endcase // state
end
assign out_valid = state == 4'b0010;
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma_tx_barrel (
// inputs:
clk,
in_data,
in_empty,
in_eop,
in_sop,
in_valid,
out_ready,
reset_n,
shift,
// outputs:
in_ready,
out_data,
out_empty,
out_eop,
out_sop,
out_valid
)
;
output in_ready;
output [ 31: 0] out_data;
output [ 1: 0] out_empty;
output out_eop;
output out_sop;
output out_valid;
input clk;
input [ 31: 0] in_data;
input [ 1: 0] in_empty;
input in_eop;
input in_sop;
input in_valid;
input out_ready;
input reset_n;
input [ 1: 0] shift;
reg [ 31: 0] data_levelone;
reg [ 31: 0] data_leveltwo;
reg discard_following_packet_delayed_int;
wire discard_following_packet_int;
reg discard_following_packet_reg_int;
wire discard_following_packet_rise_edge_int;
wire [ 1: 0] empty_levelone;
wire [ 1: 0] empty_leveltwo;
reg [ 1: 0] empty_reg;
reg eop_levelone;
reg eop_leveltwo;
reg has_remaining_packet;
wire has_valid_data;
wire in_ready;
reg [ 31: 0] out_data;
reg [ 1: 0] out_empty;
wire out_eop;
reg out_eop_int;
wire out_sop;
reg out_sop_int;
wire out_valid;
wire pipeline_valid;
wire set_out_eop_int;
wire set_out_sop_int;
wire [ 2: 0] shift_plus_empty;
reg [ 2: 0] shift_plus_empty_leveltwo;
reg [ 1: 0] shift_reg;
reg sop_levelone;
reg sop_leveltwo;
reg [ 3: 0] state;
wire transmitted_eop_int;
wire transmitted_sop_int;
assign out_eop = out_eop_int;
assign out_sop = out_sop_int;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
shift_reg <= 0;
else if (in_valid & in_ready)
shift_reg <= shift;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
empty_reg <= 0;
else if (pipeline_valid)
empty_reg <= in_empty;
end
//Empty generation
assign shift_plus_empty = empty_reg + shift_reg;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
shift_plus_empty_leveltwo <= 0;
else if (pipeline_valid)
shift_plus_empty_leveltwo <= shift_plus_empty;
end
assign empty_levelone[1 : 0] = shift_plus_empty[1 : 0];
assign empty_leveltwo[1 : 0] = shift_plus_empty_leveltwo[1 : 0];
//Pipe ready signal right through
assign in_ready = out_ready & ~has_remaining_packet;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
has_remaining_packet <= 0;
else
has_remaining_packet <= has_remaining_packet ? ~(out_ready & out_valid & out_eop_int) : (in_valid & in_ready & in_eop);
end
//Start off with a 2 level shift register
assign has_valid_data = in_valid | eop_levelone | eop_leveltwo;
assign pipeline_valid = has_valid_data & out_ready;
//Level One Shift Registers
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sop_levelone <= 0;
else if (pipeline_valid)
sop_levelone <= in_sop & in_ready & in_valid;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
eop_levelone <= 0;
else if (pipeline_valid)
eop_levelone <= in_eop & in_ready & in_valid;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
data_levelone <= 0;
else if (pipeline_valid)
data_levelone <= in_data;
end
//Level Two Shift Registers
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sop_leveltwo <= 0;
else if (pipeline_valid)
sop_leveltwo <= sop_levelone;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
eop_leveltwo <= 0;
else if (pipeline_valid)
eop_leveltwo <= eop_levelone;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
data_leveltwo <= 0;
else if (pipeline_valid)
data_leveltwo <= data_levelone;
end
//Now we generate the outputs based on the given shift input
assign transmitted_sop_int = out_sop_int & out_ready & out_valid;
assign set_out_sop_int = (|shift_reg & sop_leveltwo) | (~|shift_reg & sop_levelone);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_sop_int <= 0;
else if (pipeline_valid & set_out_sop_int)
out_sop_int <= 1;
else if (transmitted_sop_int)
out_sop_int <= 0;
end
assign discard_following_packet_int = pipeline_valid & ((|shift_reg & shift_plus_empty[2] & eop_levelone)|(~|shift_reg & eop_levelone));
assign discard_following_packet_rise_edge_int = discard_following_packet_int & ~discard_following_packet_delayed_int;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
discard_following_packet_delayed_int <= 0;
else
discard_following_packet_delayed_int <= discard_following_packet_int;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
discard_following_packet_reg_int <= 0;
else if (pipeline_valid)
discard_following_packet_reg_int <= (discard_following_packet_reg_int & pipeline_valid) ? 0: discard_following_packet_rise_edge_int ? discard_following_packet_int : discard_following_packet_reg_int;
end
assign transmitted_eop_int = out_eop_int & out_ready & out_valid;
assign set_out_eop_int = (|shift_reg & shift_plus_empty[2] & eop_levelone) | (|shift_reg & ~shift_plus_empty_leveltwo[2] & eop_leveltwo) | (~|shift_reg & eop_levelone);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_eop_int <= 0;
else if (pipeline_valid & set_out_eop_int & ~discard_following_packet_reg_int)
out_eop_int <= 1;
else if (transmitted_eop_int)
out_eop_int <= 0;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_empty <= 0;
else if (out_ready & pipeline_valid)
out_empty <= ((|shift_reg & shift_plus_empty[2] & eop_levelone) | (~|shift_reg & eop_levelone)) ? empty_levelone: empty_leveltwo;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
out_data <= 0;
else if (pipeline_valid)
case (shift_reg) // synthesis parallel_case
2'd0: begin
out_data <= data_levelone;
end // 2'd0
2'd1: begin
out_data <= {data_levelone[7 : 0], data_leveltwo[31 : 8]};
end // 2'd1
2'd2: begin
out_data <= {data_levelone[15 : 0], data_leveltwo[31 : 16]};
end // 2'd2
2'd3: begin
out_data <= {data_levelone[23 : 0], data_leveltwo[31 : 24]};
end // 2'd3
endcase // shift_reg
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
state <= 4'b0001;
else if (1)
case (state) // synthesis parallel_case
4'b0001: begin
if (sop_levelone & ~|shift_reg & pipeline_valid)
state <= 4'b0010;
else if (sop_leveltwo & |shift_reg & pipeline_valid)
state <= 4'b0010;
end // 4'b0001
4'b0010: begin
if (out_eop_int & out_sop_int)
state <= 4'b0001;
else if (eop_leveltwo | eop_levelone)
state <= 4'b1000;
else if (pipeline_valid)
state <= 4'b0010;
else if (~pipeline_valid & out_ready)
state <= 4'b0100;
else if (~pipeline_valid & ~out_ready)
state <= 4'b0010;
else
state <= 4'b0100;
end // 4'b0010
4'b0100: begin
if (out_ready & pipeline_valid)
state <= 4'b0010;
end // 4'b0100
4'b1000: begin
if ((sop_levelone & ~|shift_reg) || (sop_leveltwo & |shift_reg))
state <= 4'b0010;
else if (out_ready & out_eop_int)
state <= 4'b0001;
end // 4'b1000
default: begin
state <= 4'b0001;
end // default
endcase // state
end
assign out_valid = (state == 4'b0010) | (state == 4'b1000);
endmodule
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module ECE385_nios2_dma (
// inputs:
clk,
csr_address,
csr_chipselect,
csr_read,
csr_write,
csr_writedata,
descriptor_read_readdata,
descriptor_read_readdatavalid,
descriptor_read_waitrequest,
descriptor_write_waitrequest,
m_read_readdata,
m_read_readdatavalid,
m_read_waitrequest,
m_write_waitrequest,
system_reset_n,
// outputs:
csr_irq,
csr_readdata,
descriptor_read_address,
descriptor_read_read,
descriptor_write_address,
descriptor_write_write,
descriptor_write_writedata,
m_read_address,
m_read_read,
m_write_address,
m_write_byteenable,
m_write_write,
m_write_writedata
)
;
output csr_irq;
output [ 31: 0] csr_readdata;
output [ 31: 0] descriptor_read_address;
output descriptor_read_read;
output [ 31: 0] descriptor_write_address;
output descriptor_write_write;
output [ 31: 0] descriptor_write_writedata;
output [ 31: 0] m_read_address;
output m_read_read;
output [ 31: 0] m_write_address;
output [ 3: 0] m_write_byteenable;
output m_write_write;
output [ 31: 0] m_write_writedata;
input clk;
input [ 3: 0] csr_address;
input csr_chipselect;
input csr_read;
input csr_write;
input [ 31: 0] csr_writedata;
input [ 31: 0] descriptor_read_readdata;
input descriptor_read_readdatavalid;
input descriptor_read_waitrequest;
input descriptor_write_waitrequest;
input [ 31: 0] m_read_readdata;
input m_read_readdatavalid;
input m_read_waitrequest;
input m_write_waitrequest;
input system_reset_n;
wire [103: 0] command_fifo_data;
wire command_fifo_empty;
wire command_fifo_full;
wire [103: 0] command_fifo_q;
wire command_fifo_rdreq;
wire command_fifo_wrreq;
wire csr_irq;
wire [ 31: 0] csr_readdata;
wire [ 31: 0] data_to_fifo;
wire [ 31: 0] desc_address_fifo_data;
wire desc_address_fifo_empty;
wire desc_address_fifo_full;
wire [ 31: 0] desc_address_fifo_q;
wire desc_address_fifo_rdreq;
wire desc_address_fifo_wrreq;
wire [ 31: 0] descriptor_read_address;
wire descriptor_read_read;
wire [ 31: 0] descriptor_write_address;
wire descriptor_write_write;
wire [ 31: 0] descriptor_write_writedata;
wire e_00;
wire e_01;
wire e_02;
wire e_03;
wire e_04;
wire e_05;
wire e_06;
wire [ 1: 0] empty_to_fifo;
wire eop_to_fifo;
wire [ 31: 0] m_read_address;
wire m_read_read;
wire [ 31: 0] m_write_address;
wire [ 3: 0] m_write_byteenable;
wire m_write_write;
wire [ 31: 0] m_write_writedata;
wire [ 58: 0] read_command_data;
wire read_command_valid;
wire read_go;
wire ready_from_fifo;
wire reset;
reg reset_n;
wire [ 31: 0] rx_out_dat;
wire [ 1: 0] rx_out_empty;
wire rx_out_eop;
wire rx_out_ready;
wire rx_out_sop;
wire rx_out_valid;
wire [ 1: 0] rx_shift;
wire [ 31: 0] sink_stream_data;
wire [ 1: 0] sink_stream_empty;
wire sink_stream_endofpacket;
wire sink_stream_endofpacket_from_fifo;
reg sink_stream_endofpacket_hold;
wire sink_stream_endofpacket_sig;
wire sink_stream_ready;
wire sink_stream_startofpacket;
wire sink_stream_valid;
reg sink_stream_valid_hold;
wire sink_stream_valid_out;
reg sink_stream_valid_reg;
wire sop_to_fifo;
wire [ 31: 0] source_stream_data;
wire [ 1: 0] source_stream_empty;
wire source_stream_endofpacket;
wire source_stream_ready;
wire source_stream_startofpacket;
wire source_stream_valid;
wire [ 23: 0] status_token_fifo_data;
wire status_token_fifo_empty;
wire status_token_fifo_full;
wire [ 23: 0] status_token_fifo_q;
wire status_token_fifo_rdreq;
wire status_token_fifo_wrreq;
wire [ 35: 0] stream_fifo_data;
wire stream_fifo_empty;
wire stream_fifo_full;
wire [ 35: 0] stream_fifo_q;
wire stream_fifo_rdreq;
wire stream_fifo_wrreq;
wire sw_reset;
reg sw_reset_d1;
reg sw_reset_request;
wire [ 31: 0] tx_in_data;
wire [ 1: 0] tx_in_empty;
wire tx_in_eop;
wire tx_in_ready;
wire [ 1: 0] tx_in_shift;
wire tx_in_sop;
wire tx_in_valid;
wire [ 1: 0] tx_shift_to_fifo;
wire valid_to_fifo;
wire [ 56: 0] write_command_data;
wire write_command_valid;
wire write_go;
always @(posedge clk or negedge system_reset_n)
begin
if (system_reset_n == 0)
reset_n <= 0;
else
reset_n <= ~(~system_reset_n | sw_reset_request);
end
always @(posedge clk or negedge system_reset_n)
begin
if (system_reset_n == 0)
sw_reset_d1 <= 0;
else if (sw_reset | sw_reset_request)
sw_reset_d1 <= sw_reset & ~sw_reset_request;
end
always @(posedge clk or negedge system_reset_n)
begin
if (system_reset_n == 0)
sw_reset_request <= 0;
else if (sw_reset | sw_reset_request)
sw_reset_request <= sw_reset_d1 & ~sw_reset_request;
end
assign reset = ~reset_n;
ECE385_nios2_dma_chain the_ECE385_nios2_dma_chain
(
.clk (clk),
.command_fifo_data (command_fifo_data),
.command_fifo_empty (command_fifo_empty),
.command_fifo_full (command_fifo_full),
.command_fifo_wrreq (command_fifo_wrreq),
.csr_address (csr_address),
.csr_chipselect (csr_chipselect),
.csr_irq (csr_irq),
.csr_read (csr_read),
.csr_readdata (csr_readdata),
.csr_write (csr_write),
.csr_writedata (csr_writedata),
.desc_address_fifo_data (desc_address_fifo_data),
.desc_address_fifo_empty (desc_address_fifo_empty),
.desc_address_fifo_full (desc_address_fifo_full),
.desc_address_fifo_q (desc_address_fifo_q),
.desc_address_fifo_rdreq (desc_address_fifo_rdreq),
.desc_address_fifo_wrreq (desc_address_fifo_wrreq),
.descriptor_read_address (descriptor_read_address),
.descriptor_read_read (descriptor_read_read),
.descriptor_read_readdata (descriptor_read_readdata),
.descriptor_read_readdatavalid (descriptor_read_readdatavalid),
.descriptor_read_waitrequest (descriptor_read_waitrequest & descriptor_read_read),
.descriptor_write_address (descriptor_write_address),
.descriptor_write_waitrequest (descriptor_write_waitrequest & descriptor_write_write),
.descriptor_write_write (descriptor_write_write),
.descriptor_write_writedata (descriptor_write_writedata),
.read_go (read_go),
.reset (reset),
.reset_n (reset_n),
.status_token_fifo_data (status_token_fifo_data),
.status_token_fifo_empty (status_token_fifo_empty),
.status_token_fifo_q (status_token_fifo_q),
.status_token_fifo_rdreq (status_token_fifo_rdreq),
.sw_reset (sw_reset),
.write_go (write_go)
);
ECE385_nios2_dma_command_grabber the_ECE385_nios2_dma_command_grabber
(
.clk (clk),
.command_fifo_empty (command_fifo_empty),
.command_fifo_q (command_fifo_q),
.command_fifo_rdreq (command_fifo_rdreq),
.m_read_waitrequest (m_read_waitrequest & m_read_read),
.m_write_waitrequest (m_write_waitrequest & m_write_write),
.read_command_data (read_command_data),
.read_command_valid (read_command_valid),
.read_go (read_go),
.reset_n (reset_n),
.write_command_data (write_command_data),
.write_command_valid (write_command_valid),
.write_go (write_go)
);
ECE385_nios2_dma_m_read the_ECE385_nios2_dma_m_read
(
.clk (clk),
.m_read_address (m_read_address),
.m_read_read (m_read_read),
.m_read_readdata (m_read_readdata),
.m_read_readdatavalid (m_read_readdatavalid),
.m_read_waitrequest (m_read_waitrequest & m_read_read),
.read_command_data (read_command_data),
.read_command_valid (read_command_valid),
.read_go (read_go),
.reset_n (reset_n),
.source_stream_data (data_to_fifo),
.source_stream_empty (empty_to_fifo),
.source_stream_endofpacket (eop_to_fifo),
.source_stream_ready (ready_from_fifo),
.source_stream_startofpacket (sop_to_fifo),
.source_stream_valid (valid_to_fifo),
.tx_shift (tx_shift_to_fifo)
);
ECE385_nios2_dma_m_readfifo the_ECE385_nios2_dma_m_readfifo
(
.clk (clk),
.reset (reset),
.reset_n (reset_n),
.sink_stream_data (data_to_fifo),
.sink_stream_empty (empty_to_fifo),
.sink_stream_endofpacket (eop_to_fifo),
.sink_stream_ready (ready_from_fifo),
.sink_stream_startofpacket (sop_to_fifo),
.sink_stream_valid (valid_to_fifo),
.source_stream_data (tx_in_data),
.source_stream_empty (tx_in_empty),
.source_stream_endofpacket (tx_in_eop),
.source_stream_ready (tx_in_ready),
.source_stream_startofpacket (tx_in_sop),
.source_stream_valid (tx_in_valid),
.tx_shift_in (tx_shift_to_fifo),
.tx_shift_out (tx_in_shift)
);
ECE385_nios2_dma_m_write the_ECE385_nios2_dma_m_write
(
.clk (clk),
.e_00 (e_00),
.e_01 (e_01),
.e_02 (e_02),
.e_03 (e_03),
.e_04 (e_04),
.e_05 (e_05),
.e_06 (e_06),
.m_write_address (m_write_address),
.m_write_byteenable (m_write_byteenable),
.m_write_waitrequest (m_write_waitrequest & m_write_write),
.m_write_write (m_write_write),
.m_write_writedata (m_write_writedata),
.reset_n (reset_n),
.rx_shift (rx_shift),
.sink_stream_data (rx_out_dat),
.sink_stream_empty (rx_out_empty),
.sink_stream_endofpacket (rx_out_eop),
.sink_stream_ready (rx_out_ready),
.sink_stream_startofpacket (rx_out_sop),
.sink_stream_valid (rx_out_valid),
.status_token_fifo_data (status_token_fifo_data),
.status_token_fifo_full (status_token_fifo_full),
.status_token_fifo_wrreq (status_token_fifo_wrreq),
.write_command_data (write_command_data),
.write_command_valid (write_command_valid),
.write_go (write_go)
);
//the_ECE385_nios2_dma_command_fifo, which is an e_instance
ECE385_nios2_dma_command_fifo the_ECE385_nios2_dma_command_fifo
(
.clk (clk),
.command_fifo_data (command_fifo_data),
.command_fifo_empty (command_fifo_empty),
.command_fifo_full (command_fifo_full),
.command_fifo_q (command_fifo_q),
.command_fifo_rdreq (command_fifo_rdreq),
.command_fifo_wrreq (command_fifo_wrreq),
.reset (reset)
);
//the_ECE385_nios2_dma_desc_address_fifo, which is an e_instance
ECE385_nios2_dma_desc_address_fifo the_ECE385_nios2_dma_desc_address_fifo
(
.clk (clk),
.desc_address_fifo_data (desc_address_fifo_data),
.desc_address_fifo_empty (desc_address_fifo_empty),
.desc_address_fifo_full (desc_address_fifo_full),
.desc_address_fifo_q (desc_address_fifo_q),
.desc_address_fifo_rdreq (desc_address_fifo_rdreq),
.desc_address_fifo_wrreq (desc_address_fifo_wrreq),
.reset (reset)
);
//the_ECE385_nios2_dma_status_token_fifo, which is an e_instance
ECE385_nios2_dma_status_token_fifo the_ECE385_nios2_dma_status_token_fifo
(
.clk (clk),
.reset (reset),
.status_token_fifo_data (status_token_fifo_data),
.status_token_fifo_empty (status_token_fifo_empty),
.status_token_fifo_full (status_token_fifo_full),
.status_token_fifo_q (status_token_fifo_q),
.status_token_fifo_rdreq (status_token_fifo_rdreq),
.status_token_fifo_wrreq (status_token_fifo_wrreq)
);
//descriptor_read, which is an e_avalon_master
//descriptor_write, which is an e_avalon_master
//csr, which is an e_avalon_slave
//m_read, which is an e_avalon_master
//m_write, which is an e_avalon_master
//the_ECE385_nios2_dma_stream_fifo, which is an e_instance
ECE385_nios2_dma_stream_fifo the_ECE385_nios2_dma_stream_fifo
(
.clk (clk),
.reset (reset),
.stream_fifo_data (stream_fifo_data),
.stream_fifo_empty (stream_fifo_empty),
.stream_fifo_full (stream_fifo_full),
.stream_fifo_q (stream_fifo_q),
.stream_fifo_rdreq (stream_fifo_rdreq),
.stream_fifo_wrreq (stream_fifo_wrreq)
);
//connect up the source to the stream_fifo
assign source_stream_ready = ~stream_fifo_full;
assign stream_fifo_data = {source_stream_startofpacket, source_stream_endofpacket, source_stream_empty, source_stream_data};
assign stream_fifo_wrreq = source_stream_valid & source_stream_ready;
//connect up the sink to the stream_fifo
assign stream_fifo_rdreq = ~stream_fifo_empty && sink_stream_ready;
assign sink_stream_startofpacket = stream_fifo_q[35];
assign sink_stream_endofpacket_from_fifo = stream_fifo_q[34];
assign sink_stream_endofpacket_sig = (sink_stream_endofpacket_from_fifo & sink_stream_valid) | sink_stream_endofpacket_hold;
assign sink_stream_endofpacket = sink_stream_endofpacket_sig;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sink_stream_endofpacket_hold <= 0;
else
sink_stream_endofpacket_hold <= (sink_stream_endofpacket_sig & ~sink_stream_ready) ? 1 : (sink_stream_ready ? 0 : sink_stream_endofpacket_hold);
end
assign sink_stream_data = stream_fifo_q[31 : 0];
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sink_stream_valid_reg <= 0;
else
sink_stream_valid_reg <= stream_fifo_rdreq;
end
assign sink_stream_valid_out = sink_stream_valid_reg | sink_stream_valid_hold;
assign sink_stream_valid = sink_stream_valid_out;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
sink_stream_valid_hold <= 0;
else
sink_stream_valid_hold <= (sink_stream_valid_out & ~sink_stream_ready) ? 1 : (sink_stream_ready ? 0 : sink_stream_valid_hold);
end
assign sink_stream_empty = stream_fifo_q[33 : 32];
ECE385_nios2_dma_rx_barrel the_ECE385_nios2_dma_rx_barrel
(
.clk (clk),
.in_data (sink_stream_data),
.in_empty (sink_stream_empty),
.in_eop (sink_stream_endofpacket),
.in_ready (sink_stream_ready),
.in_sop (sink_stream_startofpacket),
.in_valid (sink_stream_valid),
.out_data (rx_out_dat),
.out_empty (rx_out_empty),
.out_eop (rx_out_eop),
.out_ready (rx_out_ready),
.out_sop (rx_out_sop),
.out_valid (rx_out_valid),
.reset_n (reset_n),
.shift (rx_shift)
);
ECE385_nios2_dma_tx_barrel the_ECE385_nios2_dma_tx_barrel
(
.clk (clk),
.in_data (tx_in_data),
.in_empty (tx_in_empty),
.in_eop (tx_in_eop),
.in_ready (tx_in_ready),
.in_sop (tx_in_sop),
.in_valid (tx_in_valid),
.out_data (source_stream_data),
.out_empty (source_stream_empty),
.out_eop (source_stream_endofpacket),
.out_ready (source_stream_ready),
.out_sop (source_stream_startofpacket),
.out_valid (source_stream_valid),
.reset_n (reset_n),
.shift (tx_in_shift)
);
endmodule