搜索
bottom↓
回复: 2

FPGA读取ov7620摄像头问题

[复制链接]

出0入0汤圆

发表于 2014-7-23 18:44:35 | 显示全部楼层 |阅读模式

因为用的单片机主频50M, 与ov7620数据更新速率差不多, 想用FPGA做个buffer。

但是编译的时候提示:
Error (276003): Cannot convert all sets of registers into RAM megafunctions when creating nodes. The resulting number of registers remaining in design exceeds the number of registers in the device or the number specified by the assignment max_number_of_registers_from_uninferred_rams. This can cause longer compilation time or result in insufficient memory to complete Analysis and Synthesis

大意是不能把左右寄存器映射到RAM中。

我的代码主要思路是分成两部分, 写入和读取, 把任意部分注释掉都能正常编译。

读摄像头是在PCLK每次上升沿读8位并口数据,存入img寄存器。

单片机读取是MCUsignal高的时候(单片机给出),把新数据放到输出口。

后来发现, 把输出数据那句话, _CameraOutput = img_r[(out_line*320+out_column)]; 注释掉, 也能通过编译。


代码如下, 请问谁能解释一下是什么问题啊

module Camera(
        input        clk50M,
        input        rst_n,
        output reg        test_signal,
        //input part
        input        VSYN,
        input        HREF,
        input        PCLK,
        input[7:0] CameraInput,
        //output part
        output[7:0]        CameraOutput,
        input        MCUSignal,
        input MCUrst);

reg[7:0]        count;
wire        clk100M;
PLL m1(
                .inclk0(clk50M),
                .c0(clk100M));

//test part test_signal is 5MHz
always @(posedge clk100M)
begin
        if(!rst_n)        count <= 8'h00;
        else if(count == 8'd9)
        begin
                count = 8'd00;
                test_signal <= test_signal^1'b1;
        end
        else                count <= count + 1;
end

//***************input part***************
reg[9:0]        line;
reg[9:0]        column;
reg[7:0]        img[76800];
reg        line_changed;
reg        column_changed;

always @(posedge clk100M)
begin
        if(!rst_n)                                //reset
        begin
                line = 0;
                column = 0;
                line_changed = 0;
                column_changed = 0;
        end
        else if(VSYN)                        //VSYNt= 1 reset
        begin
                line = 16'b0;
                column = 16'b0;
        end
        else if(!HREF)                        //HREF = 0 change line
        begin
                if(!line_changed)        //line hasn't been changed
                begin
                        line = line + 1;
                        line_changed <= 1;
                end
        end
        else                                                //HREF = 1 change line next time
        begin
                line_changed <= 0;
                if(PCLK)                                //PCLK = 1 read data
                begin
                        if(line[0] == 0)
                        begin
                                img[(line*320+column)] = CameraInput;
                        end
                        if(!column_changed)                //column hasn't been changed
                        begin
                                column = column + 1;
                                column_changed <= 1;
                        end
                end
                else                                        //PCLK=0 change column next time
                begin
                        column_changed <= 0;
                end
        end
end

//********************output part********************
reg[9:0]        out_line;
reg[9:0]        out_column;
reg[7:0]        _CameraOutput;
assign CameraOutput = _CameraOutput;
reg        data_transferred;
reg[7:0]        img_r[76800];

always @(posedge clk100M)
begin
        if(!MCUrst)
        begin
                out_line = 0;
                out_column =0;
                data_transferred = 0;
        end
        else if(MCUSignal)                //signal is high, transfer data
        begin
                if(!data_transferred)
                begin
                        if(!out_line[0])
                        begin
                                _CameraOutput = img_r[(out_line*320+out_column)];
                        end
                        out_column = out_column + 1;
                        if(out_column >= 640)
                        begin
                                out_line = out_line + 2;
                                out_column = 0;
                        end
                        if(out_line >= 240)
                        begin
                                out_line = 0;
                        end
                        data_transferred <= 1;
                end
        end
        else                        //MCUrst = 0 , transfer next time
        begin
                img_r[(out_line*320+out_column)] <= img[(out_line*320+out_column)];
                data_transferred <= 0;
        end
end

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-7-24 07:32:27 来自手机 | 显示全部楼层
用的ram数量超过芯片容量,换个大点容量的片子试试

出0入0汤圆

 楼主| 发表于 2014-7-24 15:45:04 | 显示全部楼层
ctqvsly 发表于 2014-7-24 07:32
用的ram数量超过芯片容量,换个大点容量的片子试试

那句话只是读取ram里面的值, 并不占用资源啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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