根据Verilog中的条件实例化模块

根据Verilog中的条件实例化模块,verilog,Verilog,我在Verilog中有一个1023位向量。我要做的就是检查第I位是否为1,如果为1,我必须将“I”添加到另一个变量中 在C中,它类似于: int sum=0; int i=0; for(i=0;i<1023;i++) { if(a[i]==1) { sum=sum+i; } int和=0; int i=0; 对于(i=0;i在没有看到您的模块的情况下回答您的问题是很困难的,因为我们无法衡量您在Verilog中的位置。您必须始终考虑您的代码在gates中是如何翻译的。如果我们想将您的C代码

我在Verilog中有一个1023位向量。我要做的就是检查第I位是否为1,如果为1,我必须将“I”添加到另一个变量中

在C中,它类似于:

int sum=0;
int i=0;
for(i=0;i<1023;i++) {
if(a[i]==1) {
sum=sum+i;
}
int和=0;
int i=0;

对于(i=0;i在没有看到您的模块的情况下回答您的问题是很困难的,因为我们无法衡量您在Verilog中的位置。您必须始终考虑您的代码在gates中是如何翻译的。如果我们想将您的C代码翻译成可合成逻辑,我们可以采用相同的算法,逐个检查每一位,并根据需要将其相加每一位。您可以使用如下内容:

module gallois (
  input   wire            clk,
  input   wire            rst,
  input   wire  [1022:0]  a,
  input   wire            a_valid,
  output  reg   [18:0]    sum,
  output  reg             sum_valid
);

reg [9:0]    cnt;
reg [1021:0] shift_a;

always @(posedge clk)
if (rst)
begin
  sum[18:0] <= {19{1'bx}};
  sum_valid <= 1'b0;
  cnt[9:0] <= 10'd0;
  shift_a[1021:0] <= {1022{1'bx}};
end
else
  if (a_valid)
  begin
    sum[18:0] <= 19'd0;
    sum_valid <= 1'b0;
    cnt[9:0] <= 10'd1;
    shift_a[1021:0] <= a[1022:1];
  end
  else if (cnt[9:0])
  begin
    if (cnt[9:0] == 10'd1022)
    begin
      sum_valid <= 1'b1;
      cnt[9:0] <= 10'd0;
    end
    else
      cnt[9:0] <= cnt[9:0] + 10'd1;

    if (shift_a[0])
      sum[18:0] <= sum[18:0] + cnt[9:0];

    shift_a[1021:0] <= {1'bx, shift_a[1021:1]};
  end

endmodule
不用说,有1023个输入位的查找表是一个非常大的内存


然后,如果您想改进代码,并将FPGA用作FPGA而不是CPU,您需要开始考虑并行性,例如在输入a的不同范围内并行工作。但这是另一个线程…

您尝试了什么?请显示完整的模块。仅供参考:您不调用模块,而是实例化它们。对于如果您试图这样做,实例化模块会使事情变得更复杂。只需创建一个模块和一个组合始终块。通过“调用”我的意思是模块名为Galois_field_adder。我知道我们实例化了模块。不过谢谢你的输入。你还没有向我们展示你的计划或告诉我们你计划如何实现它。你想要1023个Galois_field_adder的实例化?还是一个用1023个时钟解方程的加法器实例?检查可以在然而,Verilog需要考虑到硬件设计和/或测试平台设计的多个方面。因此,你不能把它放在一个模块中。你需要把它放在一个特定的Verilog原语中,并且可能考虑使用时钟和重置。所以,学习Verilog并尝试创建FIR。st verilog模型。我可以使用conditional generate语句有条件地实例化一个模块。唯一的问题是“a”不是一个固定变量。直到运行时才知道它。我知道方法,但我一直在寻找更好的解决方案。仅供参考,我在verilog上过两门课,你可以查阅conditional generate如果您忘记了它是如何工作的,非常感谢您的宝贵见解。我真的非常感谢您的宝贵见解。没问题,请务必接受解决方案,如果它对您有帮助,请向上投票:-)
if (a[cnt[9:0])
  sum[18:0] <= sum[18:0] + cnt[9:0];
reg   [1022:0]a;
reg   [9:0] sum;
integer i;

always @(a)
begin
  sum[9:0] = 10'd0;
  for (i=0; i < 1023; i=i+1)
    if (a[i])
      sum[9:0] = sum[9:0] + i;
end
always @(a)
  case(a):
    1023'd0: sum[18:0] = 19'd0;
    1023'd1: sum[18:0] = 19'd1;
    1023'd2: sum[18:0] = 19'd3;
    etc...