用quartus设置ROM的问题

2019-03-25 10:48发布

最近的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)); 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
蔡强人
1楼-- · 2019-03-25 14:59
< / 简单的方法,用现成的ROM Core,主流的厂商都会支持,但是坏处是初始化内容的方法各不相同;
另外的方法,自己写一个程序,生成你说的那堆case语句,很简单的,随便一个语言都可以做到,
只要写得得当,一般的综合工具都会发现是ROM并且用FPGA里面的RAM资源来综合它。

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

给个完整的例子,这里综合出的是RAM,你可以去掉写的部分,然后就是ROM了:
module ram_with_init(
output reg [7:0] q,
input [7:0] d,
input [2:0] write_address, read_address,
input we, clk
);
reg [7:0] mem [0:7];
initial begin
   $readmemh("ram.txt", mem);
end
always @ (posedge clk) begin
   if (we)
     mem[write_address] <= d;
     q <= mem[read_address];
   end
endmodule
hulijian
2楼-- · 2019-03-25 15:43
DING!!!!!!!!!!!!!!!!!!!!!!!!!!
qchpanna
3楼-- · 2019-03-25 17:25
 精彩回答 2  元偷偷看……

一周热门 更多>