2014-11-27 2 views
-1

posedge clk에 8 비트의 입력 x이 반복되는 시간을 계산하려고합니다. 나는이 8 비트 각각의 값에 256b 카운터를 작성하여 x을 비교하려고 생각하지만 상승 에지에서 각 입력 값이 각각의 카운터 값인 x을 비교하려고 할 때 오류가 발생합니다.입력 반복 횟수 입력 Verilog

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

카운팅에 추가 모듈이 필요하지 않습니다. 메모리 배열을 사용할 수 있습니다. 예 :

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 

별도의 모듈을 사용하려면 시계를 전달하십시오. 예 : 8'd256의 MSB가 범위를 벗어나 있기 때문에

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이다. 카운터가 오버 플로우되지 않고 다시 0으로 롤오버되지 않도록 카운터를 캡핑했습니다.