SDRAM-学习10-fifo读模块

164 阅读1分钟

fifo读模块:

读取sdram中fifo_ctrl中读fifo中从sdram中读取的数据,fifo读模块读出数据,通过串口uart_tx发送。

image.png

框图

image.png

数据的输出由fifo输出,滞后一个周期。 rd_fifo_rd_data,滞后rd_en信号一个周期。

对rd_en信号打一拍得到 rd_en_dly信号。这样与数据读取保持同步了。

data_num信号实时显示当前fifo数据个数。

当数据长度满足数据长度,数据发送。rd_flag.

当前50MHZ时钟频率,uart使用9600波特率,

baud_cnt:波特率计数器进行计数,计数一个比特发送所需要的时间。一个字节8位数据加上起始位 停止位10位数据。

10bit位对应一个字节发送时间,为了方便计数声明比特标志信号,bit_flag,计数中间拉高一个时钟周期。bit_cnt比特计数器 计数bit个数区分是否满足一个字节的发送时间。 image.png

10个存储单元10个数据。

image.png

创建fifo

image.png

image.png

程序

(
input wire sys_clk,
input wire sys_rst_n,
input wire clk_out,
//写fifo信号
input wire 	wr_fifo_wr_clk,
input wire 	wr_fifo_wr_req,
input wire  [15:0]wr_fifo_wr_data,
input wire  [23:0]sdram_wr_b_addr,
input wire  [23:0]sdram_wr_e_addr,
input wire  [9:0]wr_brust_len,
input wire  wr_rst,
//读fifo
input wire 	rd_fifo_rd_clk,
input wire 	rd_fifo_rd_req,
input wire  [23:0]sdram_rd_e_addr,
input wire  [23:0]sdram_rd_b_addr,
input wire  [9:0]rd_brust_len,
input wire  rd_rst,
input wire read_vaild,
output wire [15:0]rd_fifo_rd_data,
output wire [9:0]rd_fifo_num,
//sdram硬件接口
output wire sdram_clk,
output wire sdram_cke,
output wire sdram_cs_n,
output wire sdram_ras_n,
output wire sdram_cas_n,
output wire sdram_we_n,
output wire [1:0]sdram_ba,
output wire [12:0]sdram_addr,
//掩码信号  未使用
output wire sdram_dqm,
input wire [15:0]sdram_dq




);

assign sdram_clk  = clk_out;
assign sdram_dqm = 2'b00;
wire init_end;
wire sdram_wr_ack;
wire sdram_wr_req;
wire [23:0]sdram_wr_addr;
wire [15:0]sdram_data_in;

wire sdram_rd_ack;
wire sdram_rd_req;
wire [15:0]sdram_data_out;
wire [23:0]sdram_rd_addr;





sdram_ctrl sdram_ctrl_inst
(
//时钟 复位 初始化结束信号
 .sys_clk(sys_clk),
 .sys_rst_n(sys_rst_n),
 .init_end(init_end),

	//sdram 写端口
 .sdram_wr_req(sdram_wr_req),
 .sdram_wr_addr(sdram_wr_addr),
 .wr_burst_len(wr_burst_len),
 .sdram_data_in(sdram_data_in),
 .sdram_wr_ack(sdram_wr_ack),
	//sdram读端口

 .sdram_rd_req(sdram_rd_req),
 .sdram_rd_addr(sdram_rd_addr),
 .rd_burst_len(rd_burst_len),
 .sdram_data_out(sdram_data_out),
 .sdram_rd_ack(sdram_rd_ack),

//sdram硬件连接接口
 .sdram_cke(sdram_cke),
 .sdram_cs_n(sdram_cs_n),
 .sdram_ras_n(sdram_ras_n),
 .sdram_cas_n(sdram_cas_n),
 .sdram_we_n(sdram_we_n),
 .sdram_ba(sdram_ba),
 .sdram_addr(sdram_addr),
 .sdram_dq(sdram_dq)

);


fifo_ctrl fifo_ctrl_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
//写fifo信号
.wr_fifo_wr_clk(wr_fifo_wr_clk),
.wr_fifo_wr_req(wr_fifo_wr_req),
.wr_fifo_wr_data(wr_fifo_wr_data),
.sdram_wr_b_addr(sdram_wr_b_addr),
.sdram_wr_e_addr(sdram_wr_e_addr),
.wr_brust_len(wr_brust_len),
.wr_rst(wr_rst),


//读fifo信号
.rd_fifo_rd_clk(rd_fifo_rd_clk),
.rd_fifo_rd_req(rd_fifo_rd_req),
.sdram_rd_e_addr(sdram_rd_e_addr),
.sdram_rd_b_addr(sdram_rd_b_addr),
.rd_brust_len(rd_brust_len),
.rd_rst(rd_rst),

.init_end(init_end),
.read_vaild(read_vaild),




.rd_fifo_rd_data(rd_fifo_rd_data),
.rd_fifo_num(rd_fifo_num),
//sdram 写信号
.sdram_wr_ack(sdram_wr_ack),
.sdram_wr_req(sdram_wr_req),
.sdram_wr_addr(sdram_wr_addr),
.sdram_data_in(sdram_data_in),
//sdram 读信号
.sdram_rd_ack(sdram_rd_ack),
.sdram_rd_req(sdram_rd_req),
.sdram_data_out(sdram_data_out),
.sdram_rd_addr(sdram_rd_addr)

);



endmodule