买了一块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问题。在这里,我把代码、波形贴出,大家来评评。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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
一周热门 更多>