📄 dct.v
字号:
`timescale 1 ns / 1 ns
module dct(
clk,
rst,
di_1,di_2,di_3,di_4,di_5,di_6,di_7,di_8,
do_1,do_2,do_3,do_4,do_5,do_6,do_7,do_8,
ena
);
input rst;
input clk;
input ena;
input [15:0] di_1,di_2,di_3,di_4,di_5,di_6,di_7,di_8;
output [15:0] do_1,do_2,do_3,do_4,do_5,do_6,do_7,do_8;
reg [15:0] d1_1,d1_2,d1_3,d1_4,d1_5,d1_6,d1_7,d1_8;
reg [15:0] d2_1,d2_2,d2_3,d2_4,d2_5,d2_6,d2_7,d2_8;
reg [15:0] d2_9,d2_10,d2_11,d2_12,d2_13,d2_14,d2_15,d2_16;
reg [15:0] d2_17,d2_18,d2_19,d2_20;
reg [15:0] d3_1,d3_2,d3_3,d3_4,d3_5,d3_6,d3_7,d3_8;
reg [15:0] d3_9,d3_10,d3_11,d3_12,d3_13,d3_14;
reg [15:0] d4_1,d4_2,d4_3,d4_4,d4_5,d4_6,d4_7,d4_8;
wire [15:0] x1_1,x1_2,x1_3,x1_4,x1_5,x1_6,x1_7,x1_8;
wire [31:0] x2_1,x2_2,x2_3,x2_4,x2_5,x2_6,x2_7,x2_8;
wire [31:0] x2_9,x2_10,x2_11,x2_12,x2_13,x2_14,x2_15,x2_16;
wire [15:0] x2_17,x2_18,x2_19,x2_20;
wire [15:0] x3_1,x3_2,x3_3,x3_4,x3_5,x3_6,x3_7,x3_8;
wire [31:0] x3_9,x3_10,x3_11,x3_12;
wire [15:0] x3_13,x3_14;
wire [15:0] x4_1,x4_2,x4_3,x4_4,x4_5,x4_6;
wire [31:0] x4_7,x4_8;
wire [15:0] cos_1,cos_2,cos_3,cos_4,cos_5,cos_6,cos_7;
assign cos_1 = 2009;
assign cos_2 = 1892;
assign cos_3 = 1703;
assign cos_4 = 1448;
assign cos_5 = 1138;
assign cos_6 = 784;
assign cos_7 = 400;
//第一级流水线
assign x1_1 = di_1 + di_8; //P0 = x0 + x7;
assign x1_8 = di_1 - di_8; //M0 = x0 - x7;
assign x1_2 = di_2 + di_7; //P2 = x1 + x6;
assign x1_7 = di_2 - di_7; //M2 = x1 - x6;
assign x1_3 = di_3 + di_6; //P3 = x2 + x5;
assign x1_6 = di_3 - di_6; //M3 = x2 - x5;
assign x1_4 = di_4 + di_5; //P1 = x3 + x4;
assign x1_5 = di_4 - di_5; //M1 = x3 - x4;
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_1<=16'b0;
else if(ena==0)
d1_1<=16'b0;
else
case(x1_1[15:14])
2'b00:d1_1<=x1_1[15:0];
2'b01:d1_1<=16'h7fff;
2'b10:d1_1<=16'h8000;
2'b11:d1_1<=x1_1[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_2<=16'b0;
else if(ena==0)
d1_2<=16'b0;
else
case(x1_2[15:14])
2'b00:d1_2<=x1_2[15:0];
2'b01:d1_2<=16'h7fff;
2'b10:d1_2<=16'h8000;
2'b11:d1_2<=x1_2[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_3<=16'b0;
else if(ena==0)
d1_3<=16'b0;
else
case(x1_3[15:14])
2'b00:d1_3<=x1_3[15:0];
2'b01:d1_3<=16'h7fff;
2'b10:d1_3<=16'h8000;
2'b11:d1_3<=x1_3[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_4<=16'b0;
else if(ena==0)
d1_4<=16'b0;
else
case(x1_4[15:14])
2'b00:d1_4<=x1_4[15:0];
2'b01:d1_4<=16'h7fff;
2'b10:d1_4<=16'h8000;
2'b11:d1_4<=x1_4[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_5<=16'b0;
else if(ena==0)
d1_5<=16'b0;
else
case(x1_5[15:14])
2'b00:d1_5<=x1_5[15:0];
2'b01:d1_5<=16'h7fff;
2'b10:d1_5<=16'h8000;
2'b11:d1_5<=x1_5[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_6<=16'b0;
else if(ena==0)
d1_6<=16'b0;
else
case(x1_6[15:14])
2'b00:d1_6<=x1_6[15:0];
2'b01:d1_6<=16'h7fff;
2'b10:d1_6<=16'h8000;
2'b11:d1_6<=x1_6[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_7<=16'b0;
else if(ena==0)
d1_7<=16'b0;
else
case(x1_7[15:14])
2'b00:d1_7<=x1_7[15:0];
2'b01:d1_7<=16'h7fff;
2'b10:d1_7<=16'h8000;
2'b11:d1_7<=x1_7[15:0];
endcase
end
always @(negedge rst or posedge clk) //防溢出处理
begin
if(rst==0)
d1_8<=16'b0;
else if(ena==0)
d1_8<=16'b0;
else
case(x1_8[15:14])
2'b00:d1_8<=x1_8[15:0];
2'b01:d1_8<=16'h7fff;
2'b10:d1_8<=16'h8000;
2'b11:d1_8<=x1_8[15:0];
endcase
end
//第二级流水线
mul16x16 d1(
.dataa(d1_8),
.datab(cos_1),
.result(x2_1));//M0 x cos(pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_1<=16'b0;
else if(ena==0)
d2_1<=16'b0;
else
d2_1<=x2_1[26:11];
end
mul16x16 d2(
.dataa(d1_5),
.datab(cos_7),
.result(x2_2));//M1 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_2<=16'b0;
else if(ena==0)
d2_2<=16'b0;
else
d2_2<=x2_2[26:11];
end
mul16x16 d3(
.dataa(d1_8),
.datab(cos_7),
.result(x2_3));//M0 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_3<=16'b0;
else if(ena==0)
d2_3<=16'b0;
else
d2_3<=x2_3[26:11];
end
mul16x16 d4(
.dataa(d1_5),
.datab(cos_1),
.result(x2_4));//M1 x cos(pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_4<=16'b0;
else if(ena==0)
d2_4<=16'b0;
else
d2_4<=x2_4[26:11];
end
mul16x16 d5(
.dataa(d1_7),
.datab(cos_3),
.result(x2_5));//M2 x cos(3pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_5<=16'b0;
else if(ena==0)
d2_5<=16'b0;
else
d2_5<=x2_5[26:11];
end
mul16x16 d6(
.dataa(d1_6),
.datab(cos_5),
.result(x2_6));//M3 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_6<=16'b0;
else if(ena==0)
d2_6<=16'b0;
else
d2_6<=x2_6[26:11];
end
mul16x16 d7(
.dataa(d1_7),
.datab(cos_5),
.result(x2_7));//M2 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_7<=16'b0;
else if(ena==0)
d2_7<=16'b0;
else
d2_7<=x2_7[26:11];
end
mul16x16 d8(
.dataa(d1_6),
.datab(cos_3),
.result(x2_8));//M3 x cos(3pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_8<=16'b0;
else if(ena==0)
d2_8<=16'b0;
else
d2_8<=x2_8[26:11];
end
mul16x16 d9(
.dataa(d1_8),
.datab(cos_5),
.result(x2_9));//M0 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_9<=16'b0;
else if(ena==0)
d2_9<=16'b0;
else
d2_9<=x2_9[26:11];
end
mul16x16 d10(
.dataa(d1_5),
.datab(cos_3),
.result(x2_10));//M1 x cos(3pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_10<=16'b0;
else if(ena==0)
d2_10<=16'b0;
else
d2_10<=x2_10[26:11];
end
mul16x16 d11(
.dataa(d1_8),
.datab(cos_3),
.result(x2_11));//M0 x cos(3pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_11<=16'b0;
else if(ena==0)
d2_11<=16'b0;
else
d2_11<=x2_11[26:11];
end
mul16x16 d12(
.dataa(d1_5),
.datab(cos_5),
.result(x2_12));//M1 x cos(5pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_12<=16'b0;
else if(ena==0)
d2_12<=16'b0;
else
d2_12<=x2_12[26:11];
end
mul16x16 d13(
.dataa(d1_7),
.datab(cos_7),
.result(x2_13));//M2 x cos(7pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_13<=16'b0;
else if(ena==0)
d2_13<=16'b0;
else
d2_13<=x2_13[26:11];
end
mul16x16 d14(
.dataa(d1_6),
.datab(cos_1),
.result(x2_14));//M3 x cos(pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_14<=16'b0;
else if(ena==0)
d2_14<=16'b0;
else
d2_14<=x2_14[26:11];
end
mul16x16 d15(
.dataa(d1_7),
.datab(cos_1),
.result(x2_15));//M2 x cos(pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_15<=16'b0;
else if(ena==0)
d2_15<=16'b0;
else
d2_15<=x2_15[26:11];
end
mul16x16 d16(
.dataa(d1_6),
.datab(cos_7),
.result(x2_16));//M3 x cos(7pi/16)
always @(negedge rst or posedge clk)
begin
if(rst==0)
d2_16<=16'b0;
else if(ena==0)
d2_16<=16'b0;
else
d2_16<=x2_16[26:11];
end
assign x2_17 = d1_1 + d1_4; //P0 + P1
assign x2_18 = d1_1 - d1_4; //P0 - P1
assign x2_19 = d1_2 + d1_3; //P2 + P3
assign x2_20 = d1_2 - d1_3; //P2 - P3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -