陕西 做网站的公司,网站开发与设计教程,视频营销模式有哪些,做网站前应该先出图文章目录 前言1.MIG IP核配置2.测试程序3.DDR应用4.传送门 前言 不论是DDR3颗粒还是DDR3内存条#xff0c;xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒#xff0c;记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介#xff0c;请查看前面文章xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介请查看前面文章链接在文末。本文提供了配套的工程源码链接在文末本文用的内存条为MT16KTF1G64HZ-1G6FPGA芯片为xc7k325tffg900 -2。请按照顺序循序渐进阅读本系列的文章。 1.MIG IP核配置
1.如无特殊说明配置保持与前述文章MIG IP核配置一致。第五页如图所示配置。其中①指DDR3颗粒的物理时钟例如一颗16bit位宽的DDR设置为400MHz则它的传输速度为每一个800MHzDDR双沿传输的原因周期传输16bit。这里时钟的范围受到FPGA芯片速度等级和型号的制约以及与内存条的支持速度也有关。如我用的内存条MT16KTF1G64HZ-1G6速度范围在1500ps-3000ps之间。②指的是用户时钟41的4指的是①设置的物理时钟。第③部分指的是类型选择内存条选择SODIMMs。④处是DDR3内存条的型号如果不在列表需要根据速度参数位宽大小找一个兼容的型号。⑤处勾选上mask后如果相应的管脚不连接会造成DDR3初始化失败。其余配置保持默认即可。 2.第六页 此处①代表参考时钟选择200MHz为固定大小。②处如果是内存条就选择RZQ/4如果是颗粒就选择RZQ/6。 3.DDR3颗粒要勾选DCI Cascade内存条不用勾选。后面就是选择引脚其他的都保持默认即可。
2.测试程序
如果需要修改这段程序需要注意MIG的接口各信号的位宽应该保持一致另外程序中设计了两个LED灯读写测试正确的时候指示灯led1常亮反之则闪烁。LED2只是容量当测试到所设置的容量的时候常量。代码中TEST_LENGTH指示的含义是突发次数也可以说是容量。每一次突发是512bit数据使用内存的容量除以512bit即为最大的突发次数。当然使用的芯片的物理位宽不同例如只有一片16bit位宽的DDR颗粒那一次突发的数据为8*16bit128bit那最大的突发次数就要用量除以128bit了。 module dimm_top(input sys_clk_p,input sys_clk_n, inout [63:0] ddr3_dq , inout [7:0] ddr3_dqs_n , inout [7:0] ddr3_dqs_p , output [15:0] ddr3_addr , output [2:0] ddr3_ba , output ddr3_ras_n , output ddr3_cas_n , output ddr3_we_n , output ddr3_reset_n , output [1:0] ddr3_ck_p , output [1:0] ddr3_ck_n , output [1:0] ddr3_cke , output [1:0] ddr3_cs_n , output [7:0] ddr3_dm , output [1:0] ddr3_odt , output reg led1, output reg led2 ); wire clk_rst; wire clk_200;reg [29:0] app_addr_begin0;wire app_en; //写命令使能wire [2:0] app_cmd; //用户读写命令wire app_wdf_wren; //DDR3写使能wire app_wdf_end; //突发写最后一个数标识wire [29:0] app_addr; //用户平面地址wire app_rdy; //设备接收准备就绪 wire app_wdf_rdy; //写响应wire [511:0] app_rd_data; //用户读数据wire app_rd_data_end; //突发读当前时钟最后一个数据wire app_rd_data_valid; //读数据有效wire [511:0] app_wdf_data; //用户写数据wire app_sr_active; //保留wire app_ref_ack; //刷新请求wire app_zq_ack; //ZQ 校准请求wire init_calib_complete; //校准完成信号wire ui_clk ; //用户时钟wire ui_clk_sync_rst; clk_wiz_0 u_clk_wiz_0(.clk_out1(clk_200), .reset(1b0), .locked(clk_rst), .clk_in1_p(sys_clk_p),.clk_in1_n(sys_clk_n));mig_7series_0 mig_JC (// Memory interface ports.ddr3_addr (ddr3_addr), // output [15:0] .ddr3_ba (ddr3_ba), // output [2:0].ddr3_cas_n (ddr3_cas_n), // output .ddr3_ck_n (ddr3_ck_n), // output [1:0] .ddr3_ck_p (ddr3_ck_p), // output [1:0] .ddr3_cke (ddr3_cke), // output [1:0] .ddr3_ras_n (ddr3_ras_n), // output .ddr3_reset_n (ddr3_reset_n), // output .ddr3_we_n (ddr3_we_n), // output .ddr3_dq (ddr3_dq), // inout [63:0] .ddr3_dqs_n (ddr3_dqs_n), // inout [7:0] .ddr3_dqs_p (ddr3_dqs_p), // inout [7:0] .init_calib_complete (init_calib_complete), // output .ddr3_cs_n (ddr3_cs_n), // output [1:0] .ddr3_dm (ddr3_dm), // output [7:0] .ddr3_odt (ddr3_odt), // output [1:0] // Application interface ports.app_addr (app_addr), // input [29:0] .app_cmd (app_cmd), // input [2:0] .app_en (app_en), // input .app_wdf_data (app_wdf_data), // input [511:0] .app_wdf_end (app_wdf_end), // input .app_wdf_wren (app_wdf_wren), // input .app_rd_data (app_rd_data), // output [511:0] .app_rd_data_end (app_rd_data_end), // output .app_rd_data_valid (app_rd_data_valid), // output .app_rdy (app_rdy), // output .app_wdf_rdy (app_wdf_rdy), // output .app_sr_req (1b0), // input .app_ref_req (1b0), // input .app_zq_req (1b0), // input .app_sr_active (app_sr_active), // output .app_ref_ack (app_ref_ack), // output .app_zq_ack (app_zq_ack), // output .ui_clk (ui_clk), // output用户时钟输出其实是通过IP配置自己配出来的 .ui_clk_sync_rst (ui_clk_sync_rst), // output .app_wdf_mask (64b0), // input [63:0] //写数据屏蔽.sys_clk_i (clk_200),//输入IP的时钟// Reference Clock Ports.clk_ref_i (clk_200),//参考时钟 .sys_rst (clk_rst) // input sys_rst);parameter TEST_LENGTH 27d134200000; //每一次突发是512bit 8GB可以支持134217728次突发 99.98%// parameter TEST_LENGTH 32d60000000;//**************1.先写后读状态机state machineparameter IDLE 2d0; parameter WRITE 2d1; parameter WAIT 2d2; parameter READ 2d3; reg [511:0]my_512_data;reg [26:0] wr_addr_cnt;reg [26:0] rd_addr_cnt;reg [1:0] state;always (posedge ui_clk or negedge rst_n) beginif((~rst_n)||(error_flag)) begin state IDLE; my_512_data 512d0; wr_addr_cnt 27d0; rd_addr_cnt 27d0; app_addr_begin 30d0; endelse if(init_calib_complete)begin //MIG IP核初始化完成case(state)IDLE:beginstate WRITE;my_512_data 512d0; wr_addr_cnt 27d0; rd_addr_cnt 27d0; app_addr_begin 30d0; endWRITE:beginif((wr_addr_cnt TEST_LENGTH-1) (app_rdy app_wdf_rdy))state WAIT; //写到设定的长度跳到等待状态else if(app_rdy app_wdf_rdy)begin //写条件满足my_512_data my_512_data 1; //写数据自增wr_addr_cnt wr_addr_cnt 1; //写计数自增app_addr_begin app_addr_begin 8; //DDR3 地址自增end else begin //写条件不满足保持当前状态my_512_data my_512_data; wr_addr_cnt wr_addr_cnt;app_addr_begin app_addr_begin; endendWAIT:begin state READ; //下一个时钟跳到读状态rd_addr_cnt 27d0; //读地址复位app_addr_begin 30d0; //DDR3读从地址0endREAD:begin //读到设定的地址长度 if((rd_addr_cnt TEST_LENGTH -1 ) app_rdy)state IDLE; //则跳到空闲状态 else if(app_rdy)begin //若MIG已经准备就绪,则开始读rd_addr_cnt rd_addr_cnt 1d1; //用户地址每次加一app_addr_begin app_addr_begin 8; //DDR3地址加8end else begin //若MIG没准备好,则保持原rd_addr_cnt rd_addr_cnt;app_addr_begin app_addr_begin; endenddefault:beginstate IDLE;my_512_data 512d0;wr_addr_cnt 27d0;rd_addr_cnt 27d0;app_addr_begin 30d0;endendcaseendend //**************2.根据状态机与MIG指示信号为app信号赋值assign app_en ((state WRITE (app_rdy app_wdf_rdy))||(state READ app_rdy)) ? 1b1:1b0; assign app_cmd (state READ) ? 3d1 :3d0; assign app_wdf_wren(state WRITE (app_rdy app_wdf_rdy)) ? 1b1:1b0;assign app_wdf_end app_wdf_wren; assign app_addr app_addr_begin;assign app_wdf_datamy_512_data; //*******************3.用户判错逻辑reg [26:0] rd_cnt;wire rst_n; //复位低有效reg error_flag;parameter L_TIME 28d200_000_000;reg [27:0] led_cnt; //led计数wire error; //读写错误标记assign rst_n ~ui_clk_sync_rst;//myrstalways (posedge ui_clk or negedge rst_n) beginif(~rst_n) rd_cnt 0; //若计数到读写长度且读有效地址计数器则?0 else if(app_rd_data_valid(rd_cnt TEST_LENGTH - 1))rd_cnt 0; //其他条件只要读有效每个时钟自增1else if (app_rd_data_valid)rd_cnt rd_cnt 1;end//判断错误读出数据应为计数递增数据assign error (app_rd_data_valid (rd_cnt!app_rd_data));always (posedge ui_clk or negedge rst_n) beginif(~rst_n)led20;else if(rd_cnt32d134200000-1)led21;end always (posedge ui_clk or negedge rst_n) beginif(~rst_n) error_flag 0;else if(error)error_flag 1;end//读写测试正确指示灯led1常亮反之则闪烁always (posedge ui_clk or negedge rst_n) beginif((~rst_n) || (~init_calib_complete )) beginled_cnt 28d0;led1 1b0;endelse beginif(~error_flag) //常亮代表正常闪烁代表故障 led1 1b1; else begin led_cnt led_cnt 28d1;if(led_cnt L_TIME - 1b1) beginled_cnt 25d0;led1 ~led1; end endendendendmodule3.DDR应用
DDR在FPGA系统中的作用主要是作为存储器使用用于存储数据和程序。DDR存储器通常被用作FPGA系统中的主存储器用于存储采集数据和中间结果。DDR3作为高速缓存与FPGA相连在不同领域均发挥着重要作用。在高性能计算领域DDR用于存储大规模数据集、模型参数、数据计算结果从而充分发挥FPGA并行计算的能力完成计算任务在图像处理领域用于匹配图像采集接口与传输接口之间的速度完成图像采集在通信领域DDR用于存储大量数据包实现数据的缓存和处理提高数据传输速度和处理效率。总之DDR在不同领域扮演着重要角色。以采集摄像头数据为例采用乒乓操作的思想是在DDR中开辟两块大小为1帧图像的缓冲区如果读取速度大于写入速度的时候需要采用乒乓操作的方式发挥DDR弹性缓冲的作用。往缓冲区写的时候1号缓冲区写满之后切换到2号缓冲区写2号写满之后在往1号去写如此往复 。由于读取速度大于写入速度因此读一定是在与当前写不同的另一块缓冲区去读在底层可能会对同一块缓冲区的数据读取很多次但是这并不影响人在视觉上对于画面流畅的影响。这就是通过乒乓操作实现了数据缓冲匹配了读写两端的速度。如下图所示 说明1.每一个bank存储一帧图像数据bank中每一行为图像的一行数据即每一次读写的突发长度是一行像素数据这个突发长度可以自己定义并不必须要是一行数据读和写彼此独立进行2.bank之间的切换由状态机实现由于读速度大于写速度则每写完一个bank切换另一个bank去写每读完一个bank判断当前写bank选择不同于写bank的bank进行读。3.由于读速度大于写速度因此永远不会发生冲突只是可能某一帧会被重复播放但在视频应用中这对用户的视觉不产生任何影响。同理如果是读的速度小于写的速度那让写操作刷新缓冲区即选择与读相排斥的缓冲区写让读操作按照顺序读即可。 上面描述的只是一种乒乓缓冲的思想实际操作中可以通过设置三缓存四缓存的方式让图像更为平滑。另外可以考虑基于这种思想为DDR写一个消息队列让DDR仲裁控制器的通用性和适配性更强。
4.传送门
我的主页FPGA通信接口专栏汇总导航DDR测试工程源码上一篇DDR(3)DDR3颗粒读写测试
END
文章原创首发于CSDN论坛。 欢迎点赞❤❤收藏⭐⭐打赏 欢迎评论区或私信指出错误❌提出宝贵意见或疑问❓。 文章转载自: http://www.morning.jsmyw.cn.gov.cn.jsmyw.cn http://www.morning.wbysj.cn.gov.cn.wbysj.cn http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.rqpgk.cn.gov.cn.rqpgk.cn http://www.morning.rglzy.cn.gov.cn.rglzy.cn http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.kjkml.cn.gov.cn.kjkml.cn http://www.morning.mypxm.com.gov.cn.mypxm.com http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn http://www.morning.cytr.cn.gov.cn.cytr.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.fnxzk.cn.gov.cn.fnxzk.cn http://www.morning.qcymf.cn.gov.cn.qcymf.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.rythy.cn.gov.cn.rythy.cn http://www.morning.nrftd.cn.gov.cn.nrftd.cn http://www.morning.frfnb.cn.gov.cn.frfnb.cn http://www.morning.kaylyea.com.gov.cn.kaylyea.com http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.bqyb.cn.gov.cn.bqyb.cn http://www.morning.mhnrx.cn.gov.cn.mhnrx.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.fqsxf.cn.gov.cn.fqsxf.cn http://www.morning.hqgkx.cn.gov.cn.hqgkx.cn http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn http://www.morning.wjjsg.cn.gov.cn.wjjsg.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.jrkzk.cn.gov.cn.jrkzk.cn http://www.morning.eshixi.com.gov.cn.eshixi.com http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.rhjhy.cn.gov.cn.rhjhy.cn http://www.morning.klzdy.cn.gov.cn.klzdy.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn http://www.morning.svtxeu.com.gov.cn.svtxeu.com http://www.morning.xkyqq.cn.gov.cn.xkyqq.cn http://www.morning.jncxr.cn.gov.cn.jncxr.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.rrhfy.cn.gov.cn.rrhfy.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.mjtft.cn.gov.cn.mjtft.cn http://www.morning.qbksx.cn.gov.cn.qbksx.cn http://www.morning.cgbgc.cn.gov.cn.cgbgc.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.mzrqj.cn.gov.cn.mzrqj.cn http://www.morning.c-ae.cn.gov.cn.c-ae.cn http://www.morning.amonr.com.gov.cn.amonr.com http://www.morning.dtlnz.cn.gov.cn.dtlnz.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.ryxdr.cn.gov.cn.ryxdr.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.rwlsr.cn.gov.cn.rwlsr.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.hmtft.cn.gov.cn.hmtft.cn http://www.morning.lmhwm.cn.gov.cn.lmhwm.cn http://www.morning.dmtwz.cn.gov.cn.dmtwz.cn http://www.morning.gcfrt.cn.gov.cn.gcfrt.cn http://www.morning.bctr.cn.gov.cn.bctr.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.gqwpl.cn.gov.cn.gqwpl.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.ktrzt.cn.gov.cn.ktrzt.cn http://www.morning.irqlul.cn.gov.cn.irqlul.cn http://www.morning.dpflt.cn.gov.cn.dpflt.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.ylsxk.cn.gov.cn.ylsxk.cn http://www.morning.knczz.cn.gov.cn.knczz.cn http://www.morning.sbwr.cn.gov.cn.sbwr.cn