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

问题描述

求大神帮我看一下代码哪里有问题,这是用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

时间: 2024-08-03 20:53:59

设计-求大神帮我看一下代码哪里有问题,这是用verilog写的sdram的数据模块的相关文章

点击事件-求大神帮我看下Fragment的问题

问题描述 求大神帮我看下Fragment的问题 问题是这样的我在一个FragmentA中点击listview的一个item跳到FragmentB中(replace方法),在B中的布局中点击仍然可以相应FragmentA中listview中的点击事件是什么情况?急急急 解决方案 哥们你这描述的太模糊了,贴代码上来看看. 解决方案二: 找到了,是布局的问题正在改中,谢谢哈

软件开发-求大神帮我看看C++代码

问题描述 求大神帮我看看C++代码 以下是我的.h头文件: #include <vector> #include<iostream> #include <iomanip> #include <math.h> #define M_PI 3.14159265359 ////////**************定义目标状态***************//////// typedef struct strTargetState//笛卡尔坐标系位置 { double

用asp.net弄了一个视频播放,用了以下代码画面出来却停在那里点击开始按钮也一直不播放,求大神帮我看下问题出现在那里?非常感谢!

问题描述 publicpartialclassPlay:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){if(Request.QueryString["url"]!=null)}}publicstringPlayMedia(){stringurl=Request.QueryString["url"].ToString();stringstrScript="<TABL

int-求大神 帮我看下这个存储过程哪里错了

问题描述 求大神 帮我看下这个存储过程哪里错了 DROP PROCEDURE IF EXISTS Query_Role_PhoneRecord;DELIMITER ;;CREATE DEFINER=root@% PROCEDURE Query_Role_PhoneRecord( in userId binary(16)in pagNo intin pagSize int )BEGINdeclare bSize int; set bSize=(pagNo-1)*pagSize;if(bSize<0

ajax-求大神帮我看下为啥这段代码一直走error?

问题描述 求大神帮我看下为啥这段代码一直走error? 解决方案 跨域的服务器进行跨域支持了吗? 120.27.130.65这个服务器要支持你的跨域,才能使用jsonp,否则将不能回调到success函数. 跨域的本质是利用script,img等支持跨域的标签来对非同域名的链接来进行访问. 所以如果想要跨域成功,那么需要在调用方支持跨域. 我自己负责的很多项目跨域是自己写的实现,所以调用跨域的方法都得使用我封装的形式,否则默认是支持不了跨域的. jQuery的jsonp也一样,没有服务器是天然支

bean-求大神帮我看下spring的问题

问题描述 求大神帮我看下spring的问题 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'service'

disk-求大神帮我运行这个代码,操作系统磁盘的直接读写。不知道错误的原因是不是因为没有软盘,

问题描述 求大神帮我运行这个代码,操作系统磁盘的直接读写.不知道错误的原因是不是因为没有软盘, #include //说明sdk的头文件 //#include"floppy.h" #include #include typedef struct disk //Disk是结构体指针 { HANDLE floppyDisk; DISK_GEOMETRY theSupportedGeometry; }*Disk; //以下为程序中用到的四个函数 Disk openfloppy(char dr

php 用户而验证-跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下

问题描述 跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下 <?php $auth=http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; <?php $url = "http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; $html = file_get_contents($

帮我看下下面的递归,跪求大神帮我详细解答一下。

问题描述 帮我看下下面的递归,跪求大神帮我详细解答一下. //数列1,1,2,3,5,8,13,21,34... ...求第n项 class FuncDemo11 { public static void main(String[] args) { System.out.println(getNData(8)); } public static int getNData(int n) { if(n==1||n==2) return 1; return getNData(n-1)+getNData