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

Subversion Repositories gfir

[/] [gfir/] [trunk/] [sc/] [firTF.h] - Blame information for rev 6

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ahmed.shah
#include "systemc.h"
2
 
3
#define order 18 // Filter Length
4
 
5
/** This function exports the internal signals of the transposed-form FIR filter into a text file.
6
  * The text file entitled "fir_output.txt", which can be changed within this function.
7
  * The function inputs are the three internal signals between multiplier -> adder, delay -> adder, and adder_delay respectively.
8
  * Then there is the filter order defined by count, and finally the number of clock cycles defined by c.
9
  * P.S. Delete the text file before you re-simulate the design.
10
  */
11
void text( sc_signal<sc_int<15> > _multi_add[order], sc_signal<sc_int<15> > _delay_add[order], sc_signal<sc_int<15> > _add_delay[order], unsigned int count, unsigned int c )
12
{
13
    FILE *myFile;
14
    myFile = fopen("fir_output.txt", "a"); // Text file name
15
 
16
 
17
    if (c == 0)
18
    {
19
        fprintf(myFile, "CLK \t MU-AD \t \t \t DL-AD \t \t \t AD-DL \t \n");
20
        fprintf(myFile, "-------------------------------------------------------------------------\n");
21
        for (unsigned int i = 0; i < count; i++)
22
        {
23
            fprintf(myFile, "%d \t multi_add[%d] \t %d \t delay_add[%d] \t %d \t add_delay[%d] \t %d \n", c, i, _multi_add[i].read().to_int(), i, _delay_add[i].read().to_int(),  i, _add_delay[i].read().to_int());
24
        }
25
    }
26
    else
27
    {
28
        for (unsigned int i = 0; i < count; i++)
29
        {
30
            fprintf(myFile, "%d \t multi_add[%d] \t %d \t delay_add[%d] \t %d \t add_delay[%d] \t %d \n", c, i, _multi_add[i].read().to_int(), i, _delay_add[i].read().to_int(),  i, _add_delay[i].read().to_int());
31
        }
32
    }
33
 
34
    fprintf(myFile, "\n");
35
 
36
    fclose(myFile);
37
}
38
 
39
SC_MODULE(firTF)
40
{
41
    // Entity Ports
42
    sc_in<bool >        fir_clr;    // RESET
43
    sc_in<bool >        fir_clk;    // CLOCK
44
    sc_in<sc_uint<1> >  fir_in;     // INPUT
45
    sc_out<sc_int<15> > fir_out;    // OUTPUT
46
 
47
    // Internal Signals
48
    sc_signal<sc_int<15> > multi_add[order];            // multiplier's output
49
    sc_signal<sc_int<15> > add_delay[order];            // adder's output and delay's input
50
    sc_signal<sc_int<15> > delay_add[order];            // delay's output and adder's input
51
 
52
    // Constructor Process Sensitivity
53
    SC_CTOR(firTF)
54
    {
55
        // combinational, not clocked
56
        SC_METHOD(multipliers);
57
            sensitive << fir_in;
58
 
59
        fir_out.initialize(0);
60
 
61
        SC_METHOD(delays);
62
           sensitive << fir_clk.pos() ;
63
 
64
        // combinationl
65
        SC_METHOD(adders);
66
           for (unsigned int i = 0; i< order; i++)
67
            {
68
                sensitive << multi_add[i];
69
                sensitive << delay_add[i];
70
            }
71
 
72
        SC_METHOD(output)
73
            sensitive << add_delay[0];
74
    }
75
 
76
    void multipliers()
77
    {
78
        // Filter Coefficients
79
        static const sc_int<12> fir_coeff[order] = {-51,25,128,77,-203,-372,70,1122,2047,2047,1122,70,-372,-203,77,128,25,-51};
80
 
81
        // COEFFMULTIs
82
        for (unsigned int i = 0; i < order; i++)
83
        {
84
            {
85
                multi_add[i].write(fir_in.read() * fir_coeff[i]);
86
            }
87
        }
88
    }
89
 
90
    void delays()
91
    {
92
        // COEFFDELAY
93
        for (unsigned int i = 0; i < order-1; i++)
94
        {
95
            delay_add[i].write(add_delay[i+1].read());
96
        }
97
    }
98
 
99
    void adders()
100
    {
101
        // COEFFADD
102
        for (unsigned int i = 0; i < order; i++)
103
        {
104
            if (i < order-1)
105
            {
106
                add_delay[i].write(multi_add[i].read() + delay_add[i].read());
107
            }
108
            else
109
            {
110
                add_delay[i].write(multi_add[i].read());
111
            }
112
        }
113
    }
114
 
115
    void output()
116
    {
117
        // Internal variables
118
        static unsigned int clkCount = 0;
119
 
120
        // Output assignment
121
        fir_out.write(add_delay[0].read());
122
 
123
        // Exporting data into text file
124
        text(multi_add, delay_add, add_delay, order, clkCount);
125
        clkCount++;
126
    }
127
 
128
};

powered by: WebSVN 2.1.0

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