微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 调用ROM出错

调用ROM出错

时间:10-02 整理:3721RD 点击:
我想用查表法生成一个正弦波形,可是在调用的时候总是不成功,也就是总是读不出ROM中的数据
显示的warning是:Xst:2036 - Inserting OBUF on port <sinwave<0>> driven by black box <core>. Possible simulation mismatch.其中sinewave是我定义的sine波数据输出口,core是我的rom核。
读出的数据总是显示XXXXX,到底是怎么回事?


仔细看下ROM的的时序,地址,时钟都按要求给了吗

你生成的ROM没有添加到工程里面,找不到文件,所以 black box 了。

ROM的数据你按要求制作的吗?另外,HEX文件的路径,在CORE生成文件中是什么样路径?最好是当前路径,然后仿真的时候你把HEX放在仿真work目录下

感谢楼上3位,你们说的问题我检查了,应该不是出在这些方面的

继续等高手的建议!可能是自己哪地方疏忽了,贴出程序来请过路高手帮忙看下,程序很短。

module genwave(
    input clk,
    input rst,
         input [22:0]freq,//固定的分频值
    output [5:0] sinwave
    );
reg rom_read;
reg [5:0]cnt,cnt1;

always@(posedge clk)begin//计数器
if(rst)
rom_read<=0;
else
if(cnt1==freq-1)//
rom_read<=1;
else
rom_read<=0;
end

always@(posedge clk)begin //对系统时钟分频产生读ROM时钟
if(rst)
cnt1<=0;
else if(cnt1==freq-1)//
cnt1<=0;
else
cnt1<=cnt1+1;
end
always@(posedge rom_read)begin//每读一次ROM就计数一次,ROM中共50个数据,只需50个时钟就可以读完一次,以计数器的值作为ROM的地址
if(rst)begin
cnt<=0;
end
else
if(cnt==49)
cnt<=0;                                                                                                              
else
cnt<=cnt+6'd1;
end

core sine(
                .clka(rom_read),
                .addra(cnt),
                .douta(sinwave)
        );
       
endmodule

去掉最后一个always并改成下面试试,:
always@(posedge clk)begin//计数器
if(rst)
rom_read<=0;
cnt<=0;
else
if(cnt1==freq-1)//
rom_read<=1;
cnt<=cnt+1;
else
rom_read<=0;
end
PS:建议用低电平复位

感谢7楼,我昨天改成这个了,还是不行,问题应该不是出在这里

小编用的不是altera,呵呵,我也不太明白,不过帮你查了一个,警告类似,最后仿真的结果输出是高阻,结论可能是版本不对,仅作为提示。
给不了链接,你自己去google上查吧

多谢各位,问题昨天解决了,确实是在计数上出了问题,我换了一种方式编程就好了,至于上面的分频和计数有什么问题我还没想出来。

不知你换成什么“编程方式”把问题解决了,能说详细点吗?或者把你“正确”的方式也贴出来让大家帮你找找原因

我也比较好奇这个问题。从warning来看应该是仿真软件找不到core这个模块,一般这样都是只拷贝了.v而没有拷贝初始化文件

集成的仿真器确实不太好用,很多都不认识

上一篇:SystemC
下一篇:关于异步FIFO深度的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top