FPGA的a_7系列芯片对ddr3的控制
1.原理图——————这次设计的数据流是产生数据的模块是image-ctrl模块、ddr3控制模块、hdmi-buffer、vga-ctrl模块、以及hdmi转换模块。
该模块的有2个操作始终,其中vga_clk 65M是用来产生数据的,ui_clk为ddr3控制模块的写入数据与地址的时钟,跨时钟域数据传输将32bit的图像数据转换为128bit的数据。rd_en信号的产生是由image-fifo的读出计数器产生的。而参数为何是14是因为当ddr3中存在16个数据时,对应的fifo 读出来的计数是14因而参数为14。
这是ddr3的整个模块的控制信号,信号过多,因此在程序中做了详细介绍。
这是hdmi-buffer的控制模块,是将ddr3存储的数据读出来,然后数据传给vga模块,最终通过hdmi-ctrl将数据转换为差分信号,再以单bit形式显示在显示器上。
2.关键程序
`timescale 1ns / 1psmodule ddr3_bank_ctrl(input wire ui_clk_sync_rst , //经过ddr3 ip核后产生的高有效复位信号①input wire ui_clk , //经过ddr3 产生的100M时钟②input wire calib_complete , //calib_done③input wire rd_data_valid , //ddr3输出的有效数据使能信号④output wire ddr3_app_en , //ddr3的命令使能信号⑤input wire app_rdy , //ddr3输入的读准备信号⑥output wire[2:0] app_cmd , //读写命令控制⑦output wire[27:0] out_addr , //输入到ddr3的地址⑧output wire app_wdf_wren , //写使能信号⑨input wire app_wdf_rdy , //ddr3输入的写准备信号⑩output wire[127:0] out_data , //输入到ddr3的数据①//input wire clk_125M , //输入到读写fifo的数据使能时钟②input wire wf_wren , //输入到写fifo的地址数据使能信号③input wire[127:0] data_in , //输入写fifo的数据④input wire[31:0] data_addr , //输入写ffio的地址⑤ output wire app_wdf_end , //ddr3对应的写结束信号⑥output wire[15:0] app_wdf_mask , //ddr3的掩码⑦input wire [31 : 0] rd_addr , //输入到读fifo的地址input wire [127 : 0] ddr3_out_data , //ddr3输出的数据最终输入到读数据的fifooutput wire [8 : 0] rdfifo_cnt , //fifo缓存的数据计数output wire [127 : 0] rdfifo_data , //fifo最终输出的数据input wire rd_fifo_en_data , //fifo最终输出的数据的使能信号input wire rd_fifo_en );reg wdfl_detect ; //是wdfL
reg rdfl_detect ; //读数据监测
reg write_cycle ; //写循环
reg read_cycle ; //读循环
reg [3:0] ddr3_burst_cnt ; //写完成16计数
reg [3:0] rdddr3_burst_cnt; //读完成16计数
wire [8 : 0] wdfl_rd_cnt ;
wire [8 : 0] rdf1_rd_cnt ;
wire [3:0] rc_data ;
wire [3:0] rd_data ;
wire [27:0] WR_addr ;
wire [27:0] RD_addr ;
wire rdflcmd_rd_en ;
reg [2:0] state ;
parameter IDLE = 3'b001 ;
parameter WRITE = 3'b010 ;
parameter READ = 3'b100 ;assign app_wdf_mask = 16'd0;
assign app_wdf_wren = app_wdf_rdy&write_cycle&app_rdy; //写数据使能
assign app_wdf_end = app_wdf_wren;
assign rdflcmd_rd_en = read_cycle&app_rdy;
assign ddr3_app_en = (write_cycle)?app_wdf_wren:rdflcmd_rd_en; //ddr3的使能信号
assign app_cmd = (state==READ)?3'b001:3'd0;
assign out_addr = (state==WRITE)?WR_addr:RD_addr;
always@(posedge ui_clk)if(ui_clk_sync_rst)state<=IDLE;else case (state)IDLE: if(calib_complete==1)state<=WRITE;WRITE: if((wdfl_rd_cnt<14&&wdfl_detect==1)||(ddr3_burst_cnt==15&&app_wdf_wren==1))state<=READ;READ: if((rdf1_rd_cnt<14&&rdfl_detect==1)||(rdddr3_burst_cnt==15&&rdflcmd_rd_en==1&&app_rdy==1))state<=WRITE;default: state<=IDLE; endcasealways@(posedge ui_clk)if(ui_clk_sync_rst)wdfl_detect<=1'b0;else if((calib_complete==1&&state==IDLE )||((rdf1_rd_cnt<14&&rdfl_detect==1)||(rdddr3_burst_cnt==15&&rdflcmd_rd_en==1&&app_rdy==1)))wdfl_detect<=1'b1;else wdfl_detect<=1'b0;always@(posedge ui_clk)if(ui_clk_sync_rst) rdfl_detect<='d0;else if ((wdfl_rd_cnt<14&&wdfl_detect==1)||(ddr3_burst_cnt==15&&app_wdf_wren==1))rdfl_detect<=1'b1;else rdfl_detect<='d0;always@(posedge ui_clk)if(ui_clk_sync_rst)write_cycle<=1'b0;else if(app_wdf_wren == 1&& ddr3_burst_cnt==15) //write_cycle<=1'b0;else if(wdfl_detect==1'b1&&wdfl_rd_cnt>=14)write_cycle<=1'b1;always@(posedge ui_clk)if(ui_clk_sync_rst)ddr3_burst_cnt<='d0;else if(ddr3_burst_cnt==15 && write_cycle == 1)ddr3_burst_cnt<='d0;else if(app_wdf_wren==1)ddr3_burst_cnt<=ddr3_burst_cnt+1'b1;always@(posedge ui_clk)if(ui_clk_sync_rst)read_cycle<=1'b0;else if(rdflcmd_rd_en == 1&& rdddr3_burst_cnt==15) //read_cycle<=1'b0;else if(rdfl_detect==1'b1&&rdf1_rd_cnt>=14)read_cycle<=1'b1;always@(posedge ui_clk)if(ui_clk_sync_rst) rdddr3_burst_cnt<='d0;else if(rdddr3_burst_cnt==15&&read_cycle==1&&app_rdy==1)rdddr3_burst_cnt<='d0;else if(read_cycle==1&&app_rdy==1) rdddr3_burst_cnt<=rdddr3_burst_cnt+1'b1; fifo_generator_512 fifo_generator_512_inst (.wr_clk(ui_clk), // input wire wr_clk.rd_clk(ui_clk), // input wire rd_clk.din(data_in), // input wire [127 : 0] din.wr_en(wf_wren), // input wire wr_en.rd_en(app_wdf_wren), // input wire rd_en 展示忘记了.dout(out_data), // output wire [127 : 0] dout.full(), // output wire full.empty(), // output wire empty.rd_data_count(wdfl_rd_cnt) // output wire [8 : 0] rd_data_count
);fifo_cmd_256_32 fifo_cmd_256_32_inst (.wr_clk(ui_clk), // input wire wr_clk.rd_clk(ui_clk), // input wire rd_clk.din(data_addr), // input wire [31 : 0] din.wr_en(wf_wren), // input wire wr_en.rd_en(app_wdf_wren), // input wire rd_en.dout({rc_data,WR_addr}), // output wire [31 : 0] dout.full(), // output wire full.empty() // output wire empty
);rd_data_128_512 rd_data_128_512_inst (.wr_clk(ui_clk), // input wire wr_clk.rd_clk(ui_clk), // input wire rd_clk.din(ddr3_out_data), // input wire [127 : 0] .wr_en(rd_data_valid), // input wire wr_en.rd_en(rd_fifo_en_data), // input wire rd_en.dout(rdfifo_data), // output wire [127 : 0] dout.full(), // output wire full.empty(), // output wire empty.rd_data_count(rdfifo_cnt) // output wire [8 : 0] rdfifo_cnt
);rcmd_fifo_32_512 rcmd_fifo_32_512_inst (.wr_clk(ui_clk ), // input wire wr_clk.rd_clk(ui_clk ), // input wire rd_clk.din (rd_addr ), // input wire [31 : 0] rd_addr.wr_en(rd_fifo_en ), // input wire wr_en.rd_en(rdflcmd_rd_en), // input wire rd_en.dout({rd_data,RD_addr}), // output wire [31 : 0] dout.full(), // output wire full.empty(), // output wire empty.rd_data_count(rdf1_rd_cnt) // output wire [8 : 0] rdf1_rd_cnt
);
endmodule
3.仿真结果
最终数据以当行计数拉高的时候,显示四组0-255。
4.中秋节快乐
FPGA的a_7系列芯片对ddr3的控制相关推荐
- 奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED
奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江 ...
- vertex系列芯片和zynq系列芯片结构的异同_使用ZYNQ实现复杂嵌入式系统,真的好用!...
[导读] 基于ZYNQ实现复杂嵌入式系统非常便利,其应用领域也越来越广泛,本文来从对ZYNQ芯片架构的理解来谈谈个人体会. 俯瞰zynq ZYNQ主要由两大部分组成: 处理系统PS(Processin ...
- [转帖]你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下)
你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下) https://www.ijiwei.com/html/news/newsdetail?source=pc&news_id=7177 ...
- FPGA 之 SOPC 系列(二)SOPC开发流程及开发平台简介
今天给大侠带来今天带来FPGA 之 SOPC 系列第二篇,SOPC开发流程及开发平台简介相关内容,希望对各位大侠的学习有参考价值,话不多说,上货. 本篇首先详细介绍了SOPC开发的基本流程,然后通过实 ...
- FPGA 之 SOPC 系列(一)
今天给大侠带来今天带来FPGA 之 SOPC 系列第一篇,SOPC概述,希望对各位大侠的学习有参考价值,话不多说,上货. 概述 + 在开始今天第一篇之前,让我们一起来看一些相关名词的解释,以方便后续更 ...
- FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比
FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比 今天给大侠带来今天带来FPGA 之 SOPC 系列第九篇,同时也是最后一篇,SOPC 补充:altera与xilinx ...
- FPGA 之 SOPC 系列(六)Nios II 程序开发 II
FPGA 之 SOPC 系列(六)Nios II 程序开发 II 今天给大侠带来今天带来FPGA 之 SOPC 系列第六篇,Nios II 程序开发 II,希望对各位大侠的学习有参考价值,话不多说,上 ...
- FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建
FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建 今天给大侠带来今天带来FPGA 之 SOPC 系列第四篇,NIOS II 外围设备--标准系统搭建,希望对各位大侠的学习有参 ...
- qphy-ddr3自动化测试软件包,DDR测试系列之四----漫话DDR3
原标题:DDR测试系列之四----漫话DDR3 简介 DDR3(double-data-rate three synchronous dynamic random access memory)是应用在 ...
最新文章
- 程序员面试题精选100题(03)-子数组的最大和[算法]
- Android SnackBar:你值得拥有的信息提示控件
- Linux 中 ss 命令的使用实例介绍
- elasticsearch api中的Delete By Query API操作
- spss数据预处理步骤_数据处理之剔除无效问卷
- java foreach跳出本次循环_Java中提供三种常用的循环语句
- template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
- Keepalived配置文件详解
- ACM 2018 Fellow名单公布:李飞飞等多位华人入选,无国内成员
- 在Linux上将视频转换成动态gif图片 (附:ffmpeg和ImageMagick安装方法)
- bzoj 1056 1862: [Zjoi2006]GameZ游戏排名系统(Treap+Hash)
- eclipse 使用问题
- 用计算机弹出古诗,电脑屏保不断变化的诗句
- js中函数的this指向
- 【Java书笔记】:《Redis 深度历险:核心原理和应用实践》分布式锁,延时队列,位图,HyperLogLog,布隆过滤器,漏斗限流,GeoHash,Scan,管道,事务,主从,Redis源码
- Kiosk模式是什么?win10如何启用Kiosk模式?
- 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc
- 基因表达式编程(GEP)自学 第【3】天 Python 实现
- 腾讯企业邮箱不能发送短信认证
- CCF 难题汇总(2013-2019 持续更新)
热门文章
- 【微信小程序】canvasToTempFilePath遇到的问题
- 王者荣耀3月31日服务器维护,王者荣耀3月31日更新失败解决方法一览
- [Python GUI]DearPyGui搭建、你好、打包
- 阿里云windows ftp 200 Type set to A. 227 Entering Passive Mode
- kafka消息队列系统
- day06 - Python - 面向对象
- Python入门初学者“百钱买百鸡”问题
- Leetcode练习 Python3实现(持续更新)
- IT公司存在的一些问题
- JavaScript利用正则表达式来禁止键盘输入数字