2014-12-04 55 views
-2

我正在寫一個算法的verilog代碼,但我有一個模塊接收的問題,例如:來自前一個模塊的10個二進制數(每個4位)(每個輸入1個正邊沿時鐘),所以有10個時鐘週期有10個二進制數字。Verilog code to count Number Repetition

如何計算每個數字重複的次數,並保存每個數字的頻率,供以後使用verilog hardawre語言的其他模塊使用?例如: :最後,這個模塊發現0000兩次,0001一次,...,1111零。在10個時鐘週期。

預先感謝...

+0

您如何看待產出? – 2014-12-04 21:55:12

+0

我已經嘗試過「每個人的基因計數器」,但沒有奏效。我給出了上面的例子,但是我的工作取決於在每個正邊沿產生的隨機數clk,然後我想要計算在10個clk週期內出現範圍[0000,1111]處每個數字的數量。 – Sereena 2014-12-04 22:05:39

+0

我能看到的最簡單的方法是聲明一個由16個元素組成的數組,這些元素將用作計數器,並在每次發生與計數器索引相對應的數字時增加它們。但是,再一次,你想得到什麼樣的輸出格式? – 2014-12-04 22:29:17

回答

0

假設你有一個時鐘和有效低復位:

module tracker(
    input clk, 
    input rst_n, 
    input [3:0] data_rx 
); 

reg [7:0] count [0:15]; 
integer i; 

always @(posedge clk, negedge rst_n) begin 
    if (~rst_n) begin 
    for(i=0; i<16, i=i+1) begin 
     count[i] <= 8'b0; 
    end 
    end 
    else begin 
    count[data_rx] <= count[data_rx] + 1; 
    end 
end 
endmodule 

對於FPGA默認的初始塊,可以用來代替所述復位信號可能看起來像:

initial begin 
    for(i=0; i<16, i=i+1) begin 
    count[i] <= 8'b0; 
    end 
end 

always @(posedge clk) begin 
    count[data_rx] <= count[data_rx] + 1; 
end 

注意,for循環已經在異步復位和初始被使用,這可以靜態地展開,沒有動態目標所以是完全可合成。