|
5 | 5 | //------------------------------------------------------------------------------
|
6 | 6 |
|
7 | 7 | // INFO ------------------------------------------------------------------------
|
8 |
| -// Detects data pattern specified by the provided PATTERN |
| 8 | +// Detects data pattern specified by the provided PAT parameter |
9 | 9 | //
|
10 | 10 | // Features capturing WIDTH bits simultaneously in case your data
|
11 |
| -// comes in parallel, like in QSPI interface, for example. |
| 11 | +// comes in parallel, like in QSPI interface, for example |
| 12 | +// |
| 13 | +// Detects pattern in any possible bit position, supposing that input data |
| 14 | +// is an unaligned bit stream |
12 | 15 | //
|
13 | 16 |
|
14 | 17 | /* --- INSTANTIATION TEMPLATE BEGIN ---
|
15 | 18 |
|
16 | 19 | pattern_detect #(
|
17 | 20 | .DEPTH( 2 ),
|
18 |
| - .WIDTH( 5 ), |
19 |
| - .PATTERN( 10'b11111_10011 ) |
| 21 | + .WIDTH( 16 ), |
| 22 | +
|
| 23 | + // pattern parameters |
| 24 | + .PAT_WIDTH( 5 ), // must be less than DEPTH*WIDTH |
| 25 | + .PAT( 5'b10011 ) |
20 | 26 | ) PD1 (
|
21 | 27 | .clk( clk ),
|
22 | 28 | .nrst( nrst ),
|
23 | 29 | .ena( 1'b1 ),
|
24 | 30 | .data( data[4:0] ),
|
| 31 | +
|
| 32 | + .detected_pos( ) |
25 | 33 | .detected( )
|
26 | 34 | );
|
27 | 35 |
|
28 | 36 | --- INSTANTIATION TEMPLATE END ---*/
|
29 | 37 |
|
30 | 38 |
|
31 | 39 | module pattern_detect #( parameter
|
32 |
| - DEPTH = 1, |
33 |
| - WIDTH = 1, |
34 |
| - logic [DEPTH*WIDTH-1:0] PATTERN = '0 |
| 40 | + DEPTH = 2, |
| 41 | + WIDTH = 16, |
| 42 | + |
| 43 | + PAT_WIDTH = 5, // must be less than DEPTH*WIDTH |
| 44 | + bit [PAT_WIDTH-1:0] PAT = '1 |
35 | 45 | )(
|
36 | 46 | input clk,
|
37 | 47 | input nrst,
|
38 | 48 |
|
39 | 49 | input ena,
|
40 | 50 | input [WIDTH-1:0] data,
|
41 | 51 |
|
42 |
| - output detected |
| 52 | + output logic detected, |
| 53 | + output logic [DEPTH*WIDTH-1:0] detected_mask |
43 | 54 | );
|
44 | 55 |
|
45 |
| - logic [DEPTH*WIDTH-1:0] samples = '0; |
| 56 | + logic [DEPTH*WIDTH-1:0] sample_buf = '0; |
| 57 | + logic [DEPTH*WIDTH-1:0] ena_buf = '0; |
46 | 58 | always @ (posedge clk) begin
|
47 | 59 | if( ~nrst ) begin
|
48 |
| - samples[DEPTH*WIDTH-1:0] <= '0; |
49 |
| - end else if( ena ) begin |
50 |
| - samples[DEPTH*WIDTH-1:0] <= {samples[DEPTH*WIDTH-WIDTH-1:0],data[WIDTH-1:0]}; |
| 60 | + sample_buf[DEPTH*WIDTH-1:0] <= {DEPTH*WIDTH{1'b0}}; |
| 61 | + ena_buf[DEPTH*WIDTH-1:0] <= {DEPTH*WIDTH{1'b0}}; |
| 62 | + end else begin |
| 63 | + sample_buf[DEPTH*WIDTH-1:0] <= {sample_buf[DEPTH*WIDTH-WIDTH-1:0], |
| 64 | + data[WIDTH-1:0]}; |
| 65 | + ena_buf[DEPTH*WIDTH-1:0] <= {ena_buf[DEPTH*WIDTH-WIDTH-1:0], |
| 66 | + {WIDTH{ena}} }; |
51 | 67 | end
|
52 | 68 | end
|
53 | 69 |
|
54 |
| - assign detected = (samples[DEPTH*WIDTH-1:0] == PATTERN[DEPTH*WIDTH-1:0]); |
| 70 | + always_comb begin |
| 71 | + integer i; |
| 72 | + |
| 73 | + detected_mask[DEPTH*WIDTH-1:0] = '0; |
| 74 | + for( i=0; i<(DEPTH*WIDTH-PAT_WIDTH); i++ ) begin |
| 75 | + if( sample_buf[i+:PAT_WIDTH] == PAT[PAT_WIDTH-1:0] && |
| 76 | + ena_buf[i+:PAT_WIDTH]) begin |
| 77 | + detected_mask[i] = 1'b1; |
| 78 | + end |
| 79 | + end |
| 80 | + detected = |detected_mask[DEPTH*WIDTH-1:0]; |
| 81 | + end |
55 | 82 |
|
56 | 83 | endmodule
|
57 | 84 |
|
0 commit comments