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

2020-02-24 20:38发布

买了一块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问题。在这里,我把代码、波形贴出,大家来评评。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
sme-ic
2020-02-24 21:25
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

一周热门 更多>