如何在 Verilog 中制作可变尺寸的二维寄存器/数组
How to make a 2D register/ array in Verilog with variable dimensions
我正在尝试在 FPGA 上实现遗传算法。为了生成算法的初始种群,我想制作一个二维数组,其中包含用户通过开关输入的内容。但是,每次我编译它都说信号不是常数。我曾尝试使用无效的整数和参数。我使用状态机获取用户输入,然后计划将代码的遗传算法部分实例化到该模块中。下面是 GA 所在的模块。
module your_exam_module(clk, rst, a, b, c, d,e, start, done);
input clk, rst;
input [7:0]a;
input [7:0]b;
input [7:0]c;
input [7:0]d;
input [7:0]e;
input start;
output done;
reg done;
always @(posedge clk or negedge rst)
if (rst == 1'b0)
begin
done <= 1'b0;
end
else
begin
if (start == 1'b1)
begin
reg [e-1:0]population[b-1:0]; // generates an E by B register (matrix) that will serve as the initial population
done <= 1'b1;
end
end
endmodule
你没有成功,因为做不到。
您正在使用 HDL,这是一种硬件描述语言。没有硬件可以动态地放大和缩小其大小。这就像要求内存芯片动态更改它可以存储的位数。
您最多只能定义您认为需要的最大、最坏情况下的二维数组。然后你可以使用部分或全部。
另一种方法是使用参数,但每次需要新尺寸时都必须编译程序。事实上,您还受到 FPGA 可以容纳的最大二维数组的限制(以及所有其他代码)。
我正在尝试在 FPGA 上实现遗传算法。为了生成算法的初始种群,我想制作一个二维数组,其中包含用户通过开关输入的内容。但是,每次我编译它都说信号不是常数。我曾尝试使用无效的整数和参数。我使用状态机获取用户输入,然后计划将代码的遗传算法部分实例化到该模块中。下面是 GA 所在的模块。
module your_exam_module(clk, rst, a, b, c, d,e, start, done);
input clk, rst;
input [7:0]a;
input [7:0]b;
input [7:0]c;
input [7:0]d;
input [7:0]e;
input start;
output done;
reg done;
always @(posedge clk or negedge rst)
if (rst == 1'b0)
begin
done <= 1'b0;
end
else
begin
if (start == 1'b1)
begin
reg [e-1:0]population[b-1:0]; // generates an E by B register (matrix) that will serve as the initial population
done <= 1'b1;
end
end
endmodule
你没有成功,因为做不到。
您正在使用 HDL,这是一种硬件描述语言。没有硬件可以动态地放大和缩小其大小。这就像要求内存芯片动态更改它可以存储的位数。
您最多只能定义您认为需要的最大、最坏情况下的二维数组。然后你可以使用部分或全部。
另一种方法是使用参数,但每次需要新尺寸时都必须编译程序。事实上,您还受到 FPGA 可以容纳的最大二维数组的限制(以及所有其他代码)。