【发布时间】:2016-05-10 10:28:57
【问题描述】:
我需要用一些二进制数据加载内存。我读到 $readmemb 可以用于此,甚至还有一种方法可以合成。
因此,我创建了另一个名为 RAM_IN 的模块(它不是测试台模块)并“连接”到顶部模块。
在了解 $readmemb 之前,我使用的是以下代码:
initial
begin
in_ram [0] <= 32'b11111111_000000000000000000000000;
in_ram [1] <= 32'b10010111_000000000000000000000000;
in_ram [2] <= 32'b00110110_000000000000000000000000;
in_ram [3] <= 32'b00111110_000000000000000000000000;
in_ram [4] <= 32'b00111111_000000000000000000000000;
in_ram [5] <= 32'b00111110_000000000000000000000000;
end
但是像这样写100个数字对我来说太累了,所以像这样实现$readmemb:
module RAM_IN (pix_val, indx);
input [0:5] indx;
output [31:0] pix_val;
reg [31:0] pix_val;
reg [31:0] in_ram [0:4];
always @ (indx)
pix_val = in_ram [indx];
initial
begin
$readmemb("in_ram.txt", in_ram);
end
读取此文件的目的是最初将 100 个二进制值(模拟 10x10 图像的像素强度)一一加载到顶部模块(稍后将处理并吐出结果...)
我创建了一个 .txt 文件,其内容与此完全相同
11111111000000000000000000000000
10010111000000000000000000000000
00110110000000000000000000000000
00111110000000000000000000000000
00111111000000000000000000000000
当我模拟时,modelsim 显示内存充满了 xxxxxxxxxxxxxxxxx(不在乎),看起来好像没有将任何内容加载到内存中。
我不知道我做错了什么。可能不是 .txt 文件中的数字的处置。也许是因为我打算在另一个不是测试台的模块中加载带有 $readmemb 的文件?
PD:我做这个填充内存的过程的模拟只是为了实际目的,最终目的是把Top模块设计成一个完整的SoC,我想我会用QSYS来做。但我在这方面很新,所以我还在学习。任何帮助将不胜感激!!!
【问题讨论】:
-
对我来说它看起来还不错,也可以正常工作。 http://www.edaplayground.com/x/5kxx
-
@hexafraction 我会说像这样对内存进行编号是非常传统的:
reg [31:0] in_ram [0:4];。
标签: memory verilog quartus test-bench