1 |
2 |
sukhanov |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
2 |
|
|
//
|
3 |
|
|
// File: random_pulse_generator.v
|
4 |
|
|
// File history:
|
5 |
|
|
// Version 1: 2015-03-24: Created
|
6 |
|
|
//
|
7 |
|
|
// Description:
|
8 |
|
|
//
|
9 |
|
|
// Poisson process generator.
|
10 |
|
|
// Generate Poisson process with desired inversed rate (number of clocks per hit).
|
11 |
|
|
// The rate is defined by parameter LN2_PERIOD. For example, the LN2_PERIOD=4 will generate
|
12 |
|
|
// in average one pulse per 16 clocks.
|
13 |
|
|
//
|
14 |
|
|
// Author: Andrey Sukhanov
|
15 |
|
|
//
|
16 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
17 |
|
|
`timescale 1ns/1ps
|
18 |
|
|
|
19 |
|
|
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
20 |
|
|
module pseudo_random(input clk, ce, rst, output reg [31:0] q);
|
21 |
|
|
// 32-bit uniform pseudo-random number generator, based on fibonacci LFSR
|
22 |
|
|
// Other 32-bit uniform random generators can be used as well.
|
23 |
|
|
|
24 |
|
|
wire feedback = q[31]^q[29]^q[28]^ q[27]^ q[23]^q[20]^ q[19]^q[17]^ q[15]^q[14]^q[12]^ q[11]^q[9]^ q[4]^ q[3]^q[2];
|
25 |
|
|
//feedback term B89ADA1C, other terms can be found from this table
|
26 |
|
|
// http://www.ece.cmu.edu/~koopman/lfsr/index.html
|
27 |
|
|
|
28 |
|
|
always @(posedge clk or posedge rst)
|
29 |
|
|
if (rst)
|
30 |
|
|
q <= 32'haaaaaaaa; // the start is more random with this initialization
|
31 |
|
|
else if (ce)
|
32 |
|
|
q <= {q[30:0], feedback} ;
|
33 |
|
|
endmodule
|
34 |
|
|
//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
35 |
|
|
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
36 |
|
|
module random_pulse_generator( input clk, ce, rst, output reg q);
|
37 |
|
|
|
38 |
|
|
parameter LN2_PERIOD = 4; // 1 < LN2_PERIOD < 31
|
39 |
|
|
// log2 of the inversed process rate ,
|
40 |
|
|
|
41 |
|
|
parameter MASK = {LN2_PERIOD{1'b0}}; // any number with LN2_PERIOD bits can be used as a MASK
|
42 |
|
|
wire [31:0] uniform_random;
|
43 |
|
|
wire [LN2_PERIOD-1:0] sample;
|
44 |
|
|
pseudo_random pseudo_random_gen(clk, ce, rst, uniform_random);
|
45 |
|
|
|
46 |
|
|
assign sample = uniform_random[LN2_PERIOD-1:0]; // any subset of LN2_PERIOD bits can be used as a sample
|
47 |
|
|
always @ (posedge clk)
|
48 |
|
|
if(ce) begin
|
49 |
|
|
if (sample == MASK) q <= 1'b1;
|
50 |
|
|
if (q) q <= 1'b0;
|
51 |
|
|
end
|
52 |
|
|
endmodule
|
53 |
|
|
//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|