📄 jpeg_encoder.v
字号:
///////////////////////////////////////////////////////////////////////// //////// JPEG Encoder Unit //////// //////// Author: Richard Herveille //////// richard@asics.ws //////// www.asics.ws //////// ///////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2002 Richard Herveille //////// richard@asics.ws //////// //////// 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. //////// /////////////////////////////////////////////////////////////////////////// CVS Log//// $Id: jpeg_encoder.v,v 1.3 2002/10/31 12:51:44 rherveille Exp $//// $Date: 2002/10/31 12:51:44 $// $Revision: 1.3 $// $Author: rherveille $// $Locker: $// $State: Exp $//// Change History:// $Log: jpeg_encoder.v,v $// Revision 1.3 2002/10/31 12:51:44 rherveille// *** empty log message ***//// Revision 1.2 2002/10/23 18:58:51 rherveille// Fixed a bug in the zero-run (run-length-coder)//// Revision 1.1 2002/10/23 09:07:01 rherveille// Improved many files.// Fixed some bugs in Run-Length-Encoder.// Removed dependency on ud_cnt and ro_cnt.// Started (Motion)JPEG hardware encoder project.////synopsys translate_off`include "timescale.v"//synopsys translate_onmodule jpeg_encoder( clk, ena, rst, dstrb, din, qnt_val, qnt_cnt, size, rlen, amp, douten); // // parameters // //////////////////////////////////////////////////////////////////// // // // ITU-T.81, ITU-T.83 & Coefficient resolution notes // // // //////////////////////////////////////////////////////////////////// // // // Worst case error (all input values -128) is // // zero (i.e. no errors) when using 15bit coefficients // // // // Using less bits for the coefficients produces a biterror // // approx. equal to (15 - used_coefficient-bits). // // i.e. 14bit coefficients, errors in dout-bit[0] only // // 13bit coefficients, errors in dout-bits[1:0] // // 12bit coefficients, errors in dout-bits[2:0] etc. // // Tests with real non-continous tone image data have shown that // // even when using 13bit coefficients errors remain in the lsb // // only (i.e. dout-bit[0] // // // // The amount of coefficient-bits needed is dependent on the // // desired quality. // // The JPEG-standard compliance specs.(ITU-T.83) prescribe // // that the output of the combined DCT AND Quantization unit // // shall not exceed 1 for the desired quality. // // // // This means for high quantization levels, lesser bits // // for the DCT unit can be used. // // // // Looking at the recommended "quantization tables for generic // // compliance testing of DCT-based processes" (ITU-T.83 annex B) // // it can be noticed that relatively large quantization values // // are being used. Errors in the lower-order bits should // // therefore not be visible. // // Tests with real continuous and non-continous tone image data // // have shown that when using the examples quantization tables // // from ITU-T.81 annex K 10bit coefficients are sufficient to // // comply to the ITU-T.83 specs. Compliance tests have been met // // using as little as 9bit coefficients. // // For certain applications some of the lower-order bits could // // actually be discarded. When looking at the luminance and // // chrominance example quantization tables (ITU-T.81 annex K) // // it can be seen that the smallest quantization value is ten // // (qnt_val_min = 10). This means that the lowest 2bits can be // // discarded (set to zero '0') without having any effect on the // // final result. In this example 11 bit or 12 bit coefficients // // would be sufficient. // // // //////////////////////////////////////////////////////////////////// parameter coef_width = 11; parameter di_width = 8; // no function yet // // inputs & outputs // input clk; // system clock input ena; // clock enable input rst; // active low asynchronous reset input dstrb; // data-strobe. Present dstrb 1clk-cycle before data block input [di_width-1:0] din; input [7:0] qnt_val; // quantization value output [ 5:0] qnt_cnt; // quantization value address output [ 3:0] size; // size output [ 3:0] rlen; // run-length output [11:0] amp; // amplitude output douten; // data output enable // // variables // wire fdct_doe, qnr_doe; wire [11:0] fdct_dout; reg [11:0] dfdct_dout; wire [10:0] qnr_dout; reg dqnr_doe; // // module body // // Hookup FDCT & ZigZag module fdct #(coef_width, di_width, 12) fdct_zigzag( .clk(clk), .ena(ena), .rst(rst), .dstrb(dstrb), .din(din), .dout(fdct_dout), .douten(fdct_doe) ); // delay 'fdct_dout' => wait for synchronous quantization RAM/ROM always @(posedge clk) if(ena) dfdct_dout <= #1 fdct_dout; // Hookup QNR (Quantization and Rounding) unit jpeg_qnr qnr( .clk(clk), .ena(ena), .rst(rst), .dstrb(fdct_doe), .din(dfdct_dout), .qnt_val(qnt_val), .qnt_cnt(qnt_cnt), .dout(qnr_dout), .douten(qnr_doe) ); // delay douten 1 clk_cycle => account for delayed fdct_res & qnt_val always @(posedge clk) if(ena) dqnr_doe <= #1 qnr_doe; // // TODO: Insert DC differential generator here. // wire [11:0] dc_diff_dout = {qnr_dout[10], qnr_dout}; wire dc_diff_doe = dqnr_doe; // Hookup Run Length Encoder jpeg_rle rle( .clk(clk), .ena(ena), .rst(rst), .dstrb(dc_diff_doe), .din(dc_diff_dout), .size(size), .rlen(rlen), .amp(amp), .douten(douten), .bstart() );endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -