⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dct.v

📁 2维DCt源码
💻 V
📖 第 1 页 / 共 2 页
字号:
`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 + -