mowenhui28 发表于 2009-12-28 09:05:58

用quartus设置ROM的问题

最近的EDA实训在做波形发生器   想问下写正弦波程序时怎样用quartus设置一个ROM存储那二百多个采样数据, 然后再用一个读ROM的程序大数据读出来
类似单片机C51程序从数组取里数据的操作   verilog里面好像没见有,我又不想用200多个case一个个写那些采样值太麻烦 呵呵!
就是我看别人写的这一段:
rom_sine rom_sine(
.address(Addr),
.clock(clk_d),
.q(temp1));
rom_tri roms_tri(
.address(Addr),
.clock(clk_d),
.q(temp2));
rom_pulse roms_pulse(
.address(Addr),
.clock(clk_d),
.q(temp3));

jlqamark 发表于 2009-12-28 16:31:13

不是有现成的module嘛

minux 发表于 2009-12-28 17:23:40

简单的方法,用现成的ROM Core,主流的厂商都会支持,但是坏处是初始化内容的方法各不相同;
另外的方法,自己写一个程序,生成你说的那堆case语句,很简单的,随便一个语言都可以做到,
只要写得得当,一般的综合工具都会发现是ROM并且用FPGA里面的RAM资源来综合它。

其实,更简单的办法是,因为FPGA里面没有真正的ROM,直接写个RAM,加上这样的初始化语句即可:
reg mem ;
initial begin
    $readmemh("ram.txt", mem);
end
然后ram.txt里面写十六进制的内容,空格/换行分开。
注意,你mem变量有多少个位置,你的ram.txt里面就得有同样多的数据,否则初始化会不成功。

给个完整的例子,这里综合出的是RAM,你可以去掉写的部分,然后就是ROM了:
module ram_with_init(
output reg q,
input d,
input write_address, read_address,
input we, clk
);
reg mem ;
initial begin
   $readmemh("ram.txt", mem);
end
always @ (posedge clk) begin
   if (we)
   mem <= d;
   q <= mem;
   end
endmodule

minux 发表于 2009-12-28 17:39:09

补充下生成那个ram.txt的简单方法,如果你不想编程生成它,可以在excel里面算出你要的
数据们,转换成16进制(dec2hex函数),只保留需要的数据一列,另存为.txt文件(制表符分割),
然后搞定。

如果用个随便什么脚本语言,比如Python, Perl, Tcl之类,生成它就更亦如反掌了。不过不会
也不要紧,有excel一般情况下也够了。

mowenhui28 发表于 2009-12-29 10:24:30

回复【3楼】minux 啊啊?
-----------------------------------------------------------------------

非常感谢minux 啊啊? 的帮助 按你的方法我已经实现了 这方法我翻了好多书都没怎么讲到或像你讲得这么详细,省去了一大堆case的麻烦 呵呵再次谢谢!!
页: [1]
查看完整版本: 用quartus设置ROM的问题