2 baidu 34794982 baidu_34794982 于 2016.04.26 11:19 提问

求大神帮我看一下代码哪里有问题,这是用verilog写的sdram的数据模块

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 12:07:50 04/20/2016
// Design Name:
// Module Name: datagene
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module datagene(clk,rst_n,
sdram_wr_ack,sdram_rd_ack,
syswr_done,
sdram_wr_req,sdram_rd_req,
sys_data_in,sys_addr
);
input clk; //FPAG输入时钟信号150MHz
input rst_n; //FPGA输入复位信号

//wrFIFO输入控制接口

output[31:0] sys_data_in; //sdram数据写入缓存FIFO输入数据总线
output sdram_wr_req; //sdram数据写入缓存FIFO数据输入请求,高有效
output sdram_rd_req;
output[20:0] sys_addr; //sdram读写地址产生
output syswr_done; //所有数据写入sdram完成标志位

input sdram_rd_ack; //系统读SDRAM响应信号,作为sdram的输写有效信号,这里捕获它的下降沿作为读地址自增加标志位
input sdram_wr_ack;
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[16:0] delay; //500us延时计数器

always @(posedge clk or negedge rst_n)
if(!rst_n) delay <= 17'd0;
else if(delay < 17'd74963) delay <= delay+1'b1;

wire delay_done = (delay == 17'd74963); //1ms延时结束

//------------------------------------------
//每511clk写入256个32bit数据到sdram,

(* KEEP = "TRUE" *) reg[8:0] cntwr; //写sdram定时计数器

always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
cntwr[8:0] <= 9'd0;
end
else if(delay_done)
begin
cntwr[8:0] <= cntwr[8:0] + 1'b1;
end

//------------------------------------------
//读写sdram地址产生
reg[10:0] addr; //sdram地址寄存器
always @(posedge clk or negedge rst_n)
if(!rst_n) addr <= 11'b0;
else if(!wr_done)
begin
if(cntwr == 9'd511) addr <= addr+1'b1;//写地址产生
else if(addr==11'h7ff) addr<=11'b0;
end
else if(wr_done) //读地址产生 ////////////test
begin
if(neg_rdack) addr <= addr+1'b1;
else if(addr==11'h7ff) addr<=11'b0;
end
assign sys_addr = {2'b00,addr,8'b00000000};

reg wr_done; //所有数据写入sdram完成标志位

always @(posedge clk or negedge rst_n)
if(!rst_n) wr_done <= 1'b0;
else if(addr == 11'h7ff) wr_done<=~wr_done;
else wr_done<=wr_done;

assign syswr_done = wr_done;

//------------------------------------------
//写sdram请求信号产生,即sdram的写入有效信号
reg sdram_wr_reqr; //写入有效信号
reg[31:0] sys_data_inr; //写入数据

always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
sdram_wr_reqr <= 1'b0;
end
else if(!wr_done)
begin //上电0.5ms延时完成
if(cntwr[8:0] <= 9'd6)
begin
sdram_wr_reqr <= 1'b1; //写请求信号产生
end
else if(cntwr[8:0] <= 9'd267)
begin
sdram_wr_reqr <= 1'b0; //请求信号撤销
end
else
begin
sdram_wr_reqr <= sdram_wr_reqr;
end
end

always @(posedge clk or negedge rst_n)
if(!rst_n) sys_data_inr <= 32'd0;
else if(sdram_wr_ack&& (!wr_done) && ((cntwr > 9'd7) && (cntwr <= 9'd263)))
begin

sys_data_inr <= sys_data_inr+1'b1; //写入数据递增,256个周期递增256,11~266clk
end
//读请求
reg sdram_rd_reqr;
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
sdram_rd_reqr <= 1'b0;
end
else if(wr_done)
begin //上电0.5ms延时完成
if(cntwr[8:0] <= 9'd6)
begin
sdram_rd_reqr <= 1'b1; //读请求信号产生
end
else if(cntwr[8:0] <= 9'd271)
begin
sdram_rd_reqr <= 1'b0; //请求信号撤销
end
else
begin
sdram_rd_reqr <= sdram_rd_reqr;
end
end
assign sdram_rd_req = sdram_rd_reqr;

assign sdram_wr_req = sdram_wr_reqr;
assign sys_data_in = sys_data_inr;

endmodule

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
SDRAM驱动篇之简易SDRAM控制器的verilog代码实现
在Kevin写的上一篇博文《SDRAM理论篇之基础知识及操作时序》中,已经把SDRAM工作的基本原理和SDRAM初始化、读、写及自动刷新操作的时序讲清楚了,在这一片博文中,Kevin来根据在上一篇博文中分析的思路来把写一个简单的SDRAM控制器。 我们在上一篇博文中提到了这样一个问题,SDRAM是每隔15us进行刷新一次,但是如果当SDRAM需要进行刷新时,而SDRAM正在写数据,这两个操作
SDRAM控制器(用Verilog编写)
用Verilog写的sdram控制器 经过测试 好用的sdram控制模块
HDMI系列之一:基于Nios II的HDMI显示图片
一休哥将在本文中介绍一个基于Nios II的HDMI显示图片的工程。我将主要分三个部分来介绍这一工程,从而实现工程效果。 1、 Nios II的常规使用套路 2、 自定义HDMI IP核的制作 3、 Nios II显示图片 本文涉及到的全部资料链接: 链接:http://pan.baidu.com/s/1eRNXagy 密码:uv9w1 Nios II的常规使用套路虽然使用Nios
sdram控制器程序
用verilog 写的关于SDRAM控制器的程序
最大公约数Stein算法之verilog实现
求最大公约数有几种算法:1、辗转相除法,2、更相减损法,3、Stein算法。 Stein算法跟更相减损法很像,而且只有比较、减法,非常适合用FPGA实现。
用verilog实现除法器(两种方法)
一、 实验目的与要求: 用verilog语言编写出一个除法器的代码,并在modelsim中进行功能仿真,认真的完成实验报告。 二、 实验设备(环境)及要求: 在modelsim环境下编写代码与测试程序,并仿真; 在synplify pro下编译,设置硬件并综合。 三、 实验内容及步骤: 1、 选择除法器的算法,本实验开始采用的是减法实现除法器的例子(比如十进制中的a/b,可先比较a与b的大小,如果a>b,则商加1,a<=a-b,再进行比较大小,直到a<b,商不变,余数为a); 2、 选择好算法,进行verilog语言编程,再写好testbench并进行编译与功能仿真; 3、 在中进行初步综合; 4、 完成实验报告;
FPGA的SDRAM操作
http://www.cnblogs.com/zhongguo135/archive/2012/09/05/2671573.html
Verilog编写的SDRAM读写控制器
Verilog编写的SDRAM读写控制器,经过仿真验证,可以使用的源码,可直接实例化。
仿真镁光DDR2的verilog模型时的一些注意问题
前些日子用ise的ddr2的ip核联合modulsim仿真镁光的ddr2的verilog模型,但是总是编译会报错。后来看了一下镁光下载过来的文件中有说明,和大家分享一下,希望有帮助。 首先镁光下载的文件夹里有这么些个东西: ddr2.v是用的仿真期间模型。就是可以用来仿真的。 DDR2_module好像好几个DDR2集成写到一起的。 DDR2_mcp一些参数 Ddr2——parame
FPGA&Verilog;读写SDRAM控制器
Verilog & FPGA实现SDRAM读写控制器,源码。 具体请见博客。