如何给Verilog中的数组初始化赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给Verilog中的数组初始化赋值相关的知识,希望对你有一定的参考价值。

下面是我声明的391680深,8位宽的数组,用来存储一张BMP图像
reg [7:0]Image_BMP[391680:0];
求教各位大侠,这里如何将我的初始化值赋值(图片16进制数据)进去呢?
跪求大侠相助!!!!!!!
在线等待大侠相助!!!!!!我现在就在等。。。。

【1】Image_BMP应该是一个memory,数组是C元语言的叫法
【2】如果你只是仿真的话,可以用verilog的for循环语句把图片的数据一一存入
【3】如果用于综合,如果是Quartus的软件,建议你用
(* ram_init_file = "my_init_file.mif" *) reg [7:0]Image_BMP[391680:0];
这样的综合属性语句,my_init_file.mif存放你的BMP数据,请参考http://quartushelp.altera.com/11.1/mergedProjects/hdl/vlog/vlog_file_dir_ram_init.htm了解详情
【4】欢迎采纳,欢迎提问,祝你好运追问

请问大侠
【1】(* ram_init_file = "my_init_file.mif" *) reg [7:0]Image_BMP[391680:0]; //这个语句放在程序的什么位置?

【2】这个图片数据(0xFF)是以什么样的格式或结构存放于my_init_file.mif中的呢?
可以举个例子吗?

追答

【1】综合属性,放在memory变量声明的位置
【2】你是想问怎么得到mif文件吧,你用BmpToMif.exe这个软件就好了
【3】欢迎采纳!欢迎提问

参考技术A Image_BMP应该是个memory吧. 如果不是testbench那就用一些时钟周期写进去啊.

reg [8*391691:0] Image_Vector = "你的数据字符串";
integer i;
reg init;
always@(posedge clk, negedge rst) begin
if(rst) begin
i = 0;
init = 1'b1;
end else begin
if(i < 391681) begin
i = i + 1;
end else begin
init = 1'b0;
end
end
end

always@(posedge clk) begin
if(init) begin
Image_BMP[i] = Image_Vector[8*(i+1):8*i];
end
end

否则可以用for写入
reg [8*391691:0] Image_Vector = "你的数据字符串";
integer i;
initial begin
for(i = 0; i < 391691; i = i +1) begin
Image_BMP[i] = Image_vector[8*(i+1):8*i];
end
end
参考技术B 用一个for循环;
例如
for(i=0;i++;i<=391680)
begin
reg[i] = 8'h你的数据;
end
参考技术C 用个for循环追问

请问这些数据放程序的什么位置

verilog 二维数组是如何初始化的啊?

我现在是要将matlab中已实现的算法用verilog实现,其中,我在matlab中e=[1;zeros(n-1,1)],在verilog中我不知道如何比较好的初始化,我现在想得是先定义reg signed [20:0] e[n-1:0];再对e赋值,这样行吗?还有怎样赋值呢?是用for循环吗?

你说的这种情况我在前几天的毕设中也遇到过,这种情况只能用fpga中的寄存器或者RAM块来实现.
具体的话,你说的这种定义是不可行的,可以参考上面几位说的用lpm_rom ip核来实现--就是在FPGA中实现一个订制ROM或者RAM,选用哪种看实际情况.像你这种算法处理的话应该用RAM来反复进行算法的计算.
还有一点需要注意的是FPGA实现算法尽量用流水线来实现.因为FPGA的寄存器资源有限.数据的反复计算再存储可能需要大量的寄存器,这样可能造成实现困难,解决方法要看你实现的算法能不能进行一些优化.比如像FFTip里用到的一个小技巧一组数据计算后又存到原来的寄存器组中.
自己的一点小经验希望能帮到你

参考资料:FPGA verilog语法 eda

参考技术A 您说的二维数组在verilog中表示一个储存器,ram或rom。
建立这个储存器两种初始化方法一种就是:有规律的数据用for是可以赋值的

但是如果是很多无规律的数据需要您建立lpm_rom,并将数据写入.mif文件后加载到rom中,

欢迎追问。
参考技术B module test(
input wire rst_n // Reset, Active Low
,input wire clk
//
// Add other inputs and outputs here
//
);
integer k;
parameter n = 10; // set the value of n here
reg signed [20:0] e[0:n-1];
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
for(k=0;k<n;k=k+1) e[k] <= 21'h0; // set initial value of matrix to all zero here
end
else begin
// change the value of e here normally
end
end

endmodule本回答被提问者和网友采纳
参考技术C 你说的二维数组实际上是一个memory类型的变量,verilog里是没有数组的。这个有很多方式,楼上的方法可以,可以用initial. 还可以用文件来初始化:$readmemb 或 $readmemh。看你想干什么用,设计的时候要对应硬件模型

以上是关于如何给Verilog中的数组初始化赋值的主要内容,如果未能解决你的问题,请参考以下文章

verilog 怎么给二维数组赋值

verilog数组赋值

verilog 二维数组是如何初始化的啊?

Verilog里面如何初始化数组才能被Quartus II综合?

verilog 初始化十进制数组

verilog中如何将二维存储器转为一维的数组并赋值,求大神帮忙!