硬件测试示意图
下面是顶层代码,顶层主要在单字节仿真测试里加入uart串口和八段数码管来测试SDRAM读写状态
module sdram_rw_test(
input i_clk,//输入时钟50M
input i_rst_n,//复位低有效
inout [15:0] io_sdram_data, //数据总线
output o_sdram_clk, //sdram时钟,100MHz
input uart_rx,//串口输入
output uart_tx,//串口输出
output [7:0] SMG_Data,//输出段选信号(LEDA .. LEDH)
output [5:0] Scan_Sig, //输出列扫描信号(SEL0_T~SEL5_T)
output [14:0] o_sdram_addr,//输出sdram地址
output o_sdram_cke,//输出sdram时钟片选
output o_sdram_cs,//输出sdram片选
output o_sdram_ras,//输出sdram行有效
output o_sdram_cas,//输出sdram列有效
output o_sdram_we, //输出sdram写有效
output o_sdram_ldqm,//数据掩码
output o_sdram_udqm //数据掩码
);
wire i_rd_trig;
wire i_wr_trig;
wire i_rd_done;
wire i_wr_done;
wire o_data_indi;
wire o_wr_indi;
wire rdsig;
wire wrsig;
wire [7:0] data_out;
wire [15:0] wr_data;
reg [15:0] rd_data;
reg sdram_out_en;
reg [15:0] sdram_wr_data ;//写数据
//100M输出
wire clk1_100M;
pll pll_inst (
.inclk0 ( i_clk ),
.c0 ( clk1_100M )
);
//串口模块
uart_top uart_top_inst(
.i_clk(clk1_100M),//输入时钟
.i_rst_n(i_rst_n),//复位低有效
.wrsig(o_data_indi),//串口发送使能信号,上升沿有效
.data_in(rd_data),//串口发送输入数据
.tx(uart_tx),//串口发送端口
.rx(uart_rx),//串口接收端口
.rdsig(rdsig),//串口接收完成信号
.data_out(data_out)//串口接收输出数据
);
//数码管模块
smg_interface smg_interface_inst
(
.CLK( i_clk ),
.RSTn( i_rst_n ),
.Number_Sig( rd_data ), // input - from U1
.SMG_Data( SMG_Data ), // output - to top
.Scan_Sig( Scan_Sig ) // output - to top
);
//SDRAM模块
sdram_top sdram_top_inst(
.i_clk(clk1_100M),//输入时钟100M
.i_rst_n(i_rst_n),//复位低有效
.i_rd_trig(i_rd_trig),//读触发
.i_wr_trig(rdsig),//写触发
.i_rd_done(i_rd_done),//sdram读完成指示信号
.i_wr_done(i_wr_done),//sdram写完成指示信号
.o_wr_indi(o_wr_indi),//写数据有效
.o_data_indi(o_data_indi),//读数据有效
.o_sdram_clk(o_sdram_clk),//sdram时钟,100MHz
.o_sdram_addr(o_sdram_addr),//输出sdram地址
.o_sdram_cke(o_sdram_cke),//输出sdram时钟片选
.o_sdram_cs(o_sdram_cs),//输出sdram片选
.o_sdram_ras(o_sdram_ras),//输出sdram行有效
.o_sdram_cas(o_sdram_cas),//输出sdram列有效
.o_sdram_we(o_sdram_we), //输出sdram写有效
.o_sdram_ldqm(o_sdram_ldqm),//数据掩码
.o_sdram_udqm(o_sdram_udqm)//数据掩码
);
assign io_sdram_data = sdram_out_en ? sdram_wr_data:16'bz;
assign wr_data = data_out;//串口接收的数据送入sdram写端口
assign i_rd_trig = (o_wr_indi)? 1'b1:1'b0;//产生读触发命令
//SDRAM输出数据使能
always@(posedge clk1_100M or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
sdram_out_en <= 1'd0;
else if(o_wr_indi)
sdram_out_en <= 1'b1;
else
sdram_out_en <= 1'b0;
end
//SDRAM写数据
always@(posedge clk1_100M or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
sdram_wr_data <= 16'd0;
else if(o_wr_indi)
sdram_wr_data <= wr_data;
end
//SDRAM读数据
always@(posedge clk1_100M or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
rd_data <= 16'd0;
else if(o_data_indi)
rd_data <= io_sdram_data;
end
endmodule
将工程生成的jic文件下载到开发板
开发板上电运行状态
连接串口发送一个34
使用SignalTap来捕捉串口数据
串口发送89,捕捉串口接收模块
rdsig上升沿表示串口接收完成信号,可以看到捕捉到89
可以对照这个命令状态机看采集的波形是否正常
单字节读
读时序