反DCT变换的整个模块要经过2次矩阵相乘2次转秩,其实这两个矩阵相乘和转秩都是类似的,不同的是位宽有点区别,大同小异。
反DCT变换的最顶层模块:
idc
1 `timescale 1ps / 1ps
2 module idct (
3 clk,
4 rst_n,
5 datain_en,
6 datain,
7 idct_dataout_en,
8 idct_dataout
9 );
10
11
12 input clk;
13 input rst_n;
14 input datain_en;
15 input [11:0]datain;
16
17 output idct_dataout_en;
18 output [13:0]idct_dataout;
19 //---------------------------------------------------------------
20 wire OutEnable_1d;
21 wire [13:0]OutData_1d;
22 idct_1d u1 (
23 .clk (clk ),
24 .rst_n (rst_n ),
25 .datain_en (datain_en ),
26 .datain (datain ),
27 .dataout_en (OutEnable_1d ),
28 .dataout (OutData_1d )
29 );
30
31 //---------------------------------------------------------------
32 wire RamOutEnable;
33 wire [13:0]RamOutData;
34 idct_ram_control u2 (
35 .clk (clk ),
36 .rst_n (rst_n ),
37 .datain (OutData_1d ),
38 .datain_en (OutEnable_1d ),
39 .dataout (RamOutData ),
40 .dataout_en (RamOutEnable )
41 );
42 //---------------------------------------------------------------
43 wire OutEnable_2d;
44 wire [7:0]DataOut_2d;
45 idct_2d u3 (
46 .clk (clk ),
47 .rst_n (rst_n ),
48 .datain_en (RamOutEnable ),
49 .datain (RamOutData ),
50 .dataout_en (OutEnable_2d ),
51 .dataout (DataOut_2d )
52 );
53
54 //--------------------------------------------------------------
55 wire [13:0]q;
56 idct_ram_control u4 (
57 .clk (clk ),
58 .rst_n (rst_n ),
59 .datain ({6'b000000,DataOut_2d}),
60 .datain_en (OutEnable_2d ),
61 .dataout ( q ),
62 .dataout_en (idct_dataout_en )
63 );
64
65 assign idct_dataout=q[7:0];
66 endmodule
67
68
69
70
71
72
73
74
75
76
77
78
79
idct_1d和idct_2d分别表示第一次和第二次反DCT变换,比较类似,
2d
1 //------------------------------------------------------------------------------
2 //计算结果
3 always@(posedge clk or negedge rst_n)
4 if(~rst_n)
5 suma_out<=32'b0;
6 else
7 suma_out<=(suma1_reg+suma2_reg)+(suma3_reg+suma4_reg);
8
9
10 //IDCT转换的结果必须在 -128-127之间。
11 assign dataout=((!suma_out[31]&suma_out[23]))?8'h7f:
12 ((suma_out[31]&(!suma_out[23]))?8'h80:suma_out[23:16]);
13
不同的地方除了位宽不同还有就是上面的第10行开始,取结果的8位,并且判断-128—127之间。