打印
[FPGA]

请指教,到底是我设计有问题,还是XILINX FPGA或板有问题

[复制链接]
1361|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sme-ic|  楼主 | 2013-11-16 09:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
买了一块FPGA板,以前在spartan3/spartan6上好好的项目,弄到这块Artix-7上,出问题了。用片内逻辑分析仪抓了半天信号,发现是RAM问题,将电路反复复位(由上位机控制,在电路内部产生复位信号)、运行,RAM中的数据会变。
(RAM当程序ROM用,由上位机下载进去,下载完后不再更新。RAM速度为6~12MHz)。
1. 首选怀疑是不是电路有问题
  用100MHz的时钟来抓we信号,没有发现we有高电平。
2. 难道有毛刺?把we接成0,上位机不更新RAM,只在综合时将初始值置进去。
  仍然会出错。
3. 多放一片一样的RAM,地址、时钟、we全接一样,两片RAM的输出做个比较电路,以检测ROM内容是否发生变化。
  结果:会发生变化。即使we接0,也会。


然后,我单独做了个工程,只放两片RAM,WE全接0,RAM地址由计数器连接,一直遍历整个RAM空间。对2个RAM输出结果进行比较,也发现会出现数据不一致。
把该工程的bit文件发给厂家,在他们手上的板子也是一样的现象。
他们看了我的代码,认为是我设计问题,不是FPGA问题。在这里,我把代码、波形贴出,大家来评评。

相关帖子

沙发
sme-ic|  楼主 | 2013-11-16 09:28 | 只看该作者

这是ROM的定义

module        c8051f_irom (
        clk,
        addr,
        di,
        we,
        oe,
        ce,
        dout
        );

        parameter        ADDR_W        =        `ROM_ADDR_WIDTH;
        parameter        BUS_W        =        8;
        parameter        ROM_FILE        =        "HIDtoUART.mem";
        
        input                        clk;
        input        [ADDR_W-1:0]        addr;
        input        [BUS_W-1:0]        di;
        input                        we;
        input                        oe;
        input                        ce;
        output        [BUS_W-1:0]        dout;

`ifdef        ASIC

`else
        reg                [BUS_W-1:0]        mem        [(1<<ADDR_W)-1:0];
        reg                [ADDR_W-1:0]        rd_addr;

        initial
        begin
                $readmemh(ROM_FILE,mem);
                $display("**************************************************************");
                $display("*                                                                                                                           *");
                $display("*  Read code file from file %s *",ROM_FILE);
                $display("*                                                                                                                           *");
                $display("**************************************************************");
    end

        always @(posedge clk)
        begin
                if (ce & we)
                        mem[addr]        <=        #`U_DLY di;
                rd_addr        <=        #`U_DLY addr;
        end
        assign        #`U_DLY        dout        =        (ce & oe) ? mem[rd_addr] : 8'h00;
`endif

endmodule

使用特权

评论回复
板凳
sme-ic|  楼主 | 2013-11-16 09:30 | 只看该作者
这是ROM的调用和结果比较:

c8051f_irom u_irom (
                .clk                        (!p_clk),
                .addr                        (irom_addr[`ROM_ADDR_WIDTH-1:0]),
                .di                                (irom_write_data),
                .we                                (!irom_we_n & xween),
                .oe                                (!irom_rd_n),
                .ce                                (!irom_cs_n),
                .dout                        (irom_read_data)
        );
       
        wire        [7:0]        irom_ref_data;
       
        c8051f_irom u_irom_ref (
                .clk                        (!p_clk),
                .addr                        (irom_addr[`ROM_ADDR_WIDTH-1:0]),
                .di                                (8'h00),
                .we                                (1'b0),
                .oe                                (1'b1),
                .ce                                (1'b1),
                .dout                        (irom_ref_data)
        );
        always @(negedge sysrst_n or posedge p_clk)
        begin
                if (!sysrst_n)
                        rom_err        <=        1'b0;
                else if (irom_rd_n == 1'b0 && irom_cs_n == 1'b0)
                        rom_err        <=        irom_read_data != irom_ref_data;
        end

可以看到,下面的一个ROM,we是接0的。

使用特权

评论回复
地板
sme-ic|  楼主 | 2013-11-16 09:32 | 只看该作者
出错波形1(出数的数据较多)

使用特权

评论回复
5
sme-ic|  楼主 | 2013-11-16 09:33 | 只看该作者
出错波形2:

使用特权

评论回复
6
drentsi| | 2013-11-16 22:19 | 只看该作者
你设计错了
你使用BLOCK RAM ,即使是ROM,读数据也有1个clk的延时

使用特权

评论回复
7
drentsi| | 2013-11-16 22:20 | 只看该作者
把ROM_ADDR_WIDTH改为小于等于8,不使用BRAM,就可以

使用特权

评论回复
8
xiamingmin163| | 2013-11-17 21:54 | 只看该作者
直接例化ROM不就可以么,为什么要搞这么复杂?你这代码也综合不出个ROM啊。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

1

粉丝