【精品博文】加班猫:AC701的DDR3测试读写(2)

这个是文章的开头,前些日子去面试,面试的人说,我没用过V6芯片,S10芯片是不是档次太低了。

如今我在fpga行业已经待了快6年时光,这6年时光,感觉到fpga路子越来越窄的趋势。然后今年我忽然觉得,fpga 只是一种工具,一个人没有必要局限一个工具的。你用高档的10G示波器,用100M示波器,只是用来测试信号的。何必在意一个工具的使用问题。没用V6和S10就不牛逼了?笑死。

最重要是你自己对行业的认知和行业的积累。话说你搞图像,用DSP也好,PC也好,安卓系统也好。只要你知道基本原理都不是事情。你懂基本算法和实现基本过程,你的工资永远大于那些只懂v6使用芯片傻逼要值钱的。

话说回来,我写这些博客不都是为了一个开发板而已,或者单独为了一个A7芯片?不是的。我只是通过这个博客来教会大家使用fpga基本接口而已。这些接口基本设计要求交给大家,这个才是你设计的中心点的。fpga基本功就是懂基本接口的设计。既然是工具,知道使用就行了。何必在意工具的牌子呢?

所以,希望你们不要闭着眼睛去瞎学东西,怎么搞fpga才叫牛逼,不是芯片的事情,是你行业的经验。比如搞拼接显示的fpga ,基本知道缩放,插值,融合边缘,锐化操作。LED行业,你要熟悉基本LED刷新操作,怎么提高亮度,降低闪屏问题。

以上都是废话。

这些接口知识,以后会开个fpga接口培训班,专门讲接口。比如PCIE,以太网(千兆,万兆),DDR3(DDR2,SDRAM,SRAM),USB3.0(USB2.0),SATA2.0,HDMI(DVI,VESA),SPI,UART,I2C,MIPI。至于时间和地点,估计得明年三月份后,请大家关注博客最新的消息。或者加加班猫的QQ 393597601。

上节说到DDR3的控制器,要注意的是,给用户接口是只有这些接口:

//Application interface ports .app_addr (app_addr), .app_cmd (app_cmd), .app_en (app_en), .app_wdf_data (app_wdf_data), .app_wdf_end (app_wdf_end), .app_wdf_wren (app_wdf_wren), .app_rd_data (app_rd_data), .app_rd_data_end (app_rd_data_end), .app_rd_data_valid (app_rd_data_valid), .app_rdy (app_rdy), .app_wdf_rdy (app_wdf_rdy), .app_sr_req (1'b0), .app_ref_req (1'b0), .app_zq_req (1'b0), .app_sr_active (app_sr_active), .app_ref_ack (app_ref_ack), .app_zq_ack (app_zq_ack), .ui_clk (dram_clk), .ui_clk_sync_rst (dram_rst), .app_wdf_mask (app_wdf_mask),

app_addr[ADDR_WIDTH – 1:0] 是ddr3的地址,精确到每个col地址,但是因为实际突发长度要求8所以每个数据都是4位开始。app_cmd[2:0]是命令,其实就两种,3'b001是读,3'B000是写。app_en是命令输入使能信号。

app_wdf_data这个是写入数据,发现是不是地址的DQ信号的八倍长度?所以每一次都是写入8个数据。app_wdf_end是指示一个数据8个长度有效信号,否则你不用这个信号,表示无效8个数据输入。很奇葩xilinx这么做。可能为了兼容stratic模式。app_wdf_wren数据有效输入。app_wdf_rdy表示写入数据的fifo中可以写入信号。这个信号也就是传说中的fifo的满信号。

app_rd_data读取的数据。app_rd_data_end表示该数据是8个有效数据。app_rd_data_valid数据有效指令。配合app_rd_data_end&app_rd_data_valid才能得到正确有效的数据。

app_addr[ADDR_WIDTH – 1:0] 是ddr3的地址,精确到每个col地址,但是因为实际突发长度要求8所以每个数据都是4位开始。app_cmd[2:0]是命令,其实就两种,3'b001是读,3'B000是写。app_en是命令输入使能信号。

AET代码编辑器真的好蛋疼啊。AET主要是FPGA和mcu为主的论坛和博客,上面代码语言没有verilog和VHDL有没有搞错啊。废话不说了。

操作DDR3的时候,首选是等待init_calib_complete 拉高电平。

以下DDR3的写入数据代码,注意,这个是写入过程。首先是从外部读取一个数据,然后观察app_wdf_rdy是否高电平,然后写入数据。app_wdf_end<=1'b1 ,app_wdf_wren<=1'b1; 写完成了,继续观察 app_wdf_rdy是否高电平。如果为高电平,释放app_wdf_end<=1'b0 ,app_wdf_wren<=1'b0; 使用手册中信号hold的意思就是上述的过程,发出信号的时候,必须app_wdf_rdy在高电平的时候。

