您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > SDRAM的verilog代码
modulesdr_test(clk,rst_n,sdram_clk,sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n,sdram_ba,sdram_addr,sdram_data,//sdram_udqm,sdram_ldqmrs232_tx,/*sdram_rd_req,sdram_wr_ack,sdram_rd_ack,sys_data_out,sdram_busy,sys_data_in,sys_dout_rdy,*/rdf_dout/*,rdf_rdreq*/);inputclk;//系统时钟,100MHzinputrst_n;//复位信号,低电平有效//FPGA与SDRAM硬件接口outputsdram_clk;//SDRAM时钟信号outputsdram_cke;//SDRAM时钟有效信号outputsdram_cs_n;//SDRAM片选信号outputsdram_ras_n;//SDRAM行地址选通脉冲outputsdram_cas_n;//SDRAM列地址选通脉冲outputsdram_we_n;//SDRAM写允许位output[1:0]sdram_ba;//SDRAM的L-Bank地址线output[11:0]sdram_addr;//SDRAM地址总线//outputsdram_udqm;//SDRAM高字节屏蔽//outputsdram_ldqm;//SDRAM低字节屏蔽inout[15:0]sdram_data;//SDRAM数据总线outputrs232_tx;//RS232发送数据信号//////////////////////////////////////////////////SDRAM的封装接口测试引出/*outputsdram_rd_req;//系统读SDRAM请求信号outputsdram_wr_ack;//系统写SDRAM响应信号outputsdram_rd_ack;//系统读SDRAM响应信号output[15:0]sys_data_in;//写SDRAM时数据暂存器,4个突发读写字数据,默认为00地址bit15-0;01地址bit31-16;10地址bit47-32;11地址bit63-48output[15:0]sys_data_out;//读SDRAM时数据暂存器,(格式同上)outputsdram_busy;//SDRAM忙标志,高表示SDRAM处于工作中outputsys_dout_rdy;//SDRAM数据输出完成标志*/output[15:0]rdf_dout;//sdram数据读出缓存FIFO输出数据总线//outputrdf_rdreq;//sdram数据读出缓存FIFO数据输出请求,高有效//////////////////////////////////////////////////SDRAM的封装接口wiresdram_wr_req;//系统写SDRAM请求信号wiresdram_rd_req;//系统读SDRAM请求信号wiresdram_wr_ack;//系统写SDRAM响应信号,作为wrFIFO的输出有效信号wiresdram_rd_ack;//系统读SDRAM响应信号,作为rdFIFO的输写有效信号wire[21:0]sys_addr;//读写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址wire[15:0]sys_data_in;//写SDRAM时数据暂存器wire[15:0]sys_data_out;//sdram数据读出缓存FIFO输入数据总线wiresdram_busy;//SDRAM忙标志,高表示SDRAM处于工作中wiresys_dout_rdy;//SDRAM数据输出完成标志//wrFIFO输入控制接口wire[15:0]wrf_din;//sdram数据写入缓存FIFO输入数据总线wirewrf_wrreq;//sdram数据写入缓存FIFO数据输入请求,高有效//rdFIFO输出控制接口wire[15:0]rdf_dout;//sdram数据读出缓存FIFO输出数据总线wirerdf_rdreq;//sdram数据读出缓存FIFO数据输出请求,高有效//系统控制相关信号接口wireclk_25m;//PLL输出25MHz时钟wireclk_100m;//PLL输出100MHz时钟wiresys_rst_n;//系统复位信号,低有效//------------------------------------------------//例化系统复位信号和PLL控制模块sys_ctrluut_sysctrl(.clk(clk),.rst_n(rst_n),.sys_rst_n(sys_rst_n),.clk_25m(clk_25m),.clk_100m(clk_100m),.sdram_clk(sdram_clk));//------------------------------------------------//例化SDRAM封装控制模块sdram_topuut_sdramtop(//SDRAM.clk(clk_100m),.rst_n(sys_rst_n),.sdram_wr_req(sdram_wr_req),.sdram_rd_req(sdram_rd_req),.sdram_wr_ack(sdram_wr_ack),.sdram_rd_ack(sdram_rd_ack),.sys_addr(sys_addr),.sys_data_in(sys_data_in),.sys_data_out(sys_data_out),.sys_dout_rdy(sys_dout_rdy),//.sdram_clk(sdram_clk),.sdram_busy(sdram_busy),.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_data(sdram_data)//.sdram_udqm(sdram_udqm),//.sdram_ldqm(sdram_ldqm));//------------------------------------------------//读写SDRAM数据缓存FIFO模块例化sdfifo_ctrluut_sdffifoctrl(.clk_25m(clk_25m),.clk_100m(clk_100m),.wrf_din(wrf_din),.wrf_wrreq(wrf_wrreq),.sdram_wr_ack(sdram_wr_ack),//.sys_addr(sys_addr),.sys_data_in(sys_data_in),.sdram_wr_req(sdram_wr_req),.sys_data_out(sys_data_out),.rdf_rdreq(rdf_rdreq),.sdram_rd_ack(sdram_rd_ack),.rdf_dout(rdf_dout),.sdram_rd_req(sdram_rd_req),.syswr_done(syswr_done),.tx_start(tx_start));//------------------------------------------------//例化模拟写入数据到sdram模块wiresyswr_done;//所有数据写入sdram完成标志位datageneuut_datagene(.clk(clk_25m),.rst_n(sys_rst_n),.wrf_din(wrf_din),.wrf_wrreq(wrf_wrreq),.moni_addr(sys_addr),.syswr_done(syswr_done),.sdram_rd_ack(sdram_rd_ack));//------------------------------------------------//例化串口数据发送控制模块wiretx_start;//串口发送数据启动标志位,高有效uart_ctrluut_uartctrl(.clk(clk_25m),.rst_n(sys_rst_n),.tx_data(rdf_dout[7:0]),.tx_start(tx_start),///////////.fifo232_rdreq(rdf_rdreq),.rs232_tx(rs232_tx));Endmodulemoduledatagene(clk,rst_n,wrf_din,wrf_wrreq,moni_addr,syswr_done,sdram_rd_ack);inputclk;//FPAG输入时钟信号25MHzinputrst_n;//FPGA输入复位信号//wrFIFO输入控制接口output[15:0]wrf_din;//sdram数据写入缓存FIFO输入数据总线outputwrf_wrreq;//sdram数据写入缓存FIFO数据输入请求,高有效output[21:0]moni_addr;//sdram读写地址产生outputsyswr_done;//所有数据写入sdram完成标志位inputsdram_rd_ack;//系统读SDRAM响应信号,作为rdFIFO的输写有效信号,这里捕获它的下降沿作为读地址自增加标志位regsdr_rdackr1,sdr_rdackr2;//------------------------------------------//捕获sdram_rd_ack下降沿标志位always@(posedgeclkornegedgerst_n)if(!rst_n)beginsdr_rdackr1=1'b0;sdr_rdackr2=1'b0;endelsebeginsdr_rdackr1=sdram_rd_ack;sdr_rdackr2=sdr_rdackr1;endwireneg_rdack=~sdr_rdackr1&sdr_rdackr2;//------------------------------------------//上电500us延时等待sdram就绪reg[13:0]delay;//500us延时计数器always@(posedgeclkornegedgerst_n)if(!rst_n)delay=14'd0;elseif(delay14'd12500)delay=delay+1'b1;wiredelay_done=(delay==14'd12500);//1ms延时结束//------------------------------------------//每640ns写入8个16bit数据到sdram,//上电后所有地址写入完毕时间需要不到360ms时间reg[5:0]cntwr;//写sdram定时计数器always@(posedgeclkornegedgerst_n)if(!rst_n)cntwr=6'd0;elseif(delay_done)cntwr=cntwr+1'b1;//------------------------------------------//读写sdram地址产生reg[18:0]addr;//sdram地址寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)addr=19'd0;elseif(!wr_done&&cntwr==6'h3f)addr=addr+1'b1;//写地址
本文标题:SDRAM的verilog代码
链接地址:https://www.777doc.com/doc-3519105 .html