OpenCores
URL https://opencores.org/ocsvn/hamming/hamming/trunk

Subversion Repositories hamming

[/] [hamming/] [trunk/] [ham_7_4_enc/] [rtl/] [verilog/] [ham_7_4_enc1.v] - Rev 15

Compare with Previous | Blame | View Log

/////////////////////////////////////////////////////////////////////
////                                                             ////
////  Hamming (7,4) Encoder                                      ////
////                                                             ////
////                                                             ////
////  Author: Soner Yesil                                        ////
////          soneryesil@opencores.org                           ////
////                                                             ////
////                                                             ////
////  D/L from: http://www.opencores.org/cores/ham_7_4_enc/      ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
////                                                             ////
//// Copyright (C) 2004      Soner Yesil                         ////
////                         soneryesil@opencores.org            ////
////                                                             ////
//// 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.                                 ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
 
/*
 
Description
===========
 
1.Hamming (7,4) Encoder:
----------------------
This core encodes every 4-bit message into
7-bit codewords in such a way that the decoder
can correct any single-bit error.
 
The encoding is performed by matrix multiplication 
of the 4-bit message vector with the generator matrix, G.
 
C=M*G,
 
where 
*M is the 4-bit message M=[m1 m2 m3 m4]
*G is the generator matrix
 
		1110000
	G =   1001100
		0101010
		1101001
*and C is the corresponding codeword C=[c1 c2 c3 c4 c5 c6];
 
 
2.Functionality:
----------------
 
CLK : posedge clock.
RESET: active low asynchronous reset.
DATA_IN[3:0]: Message input, valid when DVIN is LOW.
DVIN: when LOW, data seen at the DATA_IN input is registered at rising edge of the CLK.
CODE[6:0]: corresponding codeword. It is valid when DVOUT is LOW.
DVOUT: when LOW, data at the output CODE is valid codeword.
 
 
*/
///////////////////////////////////
 
module ham_7_4_enc (
clk,
reset,
data_in,
dvin,
code,
dvout);
 
input clk, reset;
input [3:0] data_in;
input dvin;
 
output [6:0] code;
output dvout;
reg [6:0] code;
reg dvout;
 
reg [3:0] datareg;
reg dvinreg;
 
////////////////////////////////////////////
////// matrix multiplication ///////////////
////////////////////////////////////////////
 
wire c0 = datareg[3]^datareg[2]^datareg[0];
wire c1 = datareg[3]^datareg[1]^datareg[0];
wire c2 = datareg[3];
wire c3 = datareg[2]^datareg[1]^datareg[0];
wire c4 = datareg[2];
wire c5 = datareg[1];
wire c6 = datareg[0];
 
////////////////////////////////////////////
///////////// Getting inputs ///////////////
////////////////////////////////////////////
 
always@(posedge clk or negedge reset) 
if (!reset)
	dvinreg<=1;
else
	dvinreg<=dvin;
 
always@(posedge clk)
if (reset)
	datareg<=0;
else if (!dvin)
	datareg<=data_in;
 
 
 
////////////////////////////////////////////
// Codeword is generated 1-clock cycle /////
// after the inputs are registered.    /////
////////////////////////////////////////////
 
always@(posedge clk)
if (reset)
	dvout<=1;
else
	dvout<=dvinreg;
 
always@(posedge clk)
if (reset)
	code<=0;
else
	code<={c6, c5, c4, c3, c2, c1, c0};
 
 
endmodule
 
////////////////////////////////////////////
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.