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

📄 dve_ccir_fir.v

📁 全电视信号编码器
💻 V
字号:
// -----------------------------------------------------------------------------
//
//
//                  D I G I T A L   C O L O R   V I D E O   E N C O D E R
//       
//                  27 MHZ CCIR601/ITU-R BT-470.3 COMPLIANT
//
// Finite Impulse Response 5-TAP Symmetrical Low Pass Filter
// Version : 2.0
//
// Copyright (c) 1998 Maxim Vlassov (maxismsx@hotmail.com)
// 
//
// All rights reserved
//
// Redistribution and reuse of source code and synthesized forms of this source code and it's
// derivatives is strictly permitted under the following conditions:
//
// Redistributions of source code MUST retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// Redistributions of code in synthesized form MUST reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// Neither the name of the author nor the names of other contributors may
// be used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. 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.
//
// -----------------------------------------------------------------------------
//
// Any derivated work from the current design could be not synchronized with the
// latest design updates. Report any design reuse issues to the author.
// Lates release notes and design releases are available upon request via e-mail.
//
// -----------------------------------------------------------------------------
// USER NOTES: Transfer function is hardcoded into the Wallace tree operands:
// Z=X1*0.0625 + X2*0.25 + X3*0.375 + X4*0.25 + X5*0.0625, where
// X1,X2,X3,X4,X5 stand for a_in, b_in, c_in, d_in, e_in
// -----------------------------------------------------------------------------
//
//
// Revision history:
// Version 1.0 from 10/02/1998 - Initical version 
// Verison 1.1 from 01/04/1998 - Production version (minor changes, parametrization added)
// Version 1.2 - 1.9 - slight code optimization for FPGA implementation
// Version 2.0 from 01/01/2002 - NTSC mode / progressive/interlace scan modes implemented
//
//
// -----------------------------------------------------------------------------
//
// 5 operand Wallace tree is implemented
//
// -----------------------------------------------------------------------------
module dve_ccir_fir (
              c_a,
              c_b,
			  c_c,
			  c_d,
			  c_e,
              c_out);
			  
input [7 : 0] c_a,c_b,c_c,c_d,c_e;

output[15 : 0] c_out;

//wire [15 : 0]  c_out;

wire c_c_4_0,c_c_5_0,c_c_5_1,c_c_6_0,c_c_6_1,c_c_6_2,c_c_6_3,c_c_7_0,
     c_c_7_1,c_c_7_2,c_c_7_3,c_c_7_4,c_c_8_0,c_c_8_1,c_c_8_2,c_c_8_3,
     c_c_8_4,c_c_9_0,c_c_9_1,c_c_9_2,c_c_9_3,c_c_9_4,c_c_10_0,c_c_10_1,
     c_c_10_2,c_c_10_3,c_c_10_4,c_c_11_0,c_c_11_1,c_c_11_2,c_c_11_3,c_c_11_4,
     c_c_12_0,c_c_12_1,c_c_12_2,c_c_12_3,c_c_12_4,c_c_13_0,c_c_13_1,c_c_13_2,
     c_c_13_3,c_c_14_0,c_c_14_1,c_c_14_2,c_c_14_3;
     
wire c_o_5_0,c_o_6_0,c_o_6_1,c_o_6_2,c_o_7_0,c_o_7_1,c_o_7_2,c_o_7_3,
     c_o_8_0,c_o_8_1,c_o_8_2,c_o_8_3,c_o_9_0,c_o_9_1,c_o_9_2,
     c_o_9_3,c_o_10_0,c_o_10_1,c_o_10_2,c_o_10_3,c_o_11_0,c_o_11_1,
     c_o_11_2,c_o_11_3,c_o_12_0,c_o_12_1,c_o_12_2,c_o_12_3,c_o_13_0,
     c_o_13_1,c_o_13_2,c_o_14_0,c_o_14_1,c_o_14_2,c_o_15_0,c_o_15_1,c_o_15_2;

