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的控制相关推荐

  1. 奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED

    奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江 ...

  2. vertex系列芯片和zynq系列芯片结构的异同_使用ZYNQ实现复杂嵌入式系统,真的好用!...

    [导读] 基于ZYNQ实现复杂嵌入式系统非常便利,其应用领域也越来越广泛,本文来从对ZYNQ芯片架构的理解来谈谈个人体会. 俯瞰zynq ZYNQ主要由两大部分组成: 处理系统PS(Processin ...

  3. [转帖]你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下)

    你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下) https://www.ijiwei.com/html/news/newsdetail?source=pc&news_id=7177 ...

  4. FPGA 之 SOPC 系列(二)SOPC开发流程及开发平台简介

    今天给大侠带来今天带来FPGA 之 SOPC 系列第二篇,SOPC开发流程及开发平台简介相关内容,希望对各位大侠的学习有参考价值,话不多说,上货. 本篇首先详细介绍了SOPC开发的基本流程,然后通过实 ...

  5. FPGA 之 SOPC 系列(一)

    今天给大侠带来今天带来FPGA 之 SOPC 系列第一篇,SOPC概述,希望对各位大侠的学习有参考价值,话不多说,上货. 概述 + 在开始今天第一篇之前,让我们一起来看一些相关名词的解释,以方便后续更 ...

  6. FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比

    FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比 今天给大侠带来今天带来FPGA 之 SOPC 系列第九篇,同时也是最后一篇,SOPC 补充:altera与xilinx ...

  7. FPGA 之 SOPC 系列(六)Nios II 程序开发 II

    FPGA 之 SOPC 系列(六)Nios II 程序开发 II 今天给大侠带来今天带来FPGA 之 SOPC 系列第六篇,Nios II 程序开发 II,希望对各位大侠的学习有参考价值,话不多说,上 ...

  8. FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建

    FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建 今天给大侠带来今天带来FPGA 之 SOPC 系列第四篇,NIOS II 外围设备--标准系统搭建,希望对各位大侠的学习有参 ...

  9. qphy-ddr3自动化测试软件包,DDR测试系列之四----漫话DDR3

    原标题:DDR测试系列之四----漫话DDR3 简介 DDR3(double-data-rate three synchronous dynamic random access memory)是应用在 ...

最新文章

  1. 程序员面试题精选100题(03)-子数组的最大和[算法]
  2. Android SnackBar:你值得拥有的信息提示控件
  3. Linux 中 ss 命令的使用实例介绍
  4. elasticsearch api中的Delete By Query API操作
  5. spss数据预处理步骤_数据处理之剔除无效问卷
  6. java foreach跳出本次循环_Java中提供三种常用的循环语句
  7. template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
  8. Keepalived配置文件详解
  9. ACM 2018 Fellow名单公布:李飞飞等多位华人入选,无国内成员
  10. 在Linux上将视频转换成动态gif图片 (附:ffmpeg和ImageMagick安装方法)
  11. bzoj 1056 1862: [Zjoi2006]GameZ游戏排名系统(Treap+Hash)
  12. eclipse 使用问题
  13. 用计算机弹出古诗,电脑屏保不断变化的诗句
  14. js中函数的this指向
  15. 【Java书笔记】:《Redis 深度历险:核心原理和应用实践》分布式锁,延时队列,位图,HyperLogLog,布隆过滤器,漏斗限流,GeoHash,Scan,管道,事务,主从,Redis源码
  16. Kiosk模式是什么?win10如何启用Kiosk模式?
  17. 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc
  18. 基因表达式编程(GEP)自学 第【3】天 Python 实现
  19. 腾讯企业邮箱不能发送短信认证
  20. CCF 难题汇总(2013-2019 持续更新)

热门文章

  1. 【微信小程序】canvasToTempFilePath遇到的问题
  2. 王者荣耀3月31日服务器维护,王者荣耀3月31日更新失败解决方法一览
  3. [Python GUI]DearPyGui搭建、你好、打包
  4. 阿里云windows ftp 200 Type set to A. 227 Entering Passive Mode
  5. kafka消息队列系统
  6. day06 - Python - 面向对象
  7. Python入门初学者“百钱买百鸡”问题
  8. Leetcode练习 Python3实现(持续更新)
  9. IT公司存在的一些问题
  10. JavaScript利用正则表达式来禁止键盘输入数字