我正在尝试计算每个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
答案 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 + 1
为8'd0
,因为8'd256
的MSB超出了范围。我对计数器加了限制,这样就不会溢出并回滚到零。