OpenCores
URL https://opencores.org/ocsvn/cic_core_2/cic_core_2/trunk

Subversion Repositories cic_core_2

[/] [cic_core_2/] [trunk/] [rtl/] [verilog/] [comb.sv] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.