以app_wdf前缀都是写入fifo的数据通道,在任何DDR的控制器数据和命令都是分离的。有的人经常问SDRAM为啥那么多时序要求,怎么看数据和命令的关系,数据的时序是数据和数据的之间的时间,命令的时序是跟命令有关系,所以经常看时序图发现,发送行激活的命令,但是看数据通道是输出的数据。因为SDRAM数据通道和命令通道是分离的。

app_cmd 是发送指令,写入指令3'B000,写入DDR3的数据内容。 if( app_rdy==1'b1) app_en<=1'b1; 如果 app_rdy状态为1,使能命令app_en。写完该命令,再次观察app_rdy是否为1,如果1就释放app_en信号。

case(wrfifo_rd_number) 0:begin wrfifo_rd_number <=1; dram_wr_fifo_rd <=1'b1; end 1: begin wrfifo_rd_number <=2; dram_wr_fifo_rd <=1'b0; end 2:begin dram_wr_fifo_rd <=1'b0; if (app_wdf_rdy ==1'b1) ////发送一次 begin app_wdf_end <= 1'b1; app_wdf_wren <= 1'b1; app_wdf_data <= dram_wr_fifo_rd_data; wrfifo_rd_number <=3; end end 3:begin if (app_wdf_rdy ==1'b1) ////发送一次 begin app_wdf_end <= 1'b0; app_wdf_wren <= 1'b0; wrfifo_rd_number <=4; end end 4:begin app_cmd <=DDR3_WRITE_CMD;///// 写入命令 app_addr <= {dram_wr_row_couter[11:0],dram_wr_col_couter[10:0],3'b000}; if( app_rdy==1'b1) begin app_en<=1'b1; wrfifo_rd_number <=5; end else app_en<=1'b0; end 5:if(app_rdy==1'b1) ///////////等待 app_rdy为高电平,否则继续hold写入信号。 begin app_en<= 1'b0; wrfifo_rd_number <=0; dram_work_state <= dram_work_wait_wr_over; end default:

上述是写入过程,再看下读取数据通道,方式有点类型,只不过不需要读取外部的数据。先等到app_rdy是否正常,然后发送读请求。发送读信号,继续观察app_rdy是否正常 ,然后发现是高电平就释放app_rdy信号。

dram_work_wait_rd : begin if(dram_rd_row_couter== out_image_row_counters) begin dram_work_state<=dram_work_rd_addr_zero;//输出场信号是否为0 end else if(dram_rd_fifo_full_flag!=1'b1) ///没有满的情况下 begin app_cmd<=DDR3_READ_CMD; app_addr <={dram_rd_row_couter[11:0],dram_rd_col_couter[10:0],9'd000}; if(app_rdy==1'b1) begin dram_work_state<= dram_work_wait_rd_over; app_en <= 1'b1; end else begin app_en <= 1'b0; end end else begin dram_work_state<= dram_work_wait_wr; end enddram_work_wait_rd_over: begin if(app_rdy==1'b1) ///////////等待 app_rdy为高电平,否则继续hold写入信号。 begin app_en <= 1'b0; dram_work_state<=dram_work_rd_addr_change; end end

有人肯定要问了。怎么知道写入了。等app_rd_data_end 和app_rd_data_valid为高电平的时候就写入数据。有人肯定会担心这些发送写和读命令不会工作,但是fpga这些IP只要上述时序是正常,都会工作的。所以不用客户去关心app_rd_data_valid是否执行。

