fifo读模块:
读取sdram中fifo_ctrl中读fifo中从sdram中读取的数据,fifo读模块读出数据,通过串口uart_tx发送。
框图
数据的输出由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个数区分是否满足一个字节的发送时间。
10个存储单元10个数据。
创建fifo
程序
(
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