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

Subversion Repositories two_dimensional_fast_hartley_transform

[/] [two_dimensional_fast_hartley_transform/] [trunk/] [fht_1d_x8.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 irezki
//
2
// File: fht_1d_x8.v
3
// Author: Ivan Rezki
4
// Topic: RTL Core
5
//                2-Dimensional Fast Hartley Transform
6
//
7
 
8
// Fast Hartley Transform 1 Dimension for 8 Points
9
// Decimation in Frequency Domain
10
 
11
// 
12
//     +-----------+    +-----------+    +-----------+
13
//     |  Serial   |    |  1D FHT   |    | Parallel  |
14
// --->|    to     |--->|           |--->|    to     |--->
15
//     | Parallel  |    | 8 Points  |    |  Serial   |
16
//     +-----------+    +-----------+    +-----------+
17
//
18
 
19
module fht_1d_x8(
20
        rstn,
21
        sclk,
22
 
23
        // input data - x0,x1,x2,x3,x4,x5,x6,x7,x0,x1...
24
        x_valid,
25
        x_data,
26
 
27
        // 1D FHT output data - h0,h1,h2,h3,h4,h5,h6,h7,h0,h1...
28
        fht_valid,
29
        fht_data
30
 
31
);
32
 
33
parameter N = 8;
34
 
35
input                   rstn;
36
input                   sclk;
37
 
38
input                   x_valid;
39
input   [N-1:0]  x_data;
40
 
41
output                  fht_valid;
42
output  [N+2:0]  fht_data;
43
// +++---------------------------------+++\\
44
 
45
// +++ Data Preparation Step Start +++ \\
46
// +++        - Aligning -         +++ \\
47
reg [N-1:0] x0,x1,x2,x3,x4,x5,x6,x7;
48
always @(posedge sclk or negedge rstn)
49
if (!rstn) begin
50
        x0 <= #1 0;
51
        x1 <= #1 0;
52
        x2 <= #1 0;
53
        x3 <= #1 0;
54
        x4 <= #1 0;
55
        x5 <= #1 0;
56
        x6 <= #1 0;
57
        x7 <= #1 0;
58
end
59
else if (x_valid) begin
60
        x0 <= #1 x_data;
61
        x1 <= #1 x0;
62
        x2 <= #1 x1;
63
        x3 <= #1 x2;
64
        x4 <= #1 x3;
65
        x5 <= #1 x4;
66
        x6 <= #1 x5;
67
        x7 <= #1 x6;
68
end
69
 
70
reg x_valid_1d;
71
always @(posedge sclk or negedge rstn)
72
if      (!rstn) x_valid_1d <= #1 0;
73
else            x_valid_1d <= #1 x_valid;
74
 
75
wire xi_ready;
76
 
77
reg [2:0] cnt;
78
always @(posedge sclk or negedge rstn)
79
if              (!rstn)                 cnt <= #1 0;
80
else if (x_valid_1d)    cnt <= #1 cnt + 1;
81
 
82
assign xi_ready = (cnt == 7 && x_valid_1d) ? 1'b1 : 1'b0;
83
 
84
// at the ready time aligned and reversed
85
reg [N-1:0] x0_FF,x1_FF,x2_FF,x3_FF,x4_FF,x5_FF,x6_FF,x7_FF;
86
always @(posedge sclk or negedge rstn)
87
if (!rstn) begin
88
        x0_FF <= #1 0;
89
        x1_FF <= #1 0;
90
        x2_FF <= #1 0;
91
        x3_FF <= #1 0;
92
        x4_FF <= #1 0;
93
        x5_FF <= #1 0;
94
        x6_FF <= #1 0;
95
        x7_FF <= #1 0;
96
end
97
else if (xi_ready) begin
98
        x0_FF <= #1 x7;
99
        x1_FF <= #1 x6;
100
        x2_FF <= #1 x5;
101
        x3_FF <= #1 x4;
102
        x4_FF <= #1 x3;
103
        x5_FF <= #1 x2;
104
        x6_FF <= #1 x1;
105
        x7_FF <= #1 x0;
106
end
107
// +++ Data Preparation Step Finish +++ //
108
 
109
// delay for ... clocks to provide timing requirements
110
reg [13:0] xi_ready_d;
111
always @(posedge sclk or negedge rstn)
112
if (!rstn)      xi_ready_d[13:0] <= #1 0;
113
else            xi_ready_d[13:0] <= #1 {xi_ready_d[12:0],xi_ready};
114
 
115
// 1D Fast Hartley Transform - Decimation-in-Frequency Algorithm
116
 
117
// Butterfly Stage N1
118
// Data input [N-1:0] = N bits
119
// On the output of the 1st bfly is [N:0] = N+1 bits
120
 
121
// <<<--------- Butterfly Stage N1
122
wire [N:0] stg1_sum1;
123
wire [N:0] stg1_sum2;
124
wire [N:0] stg1_sum3;
125
wire [N:0] stg1_sum4;
126
 
127
wire [N:0] stg1_sub1;
128
wire [N:0] stg1_sub2;
129
wire [N:0] stg1_sub3;
130
wire [N:0] stg1_sub4;
131
 
132
fht_bfly_noFF #(N) u11_fht_bfly ({x0_FF},{x4_FF},stg1_sum1,stg1_sub1);
133
fht_bfly_noFF #(N) u12_fht_bfly ({x1_FF},{x5_FF},stg1_sum2,stg1_sub2);
134
fht_bfly_noFF #(N) u13_fht_bfly ({x2_FF},{x6_FF},stg1_sum3,stg1_sub3);
135
fht_bfly_noFF #(N) u14_fht_bfly ({x3_FF},{x7_FF},stg1_sum4,stg1_sub4);
136
 
137
// <<<--------- Butterfly Stage N2
138
wire [N+1:0] stg2_sum1;
139
wire [N+1:0] stg2_sum2;
140
wire [N+1:0] stg2_sum3;
141
 
142
wire [N+1:0] stg2_sub1;
143
wire [N+1:0] stg2_sub2;
144
wire [N+1:0] stg2_sub3;
145
 
146
fht_bfly #(N+1) u21_fht_bfly (rstn,sclk,xi_ready_d[1],stg1_sum1,stg1_sum3,stg2_sum1,stg2_sub1);
147
fht_bfly #(N+1) u22_fht_bfly (rstn,sclk,xi_ready_d[1],stg1_sum2,stg1_sum4,stg2_sum2,stg2_sub2);
148
fht_bfly #(N+1) u23_fht_bfly (rstn,sclk,xi_ready_d[1],stg1_sub1,stg1_sub3,stg2_sum3,stg2_sub3);
149
 
150
// Multiplier on the 2nd Stage
151
wire [N:0] mult_dat_1;
152
wire [N:0] mult_dat_2;
153
assign mult_dat_1 = stg1_sub2;
154
assign mult_dat_2 = stg1_sub4;
155
 
156
wire [N+1:0] mult_res1;
157
wire [N+1:0] mult_res2;
158
 
159
`ifdef USE_ASIC_MULT
160
        signed_mult_const_asic #(N+1) u_mult_1_fht (rstn,sclk,xi_ready_d[1],mult_dat_1,mult_res1);
161
        signed_mult_const_asic #(N+1) u_mult_2_fht (rstn,sclk,xi_ready_d[1],mult_dat_2,mult_res2);
162
`elsif USE_FPGA_MULT
163
        signed_mult_const_fpga #(N+1) u_mult_1_fht (rstn,sclk,xi_ready_d[1],mult_dat_1,mult_res1);
164
        signed_mult_const_fpga #(N+1) u_mult_2_fht (rstn,sclk,xi_ready_d[1],mult_dat_2,mult_res2);
165
`endif
166
 
167
// <<<--------- Butterfly Stage N3
168
wire [N+2:0] stg3_sum1;
169
wire [N+2:0] stg3_sum2;
170
wire [N+2:0] stg3_sum3;
171
wire [N+2:0] stg3_sum4;
172
 
173
wire [N+2:0] stg3_sub1;
174
wire [N+2:0] stg3_sub2;
175
wire [N+2:0] stg3_sub3;
176
wire [N+2:0] stg3_sub4;
177
 
178
fht_bfly #(N+2) u31_fht_bfly (rstn,sclk,xi_ready_d[3],stg2_sum1,stg2_sum2,stg3_sum1,stg3_sub1);
179
fht_bfly #(N+2) u32_fht_bfly (rstn,sclk,xi_ready_d[3],stg2_sub1,stg2_sub2,stg3_sum2,stg3_sub2);
180
fht_bfly #(N+2) u33_fht_bfly (rstn,sclk,xi_ready_d[3],stg2_sum3,mult_res1,stg3_sum3,stg3_sub3);
181
fht_bfly #(N+2) u34_fht_bfly (rstn,sclk,xi_ready_d[3],stg2_sub3,mult_res2,stg3_sum4,stg3_sub4);
182
 
183
// <<<--------- FHT Result
184
reg [N+2:0] h0_FF,h1_FF,h2_FF,h3_FF,h4_FF,h5_FF,h6_FF,h7_FF;
185
always @(posedge sclk or negedge rstn)
186
if (!rstn) begin
187
        h0_FF <= #1 0;
188
        h4_FF <= #1 0;
189
        h2_FF <= #1 0;
190
        h6_FF <= #1 0;
191
        h1_FF <= #1 0;
192
        h5_FF <= #1 0;
193
        h3_FF <= #1 0;
194
        h7_FF <= #1 0;
195
end
196
else if (xi_ready_d[5]) begin
197
        h0_FF <= #1 stg3_sum1;
198
        h4_FF <= #1 stg3_sub1;
199
        h2_FF <= #1 stg3_sum2;
200
        h6_FF <= #1 stg3_sub2;
201
        h1_FF <= #1 stg3_sum3;
202
        h5_FF <= #1 stg3_sub3;
203
        h3_FF <= #1 stg3_sum4;
204
        h7_FF <= #1 stg3_sub4;
205
end
206
 
207
assign h0_valid = xi_ready_d[6];
208
assign h1_valid = xi_ready_d[7];
209
assign h2_valid = xi_ready_d[8];
210
assign h3_valid = xi_ready_d[9];
211
assign h4_valid = xi_ready_d[10];
212
assign h5_valid = xi_ready_d[11];
213
assign h6_valid = xi_ready_d[12];
214
assign h7_valid = xi_ready_d[13];
215
 
216
wire    fht_valid_or;
217
assign  fht_valid_or =  h0_valid |
218
                                                h1_valid |
219
                                                h2_valid |
220
                                                h3_valid |
221
                                                h4_valid |
222
                                                h5_valid |
223
                                                h6_valid |
224
                                                h7_valid ;
225
 
226
wire [N+2:0] h_or_data;
227
assign h_or_data =
228
                                (h0_FF & {N+3{h0_valid}}) |
229
                                (h1_FF & {N+3{h1_valid}}) |
230
                                (h2_FF & {N+3{h2_valid}}) |
231
                                (h3_FF & {N+3{h3_valid}}) |
232
                                (h4_FF & {N+3{h4_valid}}) |
233
                                (h5_FF & {N+3{h5_valid}}) |
234
                                (h6_FF & {N+3{h6_valid}}) |
235
                                (h7_FF & {N+3{h7_valid}}) ;
236
 
237
reg     [N+2:0]  fht_data;
238
reg                     fht_valid;
239
 
240
always @(posedge sclk or negedge rstn)
241
if (!rstn)      fht_valid <= #1 0;
242
else            fht_valid <= #1 fht_valid_or;
243
 
244
always @(posedge sclk or negedge rstn)
245
if (!rstn)      fht_data <= #1 0;
246
else            fht_data <= #1 h_or_data;
247
 
248
endmodule

powered by: WebSVN 2.1.0

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