// -----------------------------------------------------------------------------
//
// Chrominance filer: Transfer function Z(1)*0.0625 + Z(2)*0.25 + Z(3)*0.375 +
//                                      Z(4)*0.25 + Z(5)*0.0625
// this equals to the following operation:  
//
//       15  14  13  12  11  10  09  08  07  06  05  04  03  02  01  00  
//        0   0   0   0 !ca7 ca6 ca5 ca4 ca3 ca2 ca1 ca0  0   0   0   0  
//        0   0   0   0 !ce7 ce6 ce5 ce4 ce3 ce2 ce1 ce0  0   0   0   0 
//        0   0   0 !cc7 cc6 cc5 cc4 cc3 cc2 cc1 cc0  0   0   0   0   0
//        0   0 !cc7 cc6 cc5 cc4 cc3 cc2 cc1 cc0  0   0   0   0   0   0
//        0   0 !cb7 cb6 cb5 cb4 cb3 cb2 cb1 cb0  0   0   0   0   0   0   
//        1   0 !cd7 cd6 cd5 cd4 cd3 cd2 cd1 cd0  0   0   0   0   0   0   
// -----------------------------------------------------------------------------
	 
assign c_out[3 : 0] = 4'b0;
//Inputs: c_a[0], c_e[0]
assign c_out[4] = ha(c_a[0],c_e[0]);
assign c_c_4_0  = hc(c_a[0],c_e[0]);
// Inputs: c_a[1],c_e[1],c_c[0],c_c_4_0
assign c_o_5_0  = fa(c_a[1],c_e[1],c_c[0]);
assign c_out[5] = ha(c_o_5_0,c_c_4_0);
assign c_c_5_0  = fc(c_a[1],c_e[1],c_c[0]);
assign c_c_5_1  = hc(c_o_5_0,c_c_4_0);
// Inputs: c_a[2],c_e[2],c_c[1],c_b[0],c_d[0],c_c[0],c_c_5_0,c_c_5_1
assign c_o_6_0  = fa(c_a[2],c_e[2],c_c[1]);
assign c_o_6_1  = ha(c_b[0],c_d[0]);
assign c_o_6_2  = fa(c_o_6_0,c_o_6_1,c_c[0]);
assign c_out[6] = fa(c_o_6_2,c_c_5_0,c_c_5_1);
assign c_c_6_0  = fc(c_a[2],c_e[2],c_c[1]);
assign c_c_6_1  = hc(c_b[0],c_d[0]);
assign c_c_6_2  = fc(c_o_6_0,c_o_6_1,c_c[0]);
assign c_c_6_3  = fc(c_o_6_2,c_c_5_0,c_c_5_1);
// Inputs: c_a[3],c_e[3],c_c[2],c_b[1],c_d[1],c_c[1],c_c_6_0,c_c_6_1,c_c_6_2,c_c_6_3
assign c_o_7_0  = fa(c_a[3],c_e[3],c_c[2]);
assign c_o_7_1  = fa(c_b[1],c_d[1],c_c[1]);
assign c_o_7_2  = ha(c_o_7_0,c_o_7_1);
assign c_o_7_3  = fa(c_c_6_0,c_c_6_1,c_c_6_2);
assign c_out[7] = fa(c_o_7_2,c_o_7_3,c_c_6_3);
assign c_c_7_0  = fc(c_a[3],c_e[3],c_c[2]);
assign c_c_7_1  = fc(c_b[1],c_d[1],c_c[1]);
assign c_c_7_2  = hc(c_o_7_0,c_o_7_1);
assign c_c_7_3  = fc(c_c_6_0,c_c_6_1,c_c_6_2);
assign c_c_7_4  = fc(c_o_7_2,c_o_7_3,c_c_6_3);
// Inputs: c_a[4],c_e[4],c_c[3],c_b[2],c_d[2],c_c[2],c_c_7_0,c_c_7_1,c_c_7_2,c_c_7_3,c_c_7_4,
assign c_o_8_0  = fa(c_a[4],c_e[4],c_c[3]);
assign c_o_8_1  = fa(c_b[2],c_d[2],c_c[2]);
assign c_o_8_2  = fa(c_o_8_0,c_o_8_1,c_c_7_0);
assign c_o_8_3  = fa(c_c_7_1,c_c_7_2,c_c_7_3);
assign c_out[8] = fa(c_o_8_2,c_o_8_3,c_c_7_4);
assign c_c_8_0  = fc(c_a[4],c_e[4],c_c[3]);
assign c_c_8_1  = fc(c_b[2],c_d[2],c_c[2]);
assign c_c_8_2  = fc(c_o_8_0,c_o_8_1,c_c_7_0);
assign c_c_8_3  = fc(c_c_7_1,c_c_7_2,c_c_7_3);
assign c_c_8_4  = fc(c_o_8_2,c_o_8_3,c_c_7_4);
// Inputs: c_a[5],c_e[5],c_c[4],c_b[3],c_d[3],c_c[3],c_c_8_0,c_c_8_1,c_c_8_2,c_c_8_3,c_c_8_4
assign c_o_9_0  = fa(c_a[5],c_e[5],c_c[4]);
assign c_o_9_1  = fa(c_b[3],c_d[3],c_c[3]);
assign c_o_9_2  = fa(c_o_9_0,c_o_9_1,c_c_8_0);
assign c_o_9_3  = fa(c_c_8_1,c_c_8_2,c_c_8_3);
assign c_out[9] = fa(c_o_9_2,c_o_9_3,c_c_8_4);
assign c_c_9_0  = fc(c_a[5],c_e[5],c_c[4]);
assign c_c_9_1  = fc(c_b[3],c_d[3],c_c[3]);
assign c_c_9_2  = fc(c_o_9_0,c_o_9_1,c_c_8_0);
assign c_c_9_3  = fc(c_c_8_1,c_c_8_2,c_c_8_3);
assign c_c_9_4  = fc(c_o_9_2,c_o_9_3,c_c_8_4);
// Inputs: c_a[6],c_e[6],c_c[5],c_b[4],c_d[4],c_c[4],c_c_9_0,c_c_9_1,c_c_9_2,c_c_9_3,c_c_9_4
assign c_o_10_0  = fa(c_a[6],c_e[6],c_c[5]);
assign c_o_10_1  = fa(c_b[4],c_d[4],c_c[4]);
assign c_o_10_2  = fa(c_o_10_0,c_o_10_1,c_c_9_0);
assign c_o_10_3  = fa(c_c_9_1,c_c_9_2,c_c_9_3);
assign c_out[10] = fa(c_o_10_2,c_o_10_3,c_c_9_4);
assign c_c_10_0  = fc(c_a[6],c_e[6],c_c[5]);
assign c_c_10_1  = fc(c_b[4],c_d[4],c_c[4]);
assign c_c_10_2  = fc(c_o_10_0,c_o_10_1,c_c_9_0);
assign c_c_10_3  = fc(c_c_9_1,c_c_9_2,c_c_9_3);
assign c_c_10_4  = fc(c_o_10_2,c_o_10_3,c_c_9_4);