sdram_fifo_512b_64b_1024sdram_rd_fifo_xilinx(.rst(1'b0), //高电平有效.wr_clk(dram_clk),.wr_en(app_rd_data_end&app_rd_data_valid),.din(app_rd_data[511:0]),.wr_data_count(dram_rd_fifo_count),.rd_clk(hdmi_data_rd_clk),.rd_en(hdmi_rd_fifo_rd_en),.dout(hdmi_rd_fifo_rd_64data),.full(hdmi_rd_fifo_rd_full),.empty(hdmi_rd_fifo_rd_empty),.rd_data_count());

(0)

相关推荐

  • DRAM内存价格创下18个月来新高,还要继续涨

    受移动及服务器内存影响,2016年桌面级DRAM内存价格也跟着水涨船高,4GB单条都要200多了,当初白菜价内存的好日子已经没了.从追踪的数据来看,4Gb DDR4颗粒的价格已经涨到了3.3美元以上, ...

  • 三星电子开始采用EUV技术批量生产14纳米DRAM芯片

    10月12日消息,据外媒报道,全球最大存储芯片制造商三星电子周二宣布,该公司开始使用极紫外光刻(EUV)技术批量生产业界最小的14纳米DRAM芯片,这有助于其巩固在存储行业的领导地位. 继去年3月出货 ...

  • vivado下ddr3的读写和测试详解

    最近博主在根据例程做ddr3的读写测试,发现根本看不到好吧,虽然之前博主做过SDRAM的读写测试,但是ddr3更加复杂,时序写起来很吃力,所以需要用到vivado下自带的ip核.具体来看下面例化过程: ...

  • Verilog HDL-同步技术

    同步技术在芯片设计中,数据同步和在不同时钟域之间进行数据传输会经常出现.为避免任何差错.系统故障和数据破坏,正确的同步和数据传输就显得格外重要.这些问题的出现往往比较隐蔽,不易被发现,因此正确进行跨时 ...

  • “火了”两年多之后,DRAM内存价格今年可能大跌40%

    这几年来全球PC市场一直被爆下滑,但在这样的逆境中,内存厂商相对来说过了几年舒坦日子.2011年的一场泰国洪水,让硬盘价格持续居高不下:2013年海力士无锡工厂的一把大火,那段时间内存价格真是&quo ...

  • 深科技:具备最新一代 DRAM 产品封测能力,推动 DDR5、LPDDR5 开发

    2021/4/8 9:02:07 来源:IT之家 作者:问舟 责编:问舟 IT之家 4 月 8 日消息 成立于 1985 年.以研发和生产硬盘磁头产品起家深耕存储领域 36 年的深科技是国内唯一具有从 ...

  • 美光计划于年内发售HBM2 DRAM,同时将开始DDR5试样

    作为三大DRAM供应商之一的美光将他们的HBM2搁置了很久,目前的市场上,SK海力士和三星都已经推出了HBM2产品,甚至已经发展了多代.不过美光在最近的财务会议上面透露,他们将会在年内发售HBM2显存 ...

  • 【精彩博文】AC701的DDR3测试读写(1)

    今天是重阳节,所以提前祝福重阳节快乐.因为DDR3讲解内容比较多,所以分解成3节进行讲解.一个做FPGA的人如果不懂DDR3,Serdes,那基本等于没学习fpga.所以必须掌握ddr控制器才能深入f ...

  • 【精品博文】加班猫告诉你什么叫FPGA时序约束

    关于FPGA时序文章很多. 这个世界总有有些人天天跟你背书背的知识,如果你问他深层次的问题,他根本不知道为什么. 但中国这个技术环境,貌似赚钱跟技术深入没啥多大的关系.随便学习下安卓开发,就能拿个二三 ...

  • 【精品博文】DDR3中的ODT同步模式详解

    昨天简单介绍了一下DDR3的ODT的作用,今天来详细聊一聊ODT的几种操作模式,首先是ODT的同步操作模式,这也时使用最多,最常用的模式. 之前的博文:聊一聊DDR3中的ODT如下 http://bl ...

  • 【精品博文】聊一聊DDR3中的ODT

    ODT是什么鬼?为什么要用ODT?在很多关于DDR3的博文和介绍中都没有将清楚.在查阅了很多资料并仔细阅读DDR3的官方标准(JESD79-3A)之后,总算有点了头绪,下面来整理整理. 1.首先ODT ...

  • 【精品博文】DDR扫盲——DDR3基础知识

    Burst Length为固定的BC4和BL8,它们在"on the fly"能够和读命令或者写命令通过A12/BC引脚进行选择. RL为总的读取潜伏期,其被定义为Additive ...

  • 【精品博文】DDR扫盲——DDR与DDR2、DDR3的区别

    DDR2与DDR的区别 1.速率与预取量 DDR2的实际工作频率是DDR的两倍,DDR2内存拥有两倍于标准DDR内存的4bit预期能力. 2.封装与电压 DDR封装为TSOPII,DDR2封装为FBG ...

  • 【精品博文】FPGA器件预布线,以及ddr3调试问题汇总与总结

    最近公司有一个新项目,方案定的是一款Cyclone V Soc FPGA,用到了两个ddr3,一个挂在Qsys系统的HPS里面,一个挂在Logic的Hard Memory Controller那里,这 ...

  • 【精品博文】配置编译 及测试QT/Embedded 环境

    QT/Embedded 通过Qt API 与Linux I/O 设施直接交互,成为嵌入式linux 端口.同Qt/X11 相比, QT/Embedded 很节省内存,其不需要一个X 服务器或是Xlib ...

  • 【精品博文】闲聊代码测试

    最近时不时和TL聊一些怎么提高开发效率的东西,不是说具体而微的技术,大都是抽象层面的,包括软件的maintainence.FCI(function component implementation). ...