在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3110|回复: 3

[原创] 例说FPGA连载100:双摄像头图像采集之ddr_avl_bridge.v模块代码解析

[复制链接]
发表于 2017-5-15 21:10:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
例说FPGA连载100:双摄像头图像采集之ddr_avl_bridge.v模块代码解析

特权同学,版权所有

配套例程和更多资料下载链接:

http://pan.baidu.com/s/1c0nf6Qc

1.jpg



该模块用于衔接DDR2控制器IP核与用户逻辑,即两个video_ctrl.v模块产生的视频流通过该模块写入到DDR2存储器中,而DDR2存储器中的视频流又通过该模块送往lcd_driver.v模块,用于LCD的显示。该模块的功能框图如图20.7所示。该模块例化了两个DDR2写缓存FIFO,分别用于两路输入视频的数据流缓存;同时也例化了一个DDR2读出缓存FIFO,用于缓存VGA显示需要读取的DDR2数据。

2.jpg

20.7 DDR2控制器桥接模块功能框图


由于输入视频为两路,而读出这些视频时,我们希望这两路视频同时显示在液晶屏的左右两侧,因此它的地址分配有一点技巧。我们的地址分配思路是这样的:

由于数据读写位宽为64bit,即4*16bit,因此我们一个地址对应的视频流像素点是4DDR2读写的突发长度为8(即local_size = 8),因此我们主要控制地址位bit22-3,对应的像素点是32。由于视频流一行为640像素,那么20bit22-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;






发表于 2018-4-24 13:37:58 | 显示全部楼层
谢谢分享
发表于 2018-10-27 11:30:23 | 显示全部楼层
谢谢分享
发表于 2018-11-19 22:29:53 | 显示全部楼层
回复 1# rousong1989


很好的资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-2-23 07:02 , Processed in 0.025335 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表