// Inputs: !c_a[7],!c_e[7],c_c[6],c_b[5],c_d[5],c_c[5],c_c_10_0,c_c_10_1,c_c_10_2,c_c_10_3,c_c_10_4
assign c_o_11_0  = fa(c_a[7],c_e[7],c_c[6]);
assign c_o_11_1  = fa(c_b[5],c_d[5],c_c[5]);
assign c_o_11_2  = fa(c_o_11_0,c_o_11_1,c_c_10_0);
assign c_o_11_3  = fa(c_c_10_1,c_c_10_2,c_c_10_3);
assign c_out[11] = fa(c_o_11_2,c_o_11_3,c_c_10_4);
assign c_c_11_0  = ic(c_a[7],c_e[7],c_c[6]);
assign c_c_11_1  = fc(c_b[5],c_d[5],c_c[5]);
assign c_c_11_2  = fc(c_o_11_0,c_o_11_1,c_c_10_0);
assign c_c_11_3  = fc(c_c_10_1,c_c_10_2,c_c_10_3);
assign c_c_11_4  = fc(c_o_11_2,c_o_11_3,c_c_10_4);

// Inputs: !c_c[7],c_b[6],c_d[6],c_c[6],c_c_11_0,c_c_11_1,c_c_11_2,c_c_11_3,c_c_11_4
assign c_o_12_0  = ma(c_c[7],c_b[6],c_d[6]);
assign c_o_12_1  = fa(c_o_12_0,c_c[6],c_c_11_0);
assign c_o_12_2  = fa(c_c_11_1, c_c_11_2,c_c_11_3);
assign c_out[12] = fa(c_o_12_1,c_o_12_2,c_c_11_4);
assign c_c_12_0  = mc(c_c[7],c_b[6],c_d[6]);
assign c_c_12_1  = fc(c_o_12_0,c_c[6],c_c_11_0);
assign c_c_12_2  = fc(c_c_11_1, c_c_11_2,c_c_11_3);
assign c_c_12_3  = fc(c_o_12_1,c_o_12_2,c_c_11_4);

