2014-12-04 56 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循环已经在异步复位和初始被使用,这可以静态地展开,没有动态目标所以是完全可合成。