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

[复制链接]
版主
发表于 2017-5-15 21:07:19   2024 查看 0 回复 只看该作者 倒序浏览
分享
例说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;

只有小组成员才能发言,加入小组>>
46个成员聚集在这个小组 加入小组

创建小组步骤

关闭

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

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区