URL
https://opencores.org/ocsvn/jpegencode/jpegencode/trunk
Subversion Repositories jpegencode
[/] [jpegencode/] [trunk/] [y_dct.v] - Rev 5
Go to most recent revision | Compare with Previous | Blame | View Log
///////////////////////////////////////////////////////////////////// //// //// //// JPEG Encoder Core - Verilog //// //// //// //// Author: David Lundgren //// //// davidklun@gmail.com //// //// //// ///////////////////////////////////////////////////////////////////// //// //// //// Copyright (C) 2009 David Lundgren //// //// davidklun@gmail.com //// //// //// //// This source file may be used and distributed without //// //// restriction provided that this copyright statement is not //// //// removed from the file and that any derivative work contains //// //// the original copyright notice and the associated disclaimer.//// //// //// //// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// //// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// //// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// //// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// //// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// //// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// //// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// //// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// //// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// //// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// //// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// //// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// //// POSSIBILITY OF SUCH DAMAGE. //// //// //// ///////////////////////////////////////////////////////////////////// /* This module converts the incoming Y data. The incoming data is unsigned 8 bits, so the data is in the range of 0-255 Unlike a typical DCT, the data is not subtracted by 128 to center it around 0. It is only required for the first row, and instead of subtracting 128 from each pixel value, a total value can be subtracted at the end of the first row/column multiply, involving the 8 pixel values and the 8 DCT matrix values. For the other 7 rows of the DCT matrix, the values in each row add up to 0, so it is not necessary to subtract 128 from each Y, Cb, and Cr pixel value. Then the Discrete Cosine Transform is performed by multiplying the 8x8 pixel block values by the 8x8 DCT matrix. */ `timescale 1ns / 100ps module y_dct(clk, rst, enable, data_in, Z11_final, Z12_final, Z13_final, Z14_final, Z15_final, Z16_final, Z17_final, Z18_final, Z21_final, Z22_final, Z23_final, Z24_final, Z25_final, Z26_final, Z27_final, Z28_final, Z31_final, Z32_final, Z33_final, Z34_final, Z35_final, Z36_final, Z37_final, Z38_final, Z41_final, Z42_final, Z43_final, Z44_final, Z45_final, Z46_final, Z47_final, Z48_final, Z51_final, Z52_final, Z53_final, Z54_final, Z55_final, Z56_final, Z57_final, Z58_final, Z61_final, Z62_final, Z63_final, Z64_final, Z65_final, Z66_final, Z67_final, Z68_final, Z71_final, Z72_final, Z73_final, Z74_final, Z75_final, Z76_final, Z77_final, Z78_final, Z81_final, Z82_final, Z83_final, Z84_final, Z85_final, Z86_final, Z87_final, Z88_final, output_enable); input clk; input rst; input enable; input [7:0] data_in; output [10:0] Z11_final, Z12_final, Z13_final, Z14_final; output [10:0] Z15_final, Z16_final, Z17_final, Z18_final; output [10:0] Z21_final, Z22_final, Z23_final, Z24_final; output [10:0] Z25_final, Z26_final, Z27_final, Z28_final; output [10:0] Z31_final, Z32_final, Z33_final, Z34_final; output [10:0] Z35_final, Z36_final, Z37_final, Z38_final; output [10:0] Z41_final, Z42_final, Z43_final, Z44_final; output [10:0] Z45_final, Z46_final, Z47_final, Z48_final; output [10:0] Z51_final, Z52_final, Z53_final, Z54_final; output [10:0] Z55_final, Z56_final, Z57_final, Z58_final; output [10:0] Z61_final, Z62_final, Z63_final, Z64_final; output [10:0] Z65_final, Z66_final, Z67_final, Z68_final; output [10:0] Z71_final, Z72_final, Z73_final, Z74_final; output [10:0] Z75_final, Z76_final, Z77_final, Z78_final; output [10:0] Z81_final, Z82_final, Z83_final, Z84_final; output [10:0] Z85_final, Z86_final, Z87_final, Z88_final; output output_enable; integer T1, T21, T22, T23, T24, T25, T26, T27, T28, T31, T32, T33, T34, T52; integer Ti1, Ti21, Ti22, Ti23, Ti24, Ti25, Ti26, Ti27, Ti28, Ti31, Ti32, Ti33, Ti34, Ti52; reg [24:0] Y_temp_11; reg [24:0] Y11, Y21, Y31, Y41, Y51, Y61, Y71, Y81, Y11_final; reg [31:0] Y_temp_21, Y_temp_31, Y_temp_41, Y_temp_51; reg [31:0] Y_temp_61, Y_temp_71, Y_temp_81; reg [31:0] Z_temp_11, Z_temp_12, Z_temp_13, Z_temp_14; reg [31:0] Z_temp_15, Z_temp_16, Z_temp_17, Z_temp_18; reg [31:0] Z_temp_21, Z_temp_22, Z_temp_23, Z_temp_24; reg [31:0] Z_temp_25, Z_temp_26, Z_temp_27, Z_temp_28; reg [31:0] Z_temp_31, Z_temp_32, Z_temp_33, Z_temp_34; reg [31:0] Z_temp_35, Z_temp_36, Z_temp_37, Z_temp_38; reg [31:0] Z_temp_41, Z_temp_42, Z_temp_43, Z_temp_44; reg [31:0] Z_temp_45, Z_temp_46, Z_temp_47, Z_temp_48; reg [31:0] Z_temp_51, Z_temp_52, Z_temp_53, Z_temp_54; reg [31:0] Z_temp_55, Z_temp_56, Z_temp_57, Z_temp_58; reg [31:0] Z_temp_61, Z_temp_62, Z_temp_63, Z_temp_64; reg [31:0] Z_temp_65, Z_temp_66, Z_temp_67, Z_temp_68; reg [31:0] Z_temp_71, Z_temp_72, Z_temp_73, Z_temp_74; reg [31:0] Z_temp_75, Z_temp_76, Z_temp_77, Z_temp_78; reg [31:0] Z_temp_81, Z_temp_82, Z_temp_83, Z_temp_84; reg [31:0] Z_temp_85, Z_temp_86, Z_temp_87, Z_temp_88; reg [26:0] Z11, Z12, Z13, Z14, Z15, Z16, Z17, Z18; reg [26:0] Z21, Z22, Z23, Z24, Z25, Z26, Z27, Z28; reg [26:0] Z31, Z32, Z33, Z34, Z35, Z36, Z37, Z38; reg [26:0] Z41, Z42, Z43, Z44, Z45, Z46, Z47, Z48; reg [26:0] Z51, Z52, Z53, Z54, Z55, Z56, Z57, Z58; reg [26:0] Z61, Z62, Z63, Z64, Z65, Z66, Z67, Z68; reg [26:0] Z71, Z72, Z73, Z74, Z75, Z76, Z77, Z78; reg [26:0] Z81, Z82, Z83, Z84, Z85, Z86, Z87, Z88; reg [31:0] Y11_final_2, Y21_final_2, Y11_final_3, Y11_final_4, Y31_final_2, Y41_final_2; reg [31:0] Y51_final_2, Y61_final_2, Y71_final_2, Y81_final_2; reg [12:0] Y11_final_1, Y21_final_1, Y31_final_1, Y41_final_1; reg [12:0] Y51_final_1, Y61_final_1, Y71_final_1, Y81_final_1; reg [24:0] Y21_final, Y31_final, Y41_final, Y51_final; reg [24:0] Y61_final, Y71_final, Y81_final; reg [24:0] Y21_final_prev, Y21_final_diff; reg [24:0] Y31_final_prev, Y31_final_diff; reg [24:0] Y41_final_prev, Y41_final_diff; reg [24:0] Y51_final_prev, Y51_final_diff; reg [24:0] Y61_final_prev, Y61_final_diff; reg [24:0] Y71_final_prev, Y71_final_diff; reg [24:0] Y81_final_prev, Y81_final_diff; reg [10:0] Z11_final, Z12_final, Z13_final, Z14_final; reg [10:0] Z15_final, Z16_final, Z17_final, Z18_final; reg [10:0] Z21_final, Z22_final, Z23_final, Z24_final; reg [10:0] Z25_final, Z26_final, Z27_final, Z28_final; reg [10:0] Z31_final, Z32_final, Z33_final, Z34_final; reg [10:0] Z35_final, Z36_final, Z37_final, Z38_final; reg [10:0] Z41_final, Z42_final, Z43_final, Z44_final; reg [10:0] Z45_final, Z46_final, Z47_final, Z48_final; reg [10:0] Z51_final, Z52_final, Z53_final, Z54_final; reg [10:0] Z55_final, Z56_final, Z57_final, Z58_final; reg [10:0] Z61_final, Z62_final, Z63_final, Z64_final; reg [10:0] Z65_final, Z66_final, Z67_final, Z68_final; reg [10:0] Z71_final, Z72_final, Z73_final, Z74_final; reg [10:0] Z75_final, Z76_final, Z77_final, Z78_final; reg [10:0] Z81_final, Z82_final, Z83_final, Z84_final; reg [10:0] Z85_final, Z86_final, Z87_final, Z88_final; reg [2:0] count; reg [2:0] count_of, count_of_copy; reg count_1, count_3, count_4, count_5, count_6, count_7, count_8, enable_1, output_enable; reg count_9, count_10; reg [7:0] data_1; integer Y2_mul_input, Y3_mul_input, Y4_mul_input, Y5_mul_input; integer Y6_mul_input, Y7_mul_input, Y8_mul_input; integer Ti2_mul_input, Ti3_mul_input, Ti4_mul_input, Ti5_mul_input; integer Ti6_mul_input, Ti7_mul_input, Ti8_mul_input; always @(posedge clk) begin // DCT matrix entries T1 = 5793; // .3536 T21 = 8035; // .4904 T22 = 6811; // .4157 T23 = 4551; // .2778 T24 = 1598; // .0975 T25 = -1598; // -.0975 T26 = -4551; // -.2778 T27 = -6811; // -.4157 T28 = -8035; // -.4904 T31 = 7568; // .4619 T32 = 3135; // .1913 T33 = -3135; // -.1913 T34 = -7568; // -.4619 T52 = -5793; // -.3536 end always @(posedge clk) begin // The inverse DCT matrix entries Ti1 = 5793; // .3536 Ti21 = 8035; // .4904 Ti22 = 6811; // .4157 Ti23 = 4551; // .2778 Ti24 = 1598; // .0975 Ti25 = -1598; // -.0975 Ti26 = -4551; // -.2778 Ti27 = -6811; // -.4157 Ti28 = -8035; // -.4904 Ti31 = 7568; // .4619 Ti32 = 3135; // .1913 Ti33 = -3135; // -.1913 Ti34 = -7568; // -.4619 Ti52 = -5793; // -.3536 end always @(posedge clk) begin if (rst) begin Z_temp_11 <= 0; Z_temp_12 <= 0; Z_temp_13 <= 0; Z_temp_14 <= 0; Z_temp_15 <= 0; Z_temp_16 <= 0; Z_temp_17 <= 0; Z_temp_18 <= 0; Z_temp_21 <= 0; Z_temp_22 <= 0; Z_temp_23 <= 0; Z_temp_24 <= 0; Z_temp_25 <= 0; Z_temp_26 <= 0; Z_temp_27 <= 0; Z_temp_28 <= 0; Z_temp_31 <= 0; Z_temp_32 <= 0; Z_temp_33 <= 0; Z_temp_34 <= 0; Z_temp_35 <= 0; Z_temp_36 <= 0; Z_temp_37 <= 0; Z_temp_38 <= 0; Z_temp_41 <= 0; Z_temp_42 <= 0; Z_temp_43 <= 0; Z_temp_44 <= 0; Z_temp_45 <= 0; Z_temp_46 <= 0; Z_temp_47 <= 0; Z_temp_48 <= 0; Z_temp_51 <= 0; Z_temp_52 <= 0; Z_temp_53 <= 0; Z_temp_54 <= 0; Z_temp_55 <= 0; Z_temp_56 <= 0; Z_temp_57 <= 0; Z_temp_58 <= 0; Z_temp_61 <= 0; Z_temp_62 <= 0; Z_temp_63 <= 0; Z_temp_64 <= 0; Z_temp_65 <= 0; Z_temp_66 <= 0; Z_temp_67 <= 0; Z_temp_68 <= 0; Z_temp_71 <= 0; Z_temp_72 <= 0; Z_temp_73 <= 0; Z_temp_74 <= 0; Z_temp_75 <= 0; Z_temp_76 <= 0; Z_temp_77 <= 0; Z_temp_78 <= 0; Z_temp_81 <= 0; Z_temp_82 <= 0; Z_temp_83 <= 0; Z_temp_84 <= 0; Z_temp_85 <= 0; Z_temp_86 <= 0; Z_temp_87 <= 0; Z_temp_88 <= 0; end else if (enable_1 & count_8) begin Z_temp_11 <= Y11_final_4 * Ti1; Z_temp_12 <= Y11_final_4 * Ti2_mul_input; Z_temp_13 <= Y11_final_4 * Ti3_mul_input; Z_temp_14 <= Y11_final_4 * Ti4_mul_input; Z_temp_15 <= Y11_final_4 * Ti5_mul_input; Z_temp_16 <= Y11_final_4 * Ti6_mul_input; Z_temp_17 <= Y11_final_4 * Ti7_mul_input; Z_temp_18 <= Y11_final_4 * Ti8_mul_input; Z_temp_21 <= Y21_final_2 * Ti1; Z_temp_22 <= Y21_final_2 * Ti2_mul_input; Z_temp_23 <= Y21_final_2 * Ti3_mul_input; Z_temp_24 <= Y21_final_2 * Ti4_mul_input; Z_temp_25 <= Y21_final_2 * Ti5_mul_input; Z_temp_26 <= Y21_final_2 * Ti6_mul_input; Z_temp_27 <= Y21_final_2 * Ti7_mul_input; Z_temp_28 <= Y21_final_2 * Ti8_mul_input; Z_temp_31 <= Y31_final_2 * Ti1; Z_temp_32 <= Y31_final_2 * Ti2_mul_input; Z_temp_33 <= Y31_final_2 * Ti3_mul_input; Z_temp_34 <= Y31_final_2 * Ti4_mul_input; Z_temp_35 <= Y31_final_2 * Ti5_mul_input; Z_temp_36 <= Y31_final_2 * Ti6_mul_input; Z_temp_37 <= Y31_final_2 * Ti7_mul_input; Z_temp_38 <= Y31_final_2 * Ti8_mul_input; Z_temp_41 <= Y41_final_2 * Ti1; Z_temp_42 <= Y41_final_2 * Ti2_mul_input; Z_temp_43 <= Y41_final_2 * Ti3_mul_input; Z_temp_44 <= Y41_final_2 * Ti4_mul_input; Z_temp_45 <= Y41_final_2 * Ti5_mul_input; Z_temp_46 <= Y41_final_2 * Ti6_mul_input; Z_temp_47 <= Y41_final_2 * Ti7_mul_input; Z_temp_48 <= Y41_final_2 * Ti8_mul_input; Z_temp_51 <= Y51_final_2 * Ti1; Z_temp_52 <= Y51_final_2 * Ti2_mul_input; Z_temp_53 <= Y51_final_2 * Ti3_mul_input; Z_temp_54 <= Y51_final_2 * Ti4_mul_input; Z_temp_55 <= Y51_final_2 * Ti5_mul_input; Z_temp_56 <= Y51_final_2 * Ti6_mul_input; Z_temp_57 <= Y51_final_2 * Ti7_mul_input; Z_temp_58 <= Y51_final_2 * Ti8_mul_input; Z_temp_61 <= Y61_final_2 * Ti1; Z_temp_62 <= Y61_final_2 * Ti2_mul_input; Z_temp_63 <= Y61_final_2 * Ti3_mul_input; Z_temp_64 <= Y61_final_2 * Ti4_mul_input; Z_temp_65 <= Y61_final_2 * Ti5_mul_input; Z_temp_66 <= Y61_final_2 * Ti6_mul_input; Z_temp_67 <= Y61_final_2 * Ti7_mul_input; Z_temp_68 <= Y61_final_2 * Ti8_mul_input; Z_temp_71 <= Y71_final_2 * Ti1; Z_temp_72 <= Y71_final_2 * Ti2_mul_input; Z_temp_73 <= Y71_final_2 * Ti3_mul_input; Z_temp_74 <= Y71_final_2 * Ti4_mul_input; Z_temp_75 <= Y71_final_2 * Ti5_mul_input; Z_temp_76 <= Y71_final_2 * Ti6_mul_input; Z_temp_77 <= Y71_final_2 * Ti7_mul_input; Z_temp_78 <= Y71_final_2 * Ti8_mul_input; Z_temp_81 <= Y81_final_2 * Ti1; Z_temp_82 <= Y81_final_2 * Ti2_mul_input; Z_temp_83 <= Y81_final_2 * Ti3_mul_input; Z_temp_84 <= Y81_final_2 * Ti4_mul_input; Z_temp_85 <= Y81_final_2 * Ti5_mul_input; Z_temp_86 <= Y81_final_2 * Ti6_mul_input; Z_temp_87 <= Y81_final_2 * Ti7_mul_input; Z_temp_88 <= Y81_final_2 * Ti8_mul_input; end end always @(posedge clk) begin if (rst) begin Z11 <= 0; Z12 <= 0; Z13 <= 0; Z14 <= 0; Z15 <= 0; Z16 <= 0; Z17 <= 0; Z18 <= 0; Z21 <= 0; Z22 <= 0; Z23 <= 0; Z24 <= 0; Z25 <= 0; Z26 <= 0; Z27 <= 0; Z28 <= 0; Z31 <= 0; Z32 <= 0; Z33 <= 0; Z34 <= 0; Z35 <= 0; Z36 <= 0; Z37 <= 0; Z38 <= 0; Z41 <= 0; Z42 <= 0; Z43 <= 0; Z44 <= 0; Z45 <= 0; Z46 <= 0; Z47 <= 0; Z48 <= 0; Z51 <= 0; Z52 <= 0; Z53 <= 0; Z54 <= 0; Z55 <= 0; Z56 <= 0; Z57 <= 0; Z58 <= 0; Z61 <= 0; Z62 <= 0; Z63 <= 0; Z64 <= 0; Z65 <= 0; Z66 <= 0; Z67 <= 0; Z68 <= 0; Z71 <= 0; Z72 <= 0; Z73 <= 0; Z74 <= 0; Z75 <= 0; Z76 <= 0; Z77 <= 0; Z78 <= 0; Z81 <= 0; Z82 <= 0; Z83 <= 0; Z84 <= 0; Z85 <= 0; Z86 <= 0; Z87 <= 0; Z88 <= 0; end else if (count_8 & count_of == 1) begin Z11 <= 0; Z12 <= 0; Z13 <= 0; Z14 <= 0; Z15 <= 0; Z16 <= 0; Z17 <= 0; Z18 <= 0; Z21 <= 0; Z22 <= 0; Z23 <= 0; Z24 <= 0; Z25 <= 0; Z26 <= 0; Z27 <= 0; Z28 <= 0; Z31 <= 0; Z32 <= 0; Z33 <= 0; Z34 <= 0; Z35 <= 0; Z36 <= 0; Z37 <= 0; Z38 <= 0; Z41 <= 0; Z42 <= 0; Z43 <= 0; Z44 <= 0; Z45 <= 0; Z46 <= 0; Z47 <= 0; Z48 <= 0; Z51 <= 0; Z52 <= 0; Z53 <= 0; Z54 <= 0; Z55 <= 0; Z56 <= 0; Z57 <= 0; Z58 <= 0; Z61 <= 0; Z62 <= 0; Z63 <= 0; Z64 <= 0; Z65 <= 0; Z66 <= 0; Z67 <= 0; Z68 <= 0; Z71 <= 0; Z72 <= 0; Z73 <= 0; Z74 <= 0; Z75 <= 0; Z76 <= 0; Z77 <= 0; Z78 <= 0; Z81 <= 0; Z82 <= 0; Z83 <= 0; Z84 <= 0; Z85 <= 0; Z86 <= 0; Z87 <= 0; Z88 <= 0; end else if (enable & count_9) begin Z11 <= Z_temp_11 + Z11; Z12 <= Z_temp_12 + Z12; Z13 <= Z_temp_13 + Z13; Z14 <= Z_temp_14 + Z14; Z15 <= Z_temp_15 + Z15; Z16 <= Z_temp_16 + Z16; Z17 <= Z_temp_17 + Z17; Z18 <= Z_temp_18 + Z18; Z21 <= Z_temp_21 + Z21; Z22 <= Z_temp_22 + Z22; Z23 <= Z_temp_23 + Z23; Z24 <= Z_temp_24 + Z24; Z25 <= Z_temp_25 + Z25; Z26 <= Z_temp_26 + Z26; Z27 <= Z_temp_27 + Z27; Z28 <= Z_temp_28 + Z28; Z31 <= Z_temp_31 + Z31; Z32 <= Z_temp_32 + Z32; Z33 <= Z_temp_33 + Z33; Z34 <= Z_temp_34 + Z34; Z35 <= Z_temp_35 + Z35; Z36 <= Z_temp_36 + Z36; Z37 <= Z_temp_37 + Z37; Z38 <= Z_temp_38 + Z38; Z41 <= Z_temp_41 + Z41; Z42 <= Z_temp_42 + Z42; Z43 <= Z_temp_43 + Z43; Z44 <= Z_temp_44 + Z44; Z45 <= Z_temp_45 + Z45; Z46 <= Z_temp_46 + Z46; Z47 <= Z_temp_47 + Z47; Z48 <= Z_temp_48 + Z48; Z51 <= Z_temp_51 + Z51; Z52 <= Z_temp_52 + Z52; Z53 <= Z_temp_53 + Z53; Z54 <= Z_temp_54 + Z54; Z55 <= Z_temp_55 + Z55; Z56 <= Z_temp_56 + Z56; Z57 <= Z_temp_57 + Z57; Z58 <= Z_temp_58 + Z58; Z61 <= Z_temp_61 + Z61; Z62 <= Z_temp_62 + Z62; Z63 <= Z_temp_63 + Z63; Z64 <= Z_temp_64 + Z64; Z65 <= Z_temp_65 + Z65; Z66 <= Z_temp_66 + Z66; Z67 <= Z_temp_67 + Z67; Z68 <= Z_temp_68 + Z68; Z71 <= Z_temp_71 + Z71; Z72 <= Z_temp_72 + Z72; Z73 <= Z_temp_73 + Z73; Z74 <= Z_temp_74 + Z74; Z75 <= Z_temp_75 + Z75; Z76 <= Z_temp_76 + Z76; Z77 <= Z_temp_77 + Z77; Z78 <= Z_temp_78 + Z78; Z81 <= Z_temp_81 + Z81; Z82 <= Z_temp_82 + Z82; Z83 <= Z_temp_83 + Z83; Z84 <= Z_temp_84 + Z84; Z85 <= Z_temp_85 + Z85; Z86 <= Z_temp_86 + Z86; Z87 <= Z_temp_87 + Z87; Z88 <= Z_temp_88 + Z88; end end always @(posedge clk) begin if (rst) begin Z11_final <= 0; Z12_final <= 0; Z13_final <= 0; Z14_final <= 0; Z15_final <= 0; Z16_final <= 0; Z17_final <= 0; Z18_final <= 0; Z21_final <= 0; Z22_final <= 0; Z23_final <= 0; Z24_final <= 0; Z25_final <= 0; Z26_final <= 0; Z27_final <= 0; Z28_final <= 0; Z31_final <= 0; Z32_final <= 0; Z33_final <= 0; Z34_final <= 0; Z35_final <= 0; Z36_final <= 0; Z37_final <= 0; Z38_final <= 0; Z41_final <= 0; Z42_final <= 0; Z43_final <= 0; Z44_final <= 0; Z45_final <= 0; Z46_final <= 0; Z47_final <= 0; Z48_final <= 0; Z51_final <= 0; Z52_final <= 0; Z53_final <= 0; Z54_final <= 0; Z55_final <= 0; Z56_final <= 0; Z57_final <= 0; Z58_final <= 0; Z61_final <= 0; Z62_final <= 0; Z63_final <= 0; Z64_final <= 0; Z65_final <= 0; Z66_final <= 0; Z67_final <= 0; Z68_final <= 0; Z71_final <= 0; Z72_final <= 0; Z73_final <= 0; Z74_final <= 0; Z75_final <= 0; Z76_final <= 0; Z77_final <= 0; Z78_final <= 0; Z81_final <= 0; Z82_final <= 0; Z83_final <= 0; Z84_final <= 0; Z85_final <= 0; Z86_final <= 0; Z87_final <= 0; Z88_final <= 0; end else if (count_10 & count_of == 0) begin Z11_final <= Z11[15] ? Z11[26:16] + 1 : Z11[26:16]; Z12_final <= Z12[15] ? Z12[26:16] + 1 : Z12[26:16]; Z13_final <= Z13[15] ? Z13[26:16] + 1 : Z13[26:16]; Z14_final <= Z14[15] ? Z14[26:16] + 1 : Z14[26:16]; Z15_final <= Z15[15] ? Z15[26:16] + 1 : Z15[26:16]; Z16_final <= Z16[15] ? Z16[26:16] + 1 : Z16[26:16]; Z17_final <= Z17[15] ? Z17[26:16] + 1 : Z17[26:16]; Z18_final <= Z18[15] ? Z18[26:16] + 1 : Z18[26:16]; Z21_final <= Z21[15] ? Z21[26:16] + 1 : Z21[26:16]; Z22_final <= Z22[15] ? Z22[26:16] + 1 : Z22[26:16]; Z23_final <= Z23[15] ? Z23[26:16] + 1 : Z23[26:16]; Z24_final <= Z24[15] ? Z24[26:16] + 1 : Z24[26:16]; Z25_final <= Z25[15] ? Z25[26:16] + 1 : Z25[26:16]; Z26_final <= Z26[15] ? Z26[26:16] + 1 : Z26[26:16]; Z27_final <= Z27[15] ? Z27[26:16] + 1 : Z27[26:16]; Z28_final <= Z28[15] ? Z28[26:16] + 1 : Z28[26:16]; Z31_final <= Z31[15] ? Z31[26:16] + 1 : Z31[26:16]; Z32_final <= Z32[15] ? Z32[26:16] + 1 : Z32[26:16]; Z33_final <= Z33[15] ? Z33[26:16] + 1 : Z33[26:16]; Z34_final <= Z34[15] ? Z34[26:16] + 1 : Z34[26:16]; Z35_final <= Z35[15] ? Z35[26:16] + 1 : Z35[26:16]; Z36_final <= Z36[15] ? Z36[26:16] + 1 : Z36[26:16]; Z37_final <= Z37[15] ? Z37[26:16] + 1 : Z37[26:16]; Z38_final <= Z38[15] ? Z38[26:16] + 1 : Z38[26:16]; Z41_final <= Z41[15] ? Z41[26:16] + 1 : Z41[26:16]; Z42_final <= Z42[15] ? Z42[26:16] + 1 : Z42[26:16]; Z43_final <= Z43[15] ? Z43[26:16] + 1 : Z43[26:16]; Z44_final <= Z44[15] ? Z44[26:16] + 1 : Z44[26:16]; Z45_final <= Z45[15] ? Z45[26:16] + 1 : Z45[26:16]; Z46_final <= Z46[15] ? Z46[26:16] + 1 : Z46[26:16]; Z47_final <= Z47[15] ? Z47[26:16] + 1 : Z47[26:16]; Z48_final <= Z48[15] ? Z48[26:16] + 1 : Z48[26:16]; Z51_final <= Z51[15] ? Z51[26:16] + 1 : Z51[26:16]; Z52_final <= Z52[15] ? Z52[26:16] + 1 : Z52[26:16]; Z53_final <= Z53[15] ? Z53[26:16] + 1 : Z53[26:16]; Z54_final <= Z54[15] ? Z54[26:16] + 1 : Z54[26:16]; Z55_final <= Z55[15] ? Z55[26:16] + 1 : Z55[26:16]; Z56_final <= Z56[15] ? Z56[26:16] + 1 : Z56[26:16]; Z57_final <= Z57[15] ? Z57[26:16] + 1 : Z57[26:16]; Z58_final <= Z58[15] ? Z58[26:16] + 1 : Z58[26:16]; Z61_final <= Z61[15] ? Z61[26:16] + 1 : Z61[26:16]; Z62_final <= Z62[15] ? Z62[26:16] + 1 : Z62[26:16]; Z63_final <= Z63[15] ? Z63[26:16] + 1 : Z63[26:16]; Z64_final <= Z64[15] ? Z64[26:16] + 1 : Z64[26:16]; Z65_final <= Z65[15] ? Z65[26:16] + 1 : Z65[26:16]; Z66_final <= Z66[15] ? Z66[26:16] + 1 : Z66[26:16]; Z67_final <= Z67[15] ? Z67[26:16] + 1 : Z67[26:16]; Z68_final <= Z68[15] ? Z68[26:16] + 1 : Z68[26:16]; Z71_final <= Z71[15] ? Z71[26:16] + 1 : Z71[26:16]; Z72_final <= Z72[15] ? Z72[26:16] + 1 : Z72[26:16]; Z73_final <= Z73[15] ? Z73[26:16] + 1 : Z73[26:16]; Z74_final <= Z74[15] ? Z74[26:16] + 1 : Z74[26:16]; Z75_final <= Z75[15] ? Z75[26:16] + 1 : Z75[26:16]; Z76_final <= Z76[15] ? Z76[26:16] + 1 : Z76[26:16]; Z77_final <= Z77[15] ? Z77[26:16] + 1 : Z77[26:16]; Z78_final <= Z78[15] ? Z78[26:16] + 1 : Z78[26:16]; Z81_final <= Z81[15] ? Z81[26:16] + 1 : Z81[26:16]; Z82_final <= Z82[15] ? Z82[26:16] + 1 : Z82[26:16]; Z83_final <= Z83[15] ? Z83[26:16] + 1 : Z83[26:16]; Z84_final <= Z84[15] ? Z84[26:16] + 1 : Z84[26:16]; Z85_final <= Z85[15] ? Z85[26:16] + 1 : Z85[26:16]; Z86_final <= Z86[15] ? Z86[26:16] + 1 : Z86[26:16]; Z87_final <= Z87[15] ? Z87[26:16] + 1 : Z87[26:16]; Z88_final <= Z88[15] ? Z88[26:16] + 1 : Z88[26:16]; end end // output_enable signals the next block, the quantizer, that the input data is ready always @(posedge clk) begin if (rst) output_enable <= 0; else if (!enable_1) output_enable <= 0; else if (count_10 == 0 | count_of) output_enable <= 0; else if (count_10 & count_of == 0) output_enable <= 1; end always @(posedge clk) begin if (rst) Y_temp_11 <= 0; else if (enable) Y_temp_11 <= data_in * T1; end always @(posedge clk) begin if (rst) Y11 <= 0; else if (count == 1 & enable == 1) Y11 <= Y_temp_11; else if (enable) Y11 <= Y_temp_11 + Y11; end always @(posedge clk) begin if (rst) begin Y_temp_21 <= 0; Y_temp_31 <= 0; Y_temp_41 <= 0; Y_temp_51 <= 0; Y_temp_61 <= 0; Y_temp_71 <= 0; Y_temp_81 <= 0; end else if (!enable_1) begin Y_temp_21 <= 0; Y_temp_31 <= 0; Y_temp_41 <= 0; Y_temp_51 <= 0; Y_temp_61 <= 0; Y_temp_71 <= 0; Y_temp_81 <= 0; end else if (enable_1) begin Y_temp_21 <= data_1 * Y2_mul_input; Y_temp_31 <= data_1 * Y3_mul_input; Y_temp_41 <= data_1 * Y4_mul_input; Y_temp_51 <= data_1 * Y5_mul_input; Y_temp_61 <= data_1 * Y6_mul_input; Y_temp_71 <= data_1 * Y7_mul_input; Y_temp_81 <= data_1 * Y8_mul_input; end end always @(posedge clk) begin if (rst) begin Y21 <= 0; Y31 <= 0; Y41 <= 0; Y51 <= 0; Y61 <= 0; Y71 <= 0; Y81 <= 0; end else if (!enable_1) begin Y21 <= 0; Y31 <= 0; Y41 <= 0; Y51 <= 0; Y61 <= 0; Y71 <= 0; Y81 <= 0; end else if (enable_1) begin Y21 <= Y_temp_21 + Y21; Y31 <= Y_temp_31 + Y31; Y41 <= Y_temp_41 + Y41; Y51 <= Y_temp_51 + Y51; Y61 <= Y_temp_61 + Y61; Y71 <= Y_temp_71 + Y71; Y81 <= Y_temp_81 + Y81; end end always @(posedge clk) begin if (rst) begin count <= 0; count_3 <= 0; count_4 <= 0; count_5 <= 0; count_6 <= 0; count_7 <= 0; count_8 <= 0; count_9 <= 0; count_10 <= 0; end else if (!enable) begin count <= 0; count_3 <= 0; count_4 <= 0; count_5 <= 0; count_6 <= 0; count_7 <= 0; count_8 <= 0; count_9 <= 0; count_10 <= 0; end else if (enable) begin count <= count + 1; count_3 <= count_1; count_4 <= count_3; count_5 <= count_4; count_6 <= count_5; count_7 <= count_6; count_8 <= count_7; count_9 <= count_8; count_10 <= count_9; end end always @(posedge clk) begin if (rst) begin count_1 <= 0; end else if (count != 7 | !enable) begin count_1 <= 0; end else if (count == 7) begin count_1 <= 1; end end always @(posedge clk) begin if (rst) begin count_of <= 0; count_of_copy <= 0; end else if (!enable) begin count_of <= 0; count_of_copy <= 0; end else if (count_1 == 1) begin count_of <= count_of + 1; count_of_copy <= count_of_copy + 1; end end always @(posedge clk) begin if (rst) begin Y11_final <= 0; end else if (count_3 & enable_1) begin Y11_final <= Y11 - 25'd5932032; /* The Y values weren't centered on 0 before doing the DCT 128 needs to be subtracted from each Y value before, or in this case, 362 is subtracted from the total, because this is the total obtained by subtracting 128 from each element and then multiplying by the weight assigned by the DCT matrix : 128*8*5793 = 5932032 This is only needed for the first row, the values in the rest of the rows add up to 0 */ end end always @(posedge clk) begin if (rst) begin Y21_final <= 0; Y21_final_prev <= 0; Y31_final <= 0; Y31_final_prev <= 0; Y41_final <= 0; Y41_final_prev <= 0; Y51_final <= 0; Y51_final_prev <= 0; Y61_final <= 0; Y61_final_prev <= 0; Y71_final <= 0; Y71_final_prev <= 0; Y81_final <= 0; Y81_final_prev <= 0; end else if (!enable_1) begin Y21_final <= 0; Y21_final_prev <= 0; Y31_final <= 0; Y31_final_prev <= 0; Y41_final <= 0; Y41_final_prev <= 0; Y51_final <= 0; Y51_final_prev <= 0; Y61_final <= 0; Y61_final_prev <= 0; Y71_final <= 0; Y71_final_prev <= 0; Y81_final <= 0; Y81_final_prev <= 0; end else if (count_4 & enable_1) begin Y21_final <= Y21; Y21_final_prev <= Y21_final; Y31_final <= Y31; Y31_final_prev <= Y31_final; Y41_final <= Y41; Y41_final_prev <= Y41_final; Y51_final <= Y51; Y51_final_prev <= Y51_final; Y61_final <= Y61; Y61_final_prev <= Y61_final; Y71_final <= Y71; Y71_final_prev <= Y71_final; Y81_final <= Y81; Y81_final_prev <= Y81_final; end end always @(posedge clk) begin if (rst) begin Y21_final_diff <= 0; Y31_final_diff <= 0; Y41_final_diff <= 0; Y51_final_diff <= 0; Y61_final_diff <= 0; Y71_final_diff <= 0; Y81_final_diff <= 0; end else if (count_5 & enable_1) begin Y21_final_diff <= Y21_final - Y21_final_prev; Y31_final_diff <= Y31_final - Y31_final_prev; Y41_final_diff <= Y41_final - Y41_final_prev; Y51_final_diff <= Y51_final - Y51_final_prev; Y61_final_diff <= Y61_final - Y61_final_prev; Y71_final_diff <= Y71_final - Y71_final_prev; Y81_final_diff <= Y81_final - Y81_final_prev; end end always @(posedge clk) begin case (count) 3'b000: Y2_mul_input <= T21; 3'b001: Y2_mul_input <= T22; 3'b010: Y2_mul_input <= T23; 3'b011: Y2_mul_input <= T24; 3'b100: Y2_mul_input <= T25; 3'b101: Y2_mul_input <= T26; 3'b110: Y2_mul_input <= T27; 3'b111: Y2_mul_input <= T28; endcase end always @(posedge clk) begin case (count) 3'b000: Y3_mul_input <= T31; 3'b001: Y3_mul_input <= T32; 3'b010: Y3_mul_input <= T33; 3'b011: Y3_mul_input <= T34; 3'b100: Y3_mul_input <= T34; 3'b101: Y3_mul_input <= T33; 3'b110: Y3_mul_input <= T32; 3'b111: Y3_mul_input <= T31; endcase end always @(posedge clk) begin case (count) 3'b000: Y4_mul_input <= T22; 3'b001: Y4_mul_input <= T25; 3'b010: Y4_mul_input <= T28; 3'b011: Y4_mul_input <= T26; 3'b100: Y4_mul_input <= T23; 3'b101: Y4_mul_input <= T21; 3'b110: Y4_mul_input <= T24; 3'b111: Y4_mul_input <= T27; endcase end always @(posedge clk) begin case (count) 3'b000: Y5_mul_input <= T1; 3'b001: Y5_mul_input <= T52; 3'b010: Y5_mul_input <= T52; 3'b011: Y5_mul_input <= T1; 3'b100: Y5_mul_input <= T1; 3'b101: Y5_mul_input <= T52; 3'b110: Y5_mul_input <= T52; 3'b111: Y5_mul_input <= T1; endcase end always @(posedge clk) begin case (count) 3'b000: Y6_mul_input <= T23; 3'b001: Y6_mul_input <= T28; 3'b010: Y6_mul_input <= T24; 3'b011: Y6_mul_input <= T22; 3'b100: Y6_mul_input <= T27; 3'b101: Y6_mul_input <= T25; 3'b110: Y6_mul_input <= T21; 3'b111: Y6_mul_input <= T26; endcase end always @(posedge clk) begin case (count) 3'b000: Y7_mul_input <= T32; 3'b001: Y7_mul_input <= T34; 3'b010: Y7_mul_input <= T31; 3'b011: Y7_mul_input <= T33; 3'b100: Y7_mul_input <= T33; 3'b101: Y7_mul_input <= T31; 3'b110: Y7_mul_input <= T34; 3'b111: Y7_mul_input <= T32; endcase end always @(posedge clk) begin case (count) 3'b000: Y8_mul_input <= T24; 3'b001: Y8_mul_input <= T26; 3'b010: Y8_mul_input <= T22; 3'b011: Y8_mul_input <= T28; 3'b100: Y8_mul_input <= T21; 3'b101: Y8_mul_input <= T27; 3'b110: Y8_mul_input <= T23; 3'b111: Y8_mul_input <= T25; endcase end // Inverse DCT matrix entries always @(posedge clk) begin case (count_of_copy) 3'b000: Ti2_mul_input <= Ti28; 3'b001: Ti2_mul_input <= Ti21; 3'b010: Ti2_mul_input <= Ti22; 3'b011: Ti2_mul_input <= Ti23; 3'b100: Ti2_mul_input <= Ti24; 3'b101: Ti2_mul_input <= Ti25; 3'b110: Ti2_mul_input <= Ti26; 3'b111: Ti2_mul_input <= Ti27; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti3_mul_input <= Ti31; 3'b001: Ti3_mul_input <= Ti31; 3'b010: Ti3_mul_input <= Ti32; 3'b011: Ti3_mul_input <= Ti33; 3'b100: Ti3_mul_input <= Ti34; 3'b101: Ti3_mul_input <= Ti34; 3'b110: Ti3_mul_input <= Ti33; 3'b111: Ti3_mul_input <= Ti32; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti4_mul_input <= Ti27; 3'b001: Ti4_mul_input <= Ti22; 3'b010: Ti4_mul_input <= Ti25; 3'b011: Ti4_mul_input <= Ti28; 3'b100: Ti4_mul_input <= Ti26; 3'b101: Ti4_mul_input <= Ti23; 3'b110: Ti4_mul_input <= Ti21; 3'b111: Ti4_mul_input <= Ti24; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti5_mul_input <= Ti1; 3'b001: Ti5_mul_input <= Ti1; 3'b010: Ti5_mul_input <= Ti52; 3'b011: Ti5_mul_input <= Ti52; 3'b100: Ti5_mul_input <= Ti1; 3'b101: Ti5_mul_input <= Ti1; 3'b110: Ti5_mul_input <= Ti52; 3'b111: Ti5_mul_input <= Ti52; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti6_mul_input <= Ti26; 3'b001: Ti6_mul_input <= Ti23; 3'b010: Ti6_mul_input <= Ti28; 3'b011: Ti6_mul_input <= Ti24; 3'b100: Ti6_mul_input <= Ti22; 3'b101: Ti6_mul_input <= Ti27; 3'b110: Ti6_mul_input <= Ti25; 3'b111: Ti6_mul_input <= Ti21; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti7_mul_input <= Ti32; 3'b001: Ti7_mul_input <= Ti32; 3'b010: Ti7_mul_input <= Ti34; 3'b011: Ti7_mul_input <= Ti31; 3'b100: Ti7_mul_input <= Ti33; 3'b101: Ti7_mul_input <= Ti33; 3'b110: Ti7_mul_input <= Ti31; 3'b111: Ti7_mul_input <= Ti34; endcase end always @(posedge clk) begin case (count_of_copy) 3'b000: Ti8_mul_input <= Ti25; 3'b001: Ti8_mul_input <= Ti24; 3'b010: Ti8_mul_input <= Ti26; 3'b011: Ti8_mul_input <= Ti22; 3'b100: Ti8_mul_input <= Ti28; 3'b101: Ti8_mul_input <= Ti21; 3'b110: Ti8_mul_input <= Ti27; 3'b111: Ti8_mul_input <= Ti23; endcase end // Rounding stage always @(posedge clk) begin if (rst) begin data_1 <= 0; Y11_final_1 <= 0; Y21_final_1 <= 0; Y31_final_1 <= 0; Y41_final_1 <= 0; Y51_final_1 <= 0; Y61_final_1 <= 0; Y71_final_1 <= 0; Y81_final_1 <= 0; Y11_final_2 <= 0; Y21_final_2 <= 0; Y31_final_2 <= 0; Y41_final_2 <= 0; Y51_final_2 <= 0; Y61_final_2 <= 0; Y71_final_2 <= 0; Y81_final_2 <= 0; Y11_final_3 <= 0; Y11_final_4 <= 0; end else if (enable) begin data_1 <= data_in; Y11_final_1 <= Y11_final[11] ? Y11_final[24:12] + 1 : Y11_final[24:12]; Y11_final_2[31:13] <= Y11_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y11_final_2[12:0] <= Y11_final_1; // Need to sign extend Y11_final_1 and the other registers to store a negative // number as a twos complement number. If you don't sign extend, then a negative number // will be stored incorrectly as a positive number. For example, -215 would be stored // as 1833 without sign extending Y11_final_3 <= Y11_final_2; Y11_final_4 <= Y11_final_3; Y21_final_1 <= Y21_final_diff[11] ? Y21_final_diff[24:12] + 1 : Y21_final_diff[24:12]; Y21_final_2[31:13] <= Y21_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y21_final_2[12:0] <= Y21_final_1; Y31_final_1 <= Y31_final_diff[11] ? Y31_final_diff[24:12] + 1 : Y31_final_diff[24:12]; Y31_final_2[31:13] <= Y31_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y31_final_2[12:0] <= Y31_final_1; Y41_final_1 <= Y41_final_diff[11] ? Y41_final_diff[24:12] + 1 : Y41_final_diff[24:12]; Y41_final_2[31:13] <= Y41_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y41_final_2[12:0] <= Y41_final_1; Y51_final_1 <= Y51_final_diff[11] ? Y51_final_diff[24:12] + 1 : Y51_final_diff[24:12]; Y51_final_2[31:13] <= Y51_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y51_final_2[12:0] <= Y51_final_1; Y61_final_1 <= Y61_final_diff[11] ? Y61_final_diff[24:12] + 1 : Y61_final_diff[24:12]; Y61_final_2[31:13] <= Y61_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y61_final_2[12:0] <= Y61_final_1; Y71_final_1 <= Y71_final_diff[11] ? Y71_final_diff[24:12] + 1 : Y71_final_diff[24:12]; Y71_final_2[31:13] <= Y71_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y71_final_2[12:0] <= Y71_final_1; Y81_final_1 <= Y81_final_diff[11] ? Y81_final_diff[24:12] + 1 : Y81_final_diff[24:12]; Y81_final_2[31:13] <= Y81_final_1[12] ? 21'b111111111111111111111 : 21'b000000000000000000000; Y81_final_2[12:0] <= Y81_final_1; // The bit in place 11 is the fraction part, for rounding purposes // if it is 1, then you need to add 1 to the bits in 24-12, // if bit 11 is 0, then the bits in 24-12 won't change end end always @(posedge clk) begin if (rst) begin enable_1 <= 0; end else begin enable_1 <= enable; end end endmodule
Go to most recent revision | Compare with Previous | Blame | View Log