📄 datagene.v
字号:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company :
// Engineer :
// Create Date :
// Design Name :
// Module Name : datagene
// Project Name :
// Target Device: Cyclone EP1C3T144C8
// Tool versions: Quartus II 8.1
// Description : 模拟写入数据到sdram模块
//
// Revision : V1.0
// Additional Comments :
//
////////////////////////////////////////////////////////////////////////////////
module datagene(
clk,rst_n,
wrf_din,wrf_wrreq,sys_wraddr,sys_rdaddr,
syswr_done,sdram_busy,
sdram_rd_ack
);
input clk; //FPAG输入时钟信号25MHz
input rst_n; //FPGA输入复位信号
input sdram_busy;
output[21:0] sys_wraddr; //写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
output[21:0] sys_rdaddr;
//wrFIFO输入控制接口
output[15:0] wrf_din; //sdram数据写入缓存FIFO输入数据总线
output wrf_wrreq; //sdram数据写入缓存FIFO数据输入请求,高有效
output syswr_done; //所有数据写入sdram完成标志位
input sdram_rd_ack; //系统读SDRAM响应信号,作为rdFIFO的输写有效信号,这里捕获它的下降沿作为读地址自增加标志位
reg sdr_rdackr1,sdr_rdackr2;
//------------------------------------------
//捕获sdram_rd_ack下降沿标志位
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
sdr_rdackr1 <= 1'b0;
sdr_rdackr2 <= 1'b0;
end
else begin
sdr_rdackr1 <= sdram_rd_ack;
sdr_rdackr2 <= sdr_rdackr1;
end
wire neg_rdack = ~sdr_rdackr1 & sdr_rdackr2;
//------------------------------------------
//上电500us延时等待sdram就绪
reg[13:0] delay; //500us延时计数器
always @(posedge clk or negedge rst_n)
if(!rst_n) delay <= 14'd0;
else if(delay < 14'd12500) delay <= delay+1'b1;
wire delay_done = (delay == 14'd12500); //1ms延时结束
//------------------------------------------
//每640ns写入8个16bit数据到sdram,
//上电后所有地址写入完毕时间需要不到360ms时间
reg[9:0] cntwr; //写sdram定时计数器
always @(posedge clk or negedge rst_n)
if(!rst_n) cntwr <= 10'd0;
else if(delay_done) cntwr <= cntwr+1'b1;//sdram_busy
//------------------------------------------
//读写sdram地址产生
//reg[18:0] wr_addr; //sdram地址寄存器
//reg[18:0] rd_addr;
reg[13:0] wr_addr; //sdram地址寄存器
reg[13:0] rd_addr;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
wr_addr <= 14'd0;
rd_addr <= 14'd0;
end
else if(!wr_done && cntwr == 10'h3ff) wr_addr <= wr_addr+1'b1;//写地址产生
else if(wr_done && neg_rdack) rd_addr <= rd_addr+1'b1; //读地址产生 ////////////test
assign sys_wraddr = {wr_addr,8'd0};
assign sys_rdaddr = {rd_addr,8'd0};
reg wr_done; //所有数据写入sdram完成标志位
always @(posedge clk or negedge rst_n)
if(!rst_n) wr_done <= 1'b0;
else if(wr_addr == 14'h3fff) wr_done <= 1'b1;
else if(rd_addr == 14'h3fff) wr_done <= 1'b0;
//else if((cntwr>10'd105) & (cntwr<10'h3ff)) wr_done<=1'b1;
//else wr_done<=1'b0;
assign syswr_done = wr_done;
//------------------------------------------
//写sdram请求信号产生,即wrfifo的写入有效信号
reg wrf_wrreqr; //wrfifo的写入有效信号
reg[15:0] wrf_dinr; //wrfifo的写入数据
always @(posedge clk or negedge rst_n)
if(!rst_n) wrf_wrreqr <= 1'b0;
else if(!wr_done) begin //上电0.5ms延时完成
if(cntwr == 10'h05) wrf_wrreqr <= 1'b1; //写请求信号产生
else if(cntwr == 10'h105) wrf_wrreqr <= 1'b0; //请求信号撤销
end
always @(posedge clk or negedge rst_n)
if(!rst_n) wrf_dinr <= 16'd0;
else if(!wr_done && ((cntwr > 10'h05) && (cntwr <= 10'h105))) begin //上电0.5ms延时完成
wrf_dinr <= wrf_dinr+1'b1; //写入数据递增
end
assign wrf_wrreq = wrf_wrreqr;
assign wrf_din = wrf_dinr;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -