计算输入重复verilog的次数

时间:2014-11-27 22:33:14

标签: verilog xilinx

我正在尝试计算每个x重复输入posedge clk 8位的时间。 我正在考虑为这8位的每个值创建256b计数器来比较x,但是当我尝试将这些计数器的每个值与每个输入x进行比较时,我会收到错误上升的边缘。

module counter_initial(x);
  input[7:0] x;
  //output [7:0] y;
  //reg [7:0] y;
  //reg [7:0] freq_tst,gap_tst;
  reg [7:0] freq_num;
endmodule

module counter_256(clk,x,out);
  input [7:0] x;
  input clk;
  // input [7:0] in;
  output [7:0] out;
  reg [7:0] out;
  //reg [7:0] freq_tst,gap_tst;
  reg [7:0] k=0;
  // reg [] t=0;

  genvar i;
  generate
    for (i=0;i<256;i=i+1)
    begin
      counter_initial m(i);
      //t=m(i);
    end
  endgenerate

  always @(posedge clk)
  begin
    if(k<256) begin
      if (x==m[i])
      //counter_initial[k]==x
      begin 
        freq_num=freq_num+1; 
      end
      //else
      //begin gap_tst=gap_tst+1; end
      k=k+1;
    end
  end 
endmodule

1 个答案:

答案 0 :(得分:0)

您无需计算额外的模块。您可以使用内存阵列。例如:

input [WIDTH-1:0] x;

reg [7:0] mem [WIDTH-1:0];
integer i;

always @(posedge clk) begin 
  if (reset) begin
    for (i = 0; i < 2**WIDTH; i = i+1) begin
      mem[i] <= 8'b0;
    end
  end
  else if (mem[x] < 8'd255) begin // cap counting and prevent overflow
    mem[x] <= mem[x] + 1'b1;
  end
end

如果您想使用单独的模块,请将时钟传递给它。例如:

module counter (output reg [7:0] count, input increment, clk, reset);
  always @(posedge clk) begin
    if (reset) begin
      count <= 8'b0;
    end
    else if (count < 8'd255) begin // cap counting and prevent overflow
      count <= count + increment;
    end
  end
endmodule

module my_device ( /* ..., */ input [7:0] x, input clk, reset );
/* ... */
genvar i;
generate
for (i=0; i<256; i=i+1) begin
  counter icount( .count(/* ... */), .increment(x==i), .* );
end
endgenerate
/* ... */
endmdoule

提醒8'd255 + 18'd0,因为8'd256的MSB超出了范围。我对计数器加了限制,这样就不会溢出并回滚到零。