// Inputs: !c_c[7],!c_b[7],!c_d[7],c_c_12_0,c_c_12_1,c_c_12_2,c_c_12_3
assign c_o_13_0  = xa(c_b[7],c_c[7],c_d[7]);
assign c_o_13_1  = fa(c_c_12_0,c_c_12_1,c_c_12_2);
assign c_out[13] = fa(c_o_13_0,c_o_13_1,c_c_12_3);
assign c_c_13_0  = xc(c_b[7],c_c[7],c_d[7]);
assign c_c_13_1  = fc(c_c_12_0,c_c_12_1,c_c_12_2);
assign c_c_13_2  = fc(c_o_13_0,c_o_13_1,c_c_12_3);

// Inputs: c_c_13_0,c_c_13_1,c_c_13_2
assign c_out[14] = fa(c_c_13_0,c_c_13_1,c_c_13_2);
assign c_c_14_0  = fc(c_c_13_0,c_c_13_1,c_c_13_2);

// Inputs: c_a[7],c_b[7],c_c[7],c_d[7],c_e[7],c_c_14_0,c_c_14_1,c_c_14_2,c_c_14_3
assign c_out[15] = ~c_c_14_0;

// -----------------------------------------------------------------------------
//
// Set of basic arithmetic functions
//
// -----------------------------------------------------------------------------
// Full adder function
function fa;
 input a;
 input b;
 input c;
 begin
  fa=a^b^c;
 end
endfunction
// Half adder function
function ha;
 input a;
 input b;
 begin
  ha=a^b;
 end
endfunction
// Full carry generator
function fc;
 input a;
 input b;
 input c;
 begin
  fc=a&b | a&c | b&c;
 end
endfunction
// Half carry generator
function hc;
 input a;
 input b;
 begin
  hc=a&b;
 end
endfunction
// Full carry generator with two inverted inputs
function ic;
 input a;
 input b;
 input c;
 begin
  ic=(~a & ~b) | (~a  | ~b)&c;
 end
endfunction
// Full adder function with one inverted input
function ma;
 input a;
 input b;
 input c;
 begin
  ma=~a^b^c;
 end
endfunction
// Full carry generator with one inverted input
function mc;
 input a;
 input b;
 input c;
 begin
  mc=~a&b | ~a&c | b&c;
 end
endfunction
// Full adder function with all inverted input
function xa;
 input a;
 input b;
 input c;
 begin
  xa=~a^~b^~c;
 end
endfunction
// Full carry generator with all inverted input
function xc;
 input a;
 input b;
 input c;
 begin
  xc=~a&~b | ~a&~c | ~b&~c;
 end
endfunction

endmodule //dve_ccir_fir

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -