完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`例说FPGA连载100:双摄像头图像采集之ddr_avl_bridge.v模块代码解析
特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc 该模块用于衔接DDR2控制器IP核与用户逻辑,即两个video_ctrl.v模块产生的视频流通过该模块写入到DDR2存储器中,而DDR2存储器中的视频流又通过该模块送往lcd_driver.v模块,用于LCD的显示。该模块的功能框图如图20.7所示。该模块例化了两个DDR2写缓存FIFO,分别用于两路输入视频的数据流缓存;同时也例化了一个DDR2读出缓存FIFO,用于缓存VGA显示需要读取的DDR2数据。 图20.7 DDR2控制器桥接模块功能框图 由于输入视频为两路,而读出这些视频时,我们希望这两路视频同时显示在液晶屏的左右两侧,因此它的地址分配有一点技巧。我们的地址分配思路是这样的: 由于数据读写位宽为64bit,即4*16bit,因此我们一个地址对应的视频流像素点是4;DDR2读写的突发长度为8(即local_size = 8),因此我们主要控制地址位bit22-3,对应的像素点是32。由于视频流一行为640像素,那么20个bit22-3地址就可以存储一行的视频像素点数据。为了便于寻址,我们取32次突发传输地址作为一行的存储空间,虽然只是用了其中的20个地址。为了在读取视频流时,屏幕左右的两个视频行地址是紧挨着的地址,我们可以定义地址的bit8=0时,用于左侧视频的地址空间;bit8=1时,用于右侧视频的地址空间。这部分的代码如下所示。 //////////////////////////////////////////////////// //DDR读写地址信号产生 reg[22:0] local_w1addr,local_w2addr; //写DDR地址 reg[22:0] local_raddr; //读DDR地址 //读DDR地址产生 always @(posedge phy_clk or negedge local_rst_n) if(!local_rst_n) local_raddr <=23'd0; else if(rdfifo_clr_r[3])local_raddr <= 23'd0; else if(sddr_state == SDDR_RSOPRF)begin if(local_raddr[7:3] == 5'd19)begin local_raddr[7:3] <=5'd0; local_raddr[22:8] <=local_raddr[22:8]+1'b1; end else local_raddr[7:3] <=local_raddr[7:3]+1'b1; end //第一路视频写DDR地址产生 always @(posedge phy_clk or negedge local_rst_n) if(!local_rst_n) local_w1addr<= 23'd0; else if(pos_wrf1_clr) local_w1addr<= 23'd0; else if(sddr_state == SDDR_WSOP1)begin if(local_w1addr[7:3] == 5'd19)begin local_w1addr[7:3] <=5'd0; local_w1addr[22:8] <=local_w1addr[22:8]+2'b10; end else local_w1addr[7:3] <=local_w1addr[7:3]+1'b1; end //第二路视频写DDR地址产生 always @(posedge phy_clk or negedge local_rst_n) if(!local_rst_n) local_w2addr<= 23'h000100; else if(pos_wrf2_clr) local_w2addr<= 23'h000100; else if(sddr_state == SDDR_WSOP2)begin if(local_w2addr[7:3] == 5'd19)begin local_w2addr[7:3] <=5'd0; local_w2addr[22:8] <=local_w2addr[22:8]+2'b10; end else local_w2addr[7:3] <=local_w2addr[7:3]+1'b1; end wire[22:0] local_waddr = (sddr_state == SDDR_WRIT1) ? local_w1addr:local_w2addr; assign local_address = ((sddr_state == SDDR_WRIT1) || (sddr_state ==SDDR_WRIT2)) ? local_waddr:local_raddr; //DDR2地址赋值 assign local_size = 7'd8; ` |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
862个成员聚集在这个小组
加入小组4224 浏览 0 评论
特权同学 Verilog边码边学 Lesson01 Vivado下载与安装
2397 浏览 1 评论
玩转Zynq连载50——[ex69] FIR滤波器IP仿真实例
3980 浏览 2 评论
玩转Zynq连载49——[ex68] MT9V034摄像头的图像FFT滤波处理
4952 浏览 1 评论
玩转Zynq连载48——[ex67] Vivado FFT和IFFT IP核应用实例
4716 浏览 0 评论
1729浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-29 13:18 , Processed in 0.408939 second(s), Total 37, Slave 28 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号