1 |
4 |
Juzujka |
`timescale 1ns / 1ns
|
2 |
|
|
/**
|
3 |
|
|
* Module: comb
|
4 |
|
|
*
|
5 |
|
|
* Comb stage for CIC filter
|
6 |
|
|
* There is two variants of realisation.
|
7 |
|
|
* Ordinary (SMALL_FOOTPRINT = 0).
|
8 |
|
|
* For every stage in the output extra register added for isolation combinatorial logic outside own adder.
|
9 |
|
|
* Small footprint (SMALL_FOOTPRINT = 1)
|
10 |
|
|
* No additional register, adders are in the chain of CIC_N cells.
|
11 |
|
|
* Output sample generated after CIC_N clocks, f_clk / f_comb_samp > CIC_N required.
|
12 |
|
|
*
|
13 |
|
|
*/
|
14 |
|
|
module comb
|
15 |
|
|
/*********************************************************************************************/
|
16 |
|
|
#(
|
17 |
|
|
parameter SAMP_WIDTH = 8,
|
18 |
|
|
parameter CIC_M = 1,
|
19 |
|
|
//parameter CIC_N = 1,
|
20 |
|
|
parameter SMALL_FOOTPRINT = 0 ///< set to 1 for less registers usage, but for every sample CIC_N clocks required
|
21 |
|
|
)
|
22 |
|
|
/*********************************************************************************************/
|
23 |
|
|
(
|
24 |
|
|
input clk,
|
25 |
|
|
input reset_n,
|
26 |
|
|
input clear,
|
27 |
|
|
input wire signed [SAMP_WIDTH - 1:0] samp_inp_data,
|
28 |
|
|
input samp_inp_str,
|
29 |
|
|
input summ_rdy_str, ///< for SMALL_FOOTPRINT set 1 after CIC_N cycles from inp_str to load FIFO registers with new sample
|
30 |
|
|
///< output data must be latched before summ_rdy_str is set, read output data at CIC_N - 1 clock after inp_str
|
31 |
|
|
output wire signed [SAMP_WIDTH - 1:0] samp_out_data,
|
32 |
|
|
output wire samp_out_str
|
33 |
|
|
);
|
34 |
|
|
/*********************************************************************************************/
|
35 |
|
|
integer i;
|
36 |
|
|
reg signed [SAMP_WIDTH - 1 : 0] data_reg[CIC_M - 1 : 0]; ///< the storage for the FIFO register
|
37 |
|
|
wire data_reg_push_str; ///< strobe to push data into data_reg FIFO
|
38 |
|
|
/*********************************************************************************************/
|
39 |
|
|
|
40 |
|
|
|
41 |
|
|
generate
|
42 |
|
|
if (SMALL_FOOTPRINT == 0) begin
|
43 |
|
|
reg samp_out_str_reg;
|
44 |
|
|
reg signed [SAMP_WIDTH - 1 : 0] data_out_reg;
|
45 |
|
|
assign data_reg_push_str = samp_inp_str;
|
46 |
|
|
always @(posedge clk or negedge reset_n)
|
47 |
|
|
begin
|
48 |
|
|
if (!reset_n) data_out_reg <= '0;
|
49 |
|
|
else if (clear) data_out_reg <= '0;
|
50 |
|
|
else if (samp_inp_str) data_out_reg <= samp_inp_data - data_reg[CIC_M - 1];
|
51 |
|
|
end
|
52 |
|
|
assign samp_out_data = data_out_reg;
|
53 |
|
|
always @(posedge clk or negedge reset_n)
|
54 |
|
|
begin
|
55 |
|
|
if (!reset_n) samp_out_str_reg <= '0;
|
56 |
|
|
else if (clear) samp_out_str_reg <= '0;
|
57 |
|
|
else samp_out_str_reg <= samp_inp_str;
|
58 |
|
|
end
|
59 |
|
|
assign samp_out_str = samp_out_str_reg;
|
60 |
|
|
|
61 |
|
|
end else begin
|
62 |
|
|
assign data_reg_push_str = summ_rdy_str;
|
63 |
|
|
assign #4 samp_out_data = samp_inp_data - data_reg[CIC_M - 1]; // delay for 18x18 multiplier of Cyclone V SE is 3.4 ns
|
64 |
|
|
assign samp_out_str = summ_rdy_str;
|
65 |
|
|
|
66 |
|
|
end
|
67 |
|
|
endgenerate
|
68 |
|
|
|
69 |
|
|
|
70 |
|
|
/*********************************************************************************************/
|
71 |
|
|
// FIFO register with reset and clear
|
72 |
|
|
always @(posedge clk or negedge reset_n)
|
73 |
|
|
begin
|
74 |
|
|
if (!reset_n) for (i = 0; i < CIC_M; i = i + 1) data_reg[i] <= '0;
|
75 |
|
|
else if (clear) for (i = 0; i < CIC_M; i = i + 1) data_reg[i] <= '0;
|
76 |
|
|
else if (data_reg_push_str) begin
|
77 |
|
|
data_reg[0] <= samp_inp_data;
|
78 |
|
|
for (i = 1; i < CIC_M; i = i + 1) data_reg[i] <= data_reg[i - 1];
|
79 |
|
|
end
|
80 |
|
|
end
|
81 |
|
|
|
82 |
|
|
/*********************************************************************************************/
|
83 |
|
|
endmodule
|