📄 dma.v
字号:
//Legal Notice: (C)2005 Altera Corporation. All rights reserved. Your
//use of Altera Corporation's design tools, logic functions and other
//software and tools, and its AMPP partner logic functions, and any
//output files any of the foregoing (including device programming or
//simulation files), and any associated documentation or information are
//expressly subject to the terms and conditions of the Altera Program
//License Subscription Agreement or other applicable license agreement,
//including, without limitation, that your use is for the sole purpose
//of programming logic devices manufactured by Altera and sold by Altera
//or its authorized distributors. Please refer to the applicable
//agreement for further details.
// synthesis translate_off
`timescale 1ns / 100ps
// synthesis translate_on
module dma_read_data_mux (
// inputs:
byte,
clk,
clk_en,
dma_ctl_address,
dma_ctl_chipselect,
dma_ctl_write_n,
dma_ctl_writedata,
hw,
read_readdata,
read_readdatavalid,
readaddress,
readaddress_inc,
reset_n,
// outputs:
fifo_wr_data
);
output [ 15: 0] fifo_wr_data;
input byte;
input clk;
input clk_en;
input [ 2: 0] dma_ctl_address;
input dma_ctl_chipselect;
input dma_ctl_write_n;
input [ 25: 0] dma_ctl_writedata;
input hw;
input [ 15: 0] read_readdata;
input read_readdatavalid;
input [ 25: 0] readaddress;
input [ 4: 0] readaddress_inc;
input reset_n;
wire control_write;
wire [ 15: 0] fifo_wr_data;
wire length_write;
wire read_data_mux_input;
reg readdata_mux_select;
assign control_write = dma_ctl_chipselect & ~dma_ctl_write_n & ((dma_ctl_address == 6) || (dma_ctl_address == 7));
assign length_write = dma_ctl_chipselect & ~dma_ctl_write_n & (dma_ctl_address == 3);
assign read_data_mux_input = ((control_write && dma_ctl_writedata[3] || length_write))? readaddress[1 : 0] :
(read_readdatavalid)? (readdata_mux_select + readaddress_inc) :
readdata_mux_select;
// Reset value: the transaction size bits of the read address reset value.
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
readdata_mux_select <= 0;
else if (clk_en)
readdata_mux_select <= read_data_mux_input;
end
assign fifo_wr_data[15 : 8] = read_readdata[15 : 8];
assign fifo_wr_data[7 : 0] = ({8 {(byte & (readdata_mux_select == 0))}} & read_readdata[7 : 0]) |
({8 {(byte & (readdata_mux_select == 1))}} & read_readdata[15 : 8]) |
({8 {hw}} & read_readdata[7 : 0]);
endmodule
module dma_byteenables (
// inputs:
byte,
hw,
write_address,
// outputs:
write_byteenable
);
output [ 1: 0] write_byteenable;
input byte;
input hw;
input [ 25: 0] write_address;
wire wa_0_is_0;
wire wa_0_is_1;
wire [ 1: 0] write_byteenable;
assign wa_0_is_1 = write_address[0] == 1'h1;
assign wa_0_is_0 = write_address[0] == 1'h0;
assign write_byteenable = ({2 {byte}} & {wa_0_is_1, wa_0_is_0}) |
({2 {hw}} & 2'b11);
endmodule
module dma_fifo_module_fifo_ram_module (
// inputs:
clk,
data,
rdaddress,
rdclken,
reset_n,
wraddress,
wrclock,
wren,
// outputs:
q
);
output [ 15: 0] q;
input clk;
input [ 15: 0] data;
input [ 1: 0] rdaddress;
input rdclken;
input reset_n;
input [ 1: 0] wraddress;
input wrclock;
input wren;
reg [ 15: 0] mem_array [ 3: 0];
wire [ 15: 0] q;
reg [ 1: 0] read_address;
//synthesis translate_off
//////////////// SIMULATION-ONLY CONTENTS
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
read_address <= 0;
else if (rdclken)
read_address <= rdaddress;
end
// Data read is synchronized through latent_rdaddress.
assign q = mem_array[read_address];
always @(posedge wrclock)
begin
// Write data
if (wren)
mem_array[wraddress] <= data;
end
//////////////// END SIMULATION-ONLY CONTENTS
//synthesis translate_on
//synthesis read_comments_as_HDL on
// always @(rdaddress)
// begin
// if (1)
// read_address <= rdaddress;
// end
//
//
// lpm_ram_dp lpm_ram_dp_component
// (
// .data (data),
// .q (q),
// .rdaddress (read_address),
// .rdclken (rdclken),
// .rdclock (clk),
// .wraddress (wraddress),
// .wrclock (wrclock),
// .wren (wren)
// );
//
// defparam lpm_ram_dp_component.lpm_file = "UNUSED",
// lpm_ram_dp_component.lpm_hint = "USE_EAB=ON",
// lpm_ram_dp_component.lpm_indata = "REGISTERED",
// lpm_ram_dp_component.lpm_outdata = "UNREGISTERED",
// lpm_ram_dp_component.lpm_rdaddress_control = "REGISTERED",
// lpm_ram_dp_component.lpm_width = 16,
// lpm_ram_dp_component.lpm_widthad = 2,
// lpm_ram_dp_component.lpm_wraddress_control = "REGISTERED",
// lpm_ram_dp_component.suppress_memory_conversion_warnings = "ON";
//
//synthesis read_comments_as_HDL off
endmodule
module dma_fifo_module (
// inputs:
clk,
clk_en,
fifo_read,
fifo_wr_data,
fifo_write,
flush_fifo,
inc_pending_data,
reset_n,
// outputs:
fifo_datavalid,
fifo_empty,
fifo_rd_data,
p1_fifo_full
);
output fifo_datavalid;
output fifo_empty;
output [ 15: 0] fifo_rd_data;
output p1_fifo_full;
input clk;
input clk_en;
input fifo_read;
input [ 15: 0] fifo_wr_data;
input fifo_write;
input flush_fifo;
input inc_pending_data;
input reset_n;
wire [ 1: 0] estimated_rdaddress;
reg [ 1: 0] estimated_wraddress;
wire fifo_datavalid;
wire fifo_dec;
reg fifo_empty;
reg fifo_full;
wire fifo_inc;
wire [ 15: 0] fifo_ram_q;
wire [ 15: 0] fifo_rd_data;
reg last_write_collision;
reg [ 15: 0] last_write_data;
wire [ 1: 0] p1_estimated_wraddress;
wire p1_fifo_empty;
wire p1_fifo_full;
wire [ 1: 0] p1_wraddress;
wire [ 1: 0] rdaddress;
reg [ 1: 0] rdaddress_reg;
reg [ 1: 0] wraddress;
wire write_collision;
assign p1_wraddress = (fifo_write)? wraddress - 1 :
wraddress;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
wraddress <= 0;
else if (clk_en)
if (flush_fifo)
wraddress <= 0;
else
wraddress <= p1_wraddress;
end
assign rdaddress = flush_fifo ? 0 : fifo_read ? (rdaddress_reg - 1) : rdaddress_reg;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
rdaddress_reg <= 0;
else if (1)
rdaddress_reg <= rdaddress;
end
assign fifo_datavalid = ~fifo_empty;
assign fifo_inc = fifo_write & ~fifo_read;
assign fifo_dec = fifo_read & ~fifo_write;
assign estimated_rdaddress = rdaddress_reg - 1;
assign p1_estimated_wraddress = (inc_pending_data)? estimated_wraddress - 1 :
estimated_wraddress;
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
estimated_wraddress <= {2 {1'b1}};
else if (clk_en)
if (flush_fifo)
estimated_wraddress <= {2 {1'b1}};
else
estimated_wraddress <= p1_estimated_wraddress;
end
assign p1_fifo_empty = flush_fifo | ((~fifo_inc & fifo_empty) | (fifo_dec & (wraddress == estimated_rdaddress)));
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
fifo_empty <= 1;
else if (clk_en)
fifo_empty <= p1_fifo_empty;
end
assign p1_fifo_full = ~flush_fifo & ((~fifo_dec & fifo_full) | (inc_pending_data & (estimated_wraddress == rdaddress)));
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
fifo_full <= 0;
else if (clk_en)
fifo_full <= p1_fifo_full;
end
assign write_collision = fifo_write && (wraddress == rdaddress);
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
last_write_data <= 0;
else if (write_collision)
last_write_data <= fifo_wr_data;
end
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
last_write_collision <= 0;
else if (1)
if (write_collision)
last_write_collision <= -1;
else if (fifo_read)
last_write_collision <= 0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -