reed muller error correcting code

86
. Acknowledgement An endeavor as demanding as research can never be successfully accomplished, but with the backing of people who stood by us during all travails of such a task, I could do it. So I take this golden opportunity to acknowledge all those who have directly or otherwise contributed to the success of my project. With most sincere and deepest sense of gratitude, I thank Mr. Sivarajan my guide for his valuable guidance and encouragement throughout the project. His immense encouragement and direction was the foremost to the completion of the project work. I am very grateful to my Head of the department Mrs. Siji, for her constant encouragement and valuable suggestions. I also thank Mrs. Babiyola, Mr. Balasubramanian and all other teachers who were of immense help to me through all phases of this course and the project

Upload: ramakrishnan-ranganathan

Post on 03-Mar-2016

247 views

Category:

Documents


1 download

DESCRIPTION

Final year Project

TRANSCRIPT

Page 1: Reed Muller Error Correcting Code

Acknowledgement

An endeavor as demanding as research can never be successfully accomplished but with the backing of people who stood by us during all travails of such a task I could do it So I take this golden opportunity to acknowledge all those who have directly or otherwise contributed to the success of my project

With most sincere and deepest sense of gratitude I thank Mr Sivarajan my guide for his valuable guidance and encouragement throughout the project His immense encouragement and direction was the foremost to the completion of the project work

I am very grateful to my Head of the department Mrs Siji for her constant encouragement and valuable suggestions I also thank Mrs Babiyola Mr Balasubramanian and all other teachers who were of immense help to me through all phases of this course and the project

Abstract

Reed Muller codes are some of the most effective error correcting codes Error correcting codes are very useful in sending information over long distances or through channels where errors might occur in the message They have become more prevalent as telecommunications have expanded and developed a use for codes that can self correct DEMuller as ISReed invented Reed Muller code in 1954In 1972 a Reed Muller was used to by Mariner 9 to transmit Black and white photographs of mars Reed Muller codes are relatively easy to decode and first order codes are especially efficient In high-reliability aerospace avionics and military applications single error correction (SEC) and double error detection (DED) may not provide adequate protection against faults This makes multiple-error correction (MEC) highly desirable Although many powerful error control methods including Reed-Solomon are capable of correcting multiple bytes of error the general drawback with these methods is latency (The time between initiating a request and receiving the answer) and speed Most of these codes require at least several dozen cycles to complete the first correction Fortunately Reed-Muller error control codes possess multiple bit error correction capability with relatively low latency and high performance

Description

Define Requirements

This block is going to specify the functionality of the device Specify all the IO

function constraints (to optimize) like Area Power Delay(Propagation Delay ) and

performance requirements

Schematic Entry amp HDL

The next block will include the architectural description to provide functional

description between InputOutput ports of the design Schematic entry includes

combinational logic design and RTL (Register Transfer Level)

Functional Description are written in HDL to achieve maximum reliability with

minimum development time and to have synchronous mechanism between concurrent flows

Simulation

To verify the functionality of the design This is done by forcing all the test scalars or

vectors to the design file As forcing the test values to the design consumes much time

writing a stimuli (TEST-BENCH) file would be the best way to verify the logic

1 Design file ndash Synthesizable HDL 2 Test-Bench ndash Non-Synthesizable HDL

Synthesis

The Synthesis stage generates a netlist from the HDL code The netlist is a lower

level abstraction of the code which will be used for the place and route process

Translate

Process to convert the gate-level netlist to a logical Boolean expression is said to be

Translate Then optimization (making the best out of the design) is done on the Boolean

expression by applying Karnaugh Map to reduce the redundant logic that is fetched

Place and Route

Place and Route are sub processes of Layout (geometric representation of a logic)

During the placement phase logic primitives are assigned to the physical location in the

environment selected as a target technology The main objective of placement is to ease

routing of the design Typically placement algorithms attempt to minimize the total expected

length of the interconnect required for the given placement In addition for specific target

technology such as for example gate arrays limited routing resources routing channel

congestions and delays imposed by interconnect have to be considered during the placement

phase The goal of a routing phase are not only 100 routed interconnect but the minimized

routing delays which are imposed due to the parasitic effects on interconnect and routing

resources

Configuration

Configuration is a process in which the circuit design (bitstream file) is downloaded

into the FPGA The method of configuring the FPGA determines the type of bitstream file

FPGA Chip

The process involved in this stage will only consist of the programming and encoding

of the chip itself not the actual fabrication and testing because the chip is already provided

INTRODUCTION

Error correcting codes are very useful in sending information over long

distances or through channels where errors might occur in the message They have become

more prevalent as telecommunications have expanded and developed a use for codes that can

self-correct Reed Muller co des were invented in 1954 by D E Muller and I S Reed In

1972 a Reed Muller code was used by Mariner 9 to transmit black and white photographs of

Mars Reed Muller codes are relatively easy to decode and first-order codes are especially

efficient

In high-reliability applications memory can sustain multiple soft errors (An error that

occurs occasionally which are said to be recoverable ) due to single or multiple event upsets

caused by environmental factors (cosmic neutrons alpha particles etc) The traditional

Hamming code with SEC-DED capability cannot address these types of errors It is possible

to use powerful non-binary BCH code such as Reed-Solomon code to address multiple-bit

errors However it could take at least a couple dozen cycles of latency to complete the first

correction and run at a relatively slow speed

This project explores the possibility of using Reed-Muller (RM) code in memory

interface applications to address multiple-bit soft errors RM code is one of the error

correction codes belonging to the Finite Geometry (A finite geometry is any geometric

system that has only a finite number of points) family Due to its orthogonal structure (Two

signals are said to be orthogonal if they can be completely separated using the proper basis

function [TDMA the basis fn is TIME SLOT][CDMA the basis fn is CHIPPING CODE])

it is relatively easy to decode using the Majority-Logic Decoding (MLD) method The

following section is a brief explanation of the construct and decoding of simple RM code

Definition of Terms and Operations

The vector spaces used in this paper consist of strings of length 2m where m is a

positive integer of numbers in F2 = f0 1g The codeword of a Reed_Muller code form a

subspace of such a space Vectors can be manipulated by three main operations addition

multiplication and the dot product For two vectors x = (x1 x2 xn) and y = (y1 y2

yn) addition is defined by

x + y = (x1 + y1 x2 + y2 xn + yn)

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 2: Reed Muller Error Correcting Code

Abstract

Reed Muller codes are some of the most effective error correcting codes Error correcting codes are very useful in sending information over long distances or through channels where errors might occur in the message They have become more prevalent as telecommunications have expanded and developed a use for codes that can self correct DEMuller as ISReed invented Reed Muller code in 1954In 1972 a Reed Muller was used to by Mariner 9 to transmit Black and white photographs of mars Reed Muller codes are relatively easy to decode and first order codes are especially efficient In high-reliability aerospace avionics and military applications single error correction (SEC) and double error detection (DED) may not provide adequate protection against faults This makes multiple-error correction (MEC) highly desirable Although many powerful error control methods including Reed-Solomon are capable of correcting multiple bytes of error the general drawback with these methods is latency (The time between initiating a request and receiving the answer) and speed Most of these codes require at least several dozen cycles to complete the first correction Fortunately Reed-Muller error control codes possess multiple bit error correction capability with relatively low latency and high performance

Description

Define Requirements

This block is going to specify the functionality of the device Specify all the IO

function constraints (to optimize) like Area Power Delay(Propagation Delay ) and

performance requirements

Schematic Entry amp HDL

The next block will include the architectural description to provide functional

description between InputOutput ports of the design Schematic entry includes

combinational logic design and RTL (Register Transfer Level)

Functional Description are written in HDL to achieve maximum reliability with

minimum development time and to have synchronous mechanism between concurrent flows

Simulation

To verify the functionality of the design This is done by forcing all the test scalars or

vectors to the design file As forcing the test values to the design consumes much time

writing a stimuli (TEST-BENCH) file would be the best way to verify the logic

1 Design file ndash Synthesizable HDL 2 Test-Bench ndash Non-Synthesizable HDL

Synthesis

The Synthesis stage generates a netlist from the HDL code The netlist is a lower

level abstraction of the code which will be used for the place and route process

Translate

Process to convert the gate-level netlist to a logical Boolean expression is said to be

Translate Then optimization (making the best out of the design) is done on the Boolean

expression by applying Karnaugh Map to reduce the redundant logic that is fetched

Place and Route

Place and Route are sub processes of Layout (geometric representation of a logic)

During the placement phase logic primitives are assigned to the physical location in the

environment selected as a target technology The main objective of placement is to ease

routing of the design Typically placement algorithms attempt to minimize the total expected

length of the interconnect required for the given placement In addition for specific target

technology such as for example gate arrays limited routing resources routing channel

congestions and delays imposed by interconnect have to be considered during the placement

phase The goal of a routing phase are not only 100 routed interconnect but the minimized

routing delays which are imposed due to the parasitic effects on interconnect and routing

resources

Configuration

Configuration is a process in which the circuit design (bitstream file) is downloaded

into the FPGA The method of configuring the FPGA determines the type of bitstream file

FPGA Chip

The process involved in this stage will only consist of the programming and encoding

of the chip itself not the actual fabrication and testing because the chip is already provided

INTRODUCTION

Error correcting codes are very useful in sending information over long

distances or through channels where errors might occur in the message They have become

more prevalent as telecommunications have expanded and developed a use for codes that can

self-correct Reed Muller co des were invented in 1954 by D E Muller and I S Reed In

1972 a Reed Muller code was used by Mariner 9 to transmit black and white photographs of

Mars Reed Muller codes are relatively easy to decode and first-order codes are especially

efficient

In high-reliability applications memory can sustain multiple soft errors (An error that

occurs occasionally which are said to be recoverable ) due to single or multiple event upsets

caused by environmental factors (cosmic neutrons alpha particles etc) The traditional

Hamming code with SEC-DED capability cannot address these types of errors It is possible

to use powerful non-binary BCH code such as Reed-Solomon code to address multiple-bit

errors However it could take at least a couple dozen cycles of latency to complete the first

correction and run at a relatively slow speed

This project explores the possibility of using Reed-Muller (RM) code in memory

interface applications to address multiple-bit soft errors RM code is one of the error

correction codes belonging to the Finite Geometry (A finite geometry is any geometric

system that has only a finite number of points) family Due to its orthogonal structure (Two

signals are said to be orthogonal if they can be completely separated using the proper basis

function [TDMA the basis fn is TIME SLOT][CDMA the basis fn is CHIPPING CODE])

it is relatively easy to decode using the Majority-Logic Decoding (MLD) method The

following section is a brief explanation of the construct and decoding of simple RM code

Definition of Terms and Operations

The vector spaces used in this paper consist of strings of length 2m where m is a

positive integer of numbers in F2 = f0 1g The codeword of a Reed_Muller code form a

subspace of such a space Vectors can be manipulated by three main operations addition

multiplication and the dot product For two vectors x = (x1 x2 xn) and y = (y1 y2

yn) addition is defined by

x + y = (x1 + y1 x2 + y2 xn + yn)

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 3: Reed Muller Error Correcting Code

Description

Define Requirements

This block is going to specify the functionality of the device Specify all the IO

function constraints (to optimize) like Area Power Delay(Propagation Delay ) and

performance requirements

Schematic Entry amp HDL

The next block will include the architectural description to provide functional

description between InputOutput ports of the design Schematic entry includes

combinational logic design and RTL (Register Transfer Level)

Functional Description are written in HDL to achieve maximum reliability with

minimum development time and to have synchronous mechanism between concurrent flows

Simulation

To verify the functionality of the design This is done by forcing all the test scalars or

vectors to the design file As forcing the test values to the design consumes much time

writing a stimuli (TEST-BENCH) file would be the best way to verify the logic

1 Design file ndash Synthesizable HDL 2 Test-Bench ndash Non-Synthesizable HDL

Synthesis

The Synthesis stage generates a netlist from the HDL code The netlist is a lower

level abstraction of the code which will be used for the place and route process

Translate

Process to convert the gate-level netlist to a logical Boolean expression is said to be

Translate Then optimization (making the best out of the design) is done on the Boolean

expression by applying Karnaugh Map to reduce the redundant logic that is fetched

Place and Route

Place and Route are sub processes of Layout (geometric representation of a logic)

During the placement phase logic primitives are assigned to the physical location in the

environment selected as a target technology The main objective of placement is to ease

routing of the design Typically placement algorithms attempt to minimize the total expected

length of the interconnect required for the given placement In addition for specific target

technology such as for example gate arrays limited routing resources routing channel

congestions and delays imposed by interconnect have to be considered during the placement

phase The goal of a routing phase are not only 100 routed interconnect but the minimized

routing delays which are imposed due to the parasitic effects on interconnect and routing

resources

Configuration

Configuration is a process in which the circuit design (bitstream file) is downloaded

into the FPGA The method of configuring the FPGA determines the type of bitstream file

FPGA Chip

The process involved in this stage will only consist of the programming and encoding

of the chip itself not the actual fabrication and testing because the chip is already provided

INTRODUCTION

Error correcting codes are very useful in sending information over long

distances or through channels where errors might occur in the message They have become

more prevalent as telecommunications have expanded and developed a use for codes that can

self-correct Reed Muller co des were invented in 1954 by D E Muller and I S Reed In

1972 a Reed Muller code was used by Mariner 9 to transmit black and white photographs of

Mars Reed Muller codes are relatively easy to decode and first-order codes are especially

efficient

In high-reliability applications memory can sustain multiple soft errors (An error that

occurs occasionally which are said to be recoverable ) due to single or multiple event upsets

caused by environmental factors (cosmic neutrons alpha particles etc) The traditional

Hamming code with SEC-DED capability cannot address these types of errors It is possible

to use powerful non-binary BCH code such as Reed-Solomon code to address multiple-bit

errors However it could take at least a couple dozen cycles of latency to complete the first

correction and run at a relatively slow speed

This project explores the possibility of using Reed-Muller (RM) code in memory

interface applications to address multiple-bit soft errors RM code is one of the error

correction codes belonging to the Finite Geometry (A finite geometry is any geometric

system that has only a finite number of points) family Due to its orthogonal structure (Two

signals are said to be orthogonal if they can be completely separated using the proper basis

function [TDMA the basis fn is TIME SLOT][CDMA the basis fn is CHIPPING CODE])

it is relatively easy to decode using the Majority-Logic Decoding (MLD) method The

following section is a brief explanation of the construct and decoding of simple RM code

Definition of Terms and Operations

The vector spaces used in this paper consist of strings of length 2m where m is a

positive integer of numbers in F2 = f0 1g The codeword of a Reed_Muller code form a

subspace of such a space Vectors can be manipulated by three main operations addition

multiplication and the dot product For two vectors x = (x1 x2 xn) and y = (y1 y2

yn) addition is defined by

x + y = (x1 + y1 x2 + y2 xn + yn)

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 4: Reed Muller Error Correcting Code

Translate

Process to convert the gate-level netlist to a logical Boolean expression is said to be

Translate Then optimization (making the best out of the design) is done on the Boolean

expression by applying Karnaugh Map to reduce the redundant logic that is fetched

Place and Route

Place and Route are sub processes of Layout (geometric representation of a logic)

During the placement phase logic primitives are assigned to the physical location in the

environment selected as a target technology The main objective of placement is to ease

routing of the design Typically placement algorithms attempt to minimize the total expected

length of the interconnect required for the given placement In addition for specific target

technology such as for example gate arrays limited routing resources routing channel

congestions and delays imposed by interconnect have to be considered during the placement

phase The goal of a routing phase are not only 100 routed interconnect but the minimized

routing delays which are imposed due to the parasitic effects on interconnect and routing

resources

Configuration

Configuration is a process in which the circuit design (bitstream file) is downloaded

into the FPGA The method of configuring the FPGA determines the type of bitstream file

FPGA Chip

The process involved in this stage will only consist of the programming and encoding

of the chip itself not the actual fabrication and testing because the chip is already provided

INTRODUCTION

Error correcting codes are very useful in sending information over long

distances or through channels where errors might occur in the message They have become

more prevalent as telecommunications have expanded and developed a use for codes that can

self-correct Reed Muller co des were invented in 1954 by D E Muller and I S Reed In

1972 a Reed Muller code was used by Mariner 9 to transmit black and white photographs of

Mars Reed Muller codes are relatively easy to decode and first-order codes are especially

efficient

In high-reliability applications memory can sustain multiple soft errors (An error that

occurs occasionally which are said to be recoverable ) due to single or multiple event upsets

caused by environmental factors (cosmic neutrons alpha particles etc) The traditional

Hamming code with SEC-DED capability cannot address these types of errors It is possible

to use powerful non-binary BCH code such as Reed-Solomon code to address multiple-bit

errors However it could take at least a couple dozen cycles of latency to complete the first

correction and run at a relatively slow speed

This project explores the possibility of using Reed-Muller (RM) code in memory

interface applications to address multiple-bit soft errors RM code is one of the error

correction codes belonging to the Finite Geometry (A finite geometry is any geometric

system that has only a finite number of points) family Due to its orthogonal structure (Two

signals are said to be orthogonal if they can be completely separated using the proper basis

function [TDMA the basis fn is TIME SLOT][CDMA the basis fn is CHIPPING CODE])

it is relatively easy to decode using the Majority-Logic Decoding (MLD) method The

following section is a brief explanation of the construct and decoding of simple RM code

Definition of Terms and Operations

The vector spaces used in this paper consist of strings of length 2m where m is a

positive integer of numbers in F2 = f0 1g The codeword of a Reed_Muller code form a

subspace of such a space Vectors can be manipulated by three main operations addition

multiplication and the dot product For two vectors x = (x1 x2 xn) and y = (y1 y2

yn) addition is defined by

x + y = (x1 + y1 x2 + y2 xn + yn)

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 5: Reed Muller Error Correcting Code

INTRODUCTION

Error correcting codes are very useful in sending information over long

distances or through channels where errors might occur in the message They have become

more prevalent as telecommunications have expanded and developed a use for codes that can

self-correct Reed Muller co des were invented in 1954 by D E Muller and I S Reed In

1972 a Reed Muller code was used by Mariner 9 to transmit black and white photographs of

Mars Reed Muller codes are relatively easy to decode and first-order codes are especially

efficient

In high-reliability applications memory can sustain multiple soft errors (An error that

occurs occasionally which are said to be recoverable ) due to single or multiple event upsets

caused by environmental factors (cosmic neutrons alpha particles etc) The traditional

Hamming code with SEC-DED capability cannot address these types of errors It is possible

to use powerful non-binary BCH code such as Reed-Solomon code to address multiple-bit

errors However it could take at least a couple dozen cycles of latency to complete the first

correction and run at a relatively slow speed

This project explores the possibility of using Reed-Muller (RM) code in memory

interface applications to address multiple-bit soft errors RM code is one of the error

correction codes belonging to the Finite Geometry (A finite geometry is any geometric

system that has only a finite number of points) family Due to its orthogonal structure (Two

signals are said to be orthogonal if they can be completely separated using the proper basis

function [TDMA the basis fn is TIME SLOT][CDMA the basis fn is CHIPPING CODE])

it is relatively easy to decode using the Majority-Logic Decoding (MLD) method The

following section is a brief explanation of the construct and decoding of simple RM code

Definition of Terms and Operations

The vector spaces used in this paper consist of strings of length 2m where m is a

positive integer of numbers in F2 = f0 1g The codeword of a Reed_Muller code form a

subspace of such a space Vectors can be manipulated by three main operations addition

multiplication and the dot product For two vectors x = (x1 x2 xn) and y = (y1 y2

yn) addition is defined by

x + y = (x1 + y1 x2 + y2 xn + yn)

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 6: Reed Muller Error Correcting Code

Reed-Muller codes are listed as RM(rm) where r is the order of the code and m is

parameter related to the length of code n = 2m RM codes are related to binary functions on

field F(2m) over the elements [01] RM(0m) codes are repetition codes RM(m-1m) codes

are parity check codes

An rth order Reed-Muller code RM(rm) is the set of all binary strings of length n =

2m associated with the Boolean polynomials p(x1 x2hellip xm) of degree at most r A Boolean

polynomial is a linear combination of Boolean monomials A Boolean monomial p in the

variables x1 x2 hellip xm is the expression of the form

The degree of a monomial is deduced (concluded) from its reduced form (after rules xixj =

xjxi and xi^ 2 = xi are applied) and it is equal to the number of variables This rule extends to

polynomials

Example of a polynomial of degree 3

For example the first order RM (13) code word size is 23 = 8 with single bit error correction

capability It has up to one in three variables 1 x1 x2 x3 in each monomial as follow

In the RM encoder the code word is created by the following matrix multiplication

Where M is the original message matrix G is the generator matrix and C is the resulting code

word

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 7: Reed Muller Error Correcting Code

The generation of the RM (13) code word C is described as

The RM (13) generator matrix is

The matrix multiplication results in the following encoder equations where Exclusive-OR operation is performed

To decode an incoming code word C back to its original message M each message

bit Mi is determined based on the majority of the corresponding orthogonal checksums Sik

generated from the incoming code word C In this case there are four checksums for each

original message bit M2 M1 and M0

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 8: Reed Muller Error Correcting Code

To decode an incoming code word C back to its original message M each message bit Mi is

determined based on the majority of the corresponding orthogonal checksums Sik generated

from the incoming code word C In this case there are four checksums for each original

message bit M2 M1 and M0

The orthogonal checksums for decoding the original message are shown in Table 1

Table 1 Orthogonal Checksums

The majority rules are simple if more than two checksums result in a 1 the original

message bit is 1 If more than two checksums result in a 0 the original message bit is 0

In the case of equal number of checksums resulting in 1s and 0s the original message bit is

undetermined In other words it has reached the correcting limit of this code However it is

important to note such an event also indicates the presence of quadruple error The decoder

should flag this as warning Furthermore any one group of the checksums can detect

quadruple error independently

To determine M3 another partial code word C needs to be constructed based on the result

of M2 M1 and M0 C is derived from the following equations

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 9: Reed Muller Error Correcting Code

Once C is determined add the original code word with C forming the checksum S3

S3 is eight bits long The same majority rule applies If more than four bits are 1s

M3 is 1 and if more than four bits are 0s M3 is 0 The following is an example of the

code in practice Assume the message is 0101 The resulting code word C is 01011010

Let C2 be the corrupted bit The code word becomes 01011110 The orthogonal checksums

Sik are shown in Table 2

Table 2 Example Orthogonal Checksums Sik

The individual message bit M2 M1 M0 decoding is done independent from others except

for M3 In this case a total of two stages are needed to decode the entire message The

decoding logic is relatively simple This allows RM code to be fast and low in latency

compared to equivalent cyclic code

Taking the majority of the checksums the message bits are M0 = 1 M1 = 0 and

M2 = 1 Based on this result C is 01011010 Add C with the original code word C

01011110 S3 becomes 00000100 Hence M3 = 0 In summary the original message is

0101 and the error position is C3 indicated by S3 Reed_Muller Code and Encoding

Matrices An rth order Reed_Muller code R(rm) is the set of all binary strings (vectors) of

length n = 2m associated with the Boolean polynomials p(x1 x2 xm) of degree at most

r The 0th order Reed_Muller code R(0m) consists of the binary strings associated with the

constant polynomials 0 and 1 that is

R(0m) = 0 1 = Rep(2m)

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 10: Reed Muller Error Correcting Code

Thus R(0m) is just a repetition of either zeros or ones of length 2m At the other

extreme the mth order Reed_Muller code R(mm) consists of all binary strings of length

2m To define the encoding matrix of R(rm) let the first row of the encoding matrix be 1 the

vector length 2m with all entries equal to 1 If r is equal to 0 then this row is the only one in

the encoding matrix If r is equal to 1 then add m rows corresponding to the vectors x1

x2 xm to the R(0m) encoding matrix To form a R(rm) encoding matrix where r is

greater than 1 add (mr ) rows to the R(r-1m) encoding matrix These added rows consist of

all the possible reduced degree r monomials that can be formed using the rows x1 x2 xm

For example when m = 3 we have

The rows x1x2 = 11000000 x1x3 = 10100000 and x2x3 = 10001000 are added to form

Finally the row x1x2x3 = 10000000 is added to form

Another example of a Reed_Muller encoding matrix is

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 11: Reed Muller Error Correcting Code

Encoding a message using Reed_Muller code R(rm) is straightforward Take the

code we are using to be R(rm) Its dimension I

In other words the encoding matrix has k rows We send messages in blocks of length k Let

m = (m1m2 mk) be a block the encoded message Mc is

where Ri is a row of the encoding matrix of R(rm)

For example using R(1 3) to encode m = (0110) gives

0 (11111111) + 1(11110000) +1(11001100) + 0 (10101010) = (00111100)

Similarly using R(2 4)to encode m =(10101110010) gives (0011100100000101)

Second Order Reed-Muller Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 12: Reed Muller Error Correcting Code

This reference design utilizes a second order 5th degree RM code to achieve multiple

bit error correction The message width of RM(25) code is 16 bits and the code word is 32

bits Thereare five variables X1 X2 X3 X4 X5 It can correct at most three random error

bits and detect four random error bits The generator matrix [G] is defined as

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 13: Reed Muller Error Correcting Code

The code word is generated similar to RM(13) mentioned previously For example code word bit 12 is generated as

For RM(25) code decoding is accomplished in three stages The first stage consists of eight checksums for each message bit from M9 to M0 As an example the checksums for M0 are

Majority vote is taken to decide if the message bit is 0 or 1 similar to the previously

described majority-rule method For example in first stage if there are five or more

equations yielding 1 then the corresponding message bit is 1 Likewise the message bit

is 0 if five or more equations yield a 0 If there are four equations yielding 1 and four

equations yielding 0 it indicates a quadruple error Hence the original message can not be

correctly decoded and the

result is an unknown message bit

Second stage decoding operates on the intermediate code word C It is created from the

decoded message bits from the first decoding stage

In this equation C is the original incoming code word G2 is the lower portion of the

generator matrix Second-stage checksum generator creates checksums based on the partial

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 14: Reed Muller Error Correcting Code

code word C There are sixteen checksums for each message bit from M14 to M10 The

same majority rules apply

Reference Design

The reference design consists of two components the encoder and the decoder They work independently as far as each component concerns They operate based on the RM(25) code mentioned in previous section

Encoder

The encoder takes 16-bit message and encodes into 32-bit code word based on the RM(25) matrix multiplication Figure 1 shows a block diagram of the encoder

Error Diagnostics

To test the system forced-error functions are part of the encoder Deliberate bit errors

can be injected in the code word at the output of the encoder The FORCE_ERROR pins

provide two error diagnostics modes

bull Normal Operation Mode

No bit error imposed on the output of the encoder

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 15: Reed Muller Error Correcting Code

bull Bit Error Mode

Depending on the mode-type set by the FORCE_ERROR pins Single double triple and

quadruple-bit error injection is supported In bit error mode one or more consecutive

bit(s) is reversed (0 becomes 1 or 1 becomes 0) in the code word on the rising edge of the

clock The sequence moves from low order bits to high order bits The sequence is

repeated as long as the error mode is active

Block Diagram for Encoder

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 16: Reed Muller Error Correcting Code

Decoder

Decoding Reed_Muller encoded messages is more complex than encoding them The theory

behind encoding and decoding is based on the distance between vectors The distance

between any two vectors is the number of places in the two vectors that have di_erent values

The distance between any two codewords in R(rm) code is 2m - r The basis for Reed_Muller

encoding is the assumption that the closest codeword in R(rm) to the received message is the

original encoded message Thus for e errors to be corrected in the received message the

distance between any two of the codewords in R(rm) must be greater than 2e

The decoding method used is not very e_cient but is straightforward to implement It checks

each row of the encoding matrix and uses majority logic to determine whether that row was

used in forming the encoding message Thus it is possible to determine what the error-less

encoded message was and what the original message was This method of decoding is given

by the following algorithm Apply Steps 1 and 2 below to each row of the matrix starting

from the bottom and working upwards

Step 1 Choose a row in the R(rm) encoding matrix Find 2m-r characteristic

vectors (this process is described below) for that row and then take the dot product of each of

those rows with the encoded message

Step 2 Take the majority of the values of the dot products and assign that value

to the coefficient of the row

Step 3 After doing Steps 1 and 2 for each row except the top row from the

bottom of the matrix up multiply each coeffcient by its corresponding row and add the

resulting vectors to form My Add this result to the received encoded message If the

resulting vector has more ones than zeros then the top rows coefficient is 1otherwise it is 0

Adding the top row multiplied by its coefficient to My gives the

original encoded message Thus we can identify the errors The vector formed by the

sequence of coefficients starting from the top row of the encoding matrix and ending with the

bottom row is the original message

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 17: Reed Muller Error Correcting Code

To find the characteristic vectors of any row of the matrix take the monomial r

associated with the row of the encoding matrix Then take E to be the set of all xi that are not

in the monomial r but are in the encoding matrix The characteristic vectors are the vectors

corresponding to the monomials in xi and ~xi such that exactly one of xi or ~xi is in each

monomial for all xi in E For example the last row of the encoding matrix R(2 4) is

associated with x3x4 so the characteristic vectors correspond to the following combinations

of x1 x2 ~x1 and ~x2 x1x2 x1x2 ~x1x2 ~x1~x2 These characteristic vectors have the

property that the dot product is zero with all the rows in R(rm) except therow to which the

characteristic vectors correspond

5 Example If the original message is m = (0110) using R(1 3) then the encoded

message is Mc = (00111100) Because the distance in R(1 3) is 2310485761 = 4 this code can

correct one error Let the encoded message after the error be Me = (10111100) The

characteristic vectors of the last row x3 = (10101010) are x1x2 x1_x2 _x1x2 and ~x1~x2

The vector associated with x1 is (11110000) so ~x1 = (00001111) The vector associated

with x2 is (11001100) so ~x2 = (00110011) Therefore we have x1x2 = (11000000) x1~x2

= (00110000) ~x1x2 = (00001100) and ~x1~x2 = (00000011) Taking the dot products of

these vectors with Me we get

(11000000) (10111100) = 1 (00110000) (10111100) = 0

(00001100) (10111100) = 0 (00000011) (10111100) = 0

We can conclude that the coefficient of x3 is 0

Doing the same for the second to last row of the matrix x2 = (11001100) we get

the characteristic vectors x1x3 x1~x3 ~x1x3 and ~x1~x3 These vectors are (10100000)

(01010000) (00001010) and (00000101) respectively Taking the dot products of these

vectors with Me we get

(10100000) (10111100) = 0 (01010000) (10111100) = 1

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 18: Reed Muller Error Correcting Code

(00001010) (10111100) = 1 (00000101) (10111100) = 1

So we can conclude that the coe_cient of x2 is 1 Doing the same for the second row of the

matrix x1 = (11110000) we get

(10001000) (10111100) = 0 (00100010) (10111100) = 1

(01000100) (10111100) = 1 (00010001) (10111100) = 1

We can conclude that the coe_cient for x1 is also 1 If we add 0 (10101010) and 1

(11001100) and 1 (11110000) we get My which is equal to (00111100) Then we see that

the sum of My and Me is equal to

(00111100) + (10111100) = (10000000)

This message has more zeros than ones so the coe_cient of the _rst row of the encoding

matrix is zero Thus we can put together coe_cients for the four rows of the matrix 011 and

0 and see that the original message was (0110) We can also see that the error was in the _rst

place of the error-free message Mc = (00111100)

Figure 2 shows the block diagram of the decoder

The decoder has three decoding stages Each stage is pipelined to maximize

performance It is possible to reduce latency (The condition of being temporarily inactive) all

the way to zero by removing pipelines at the expense (sacrifice) of performance

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 19: Reed Muller Error Correcting Code

The major components are the Orthogonal Checksum Generator (OCG) and Majority

Logic Decoder (MLD)

First stage decodes message bit 9 to 0

The second state decodes message bit 14 to 10

The third stage decodes message bit 15

With this method each subsequent stage operates on the decoded message bits from the previous immediate stage

Majority Logic Decoder

RM(rm) codes can be decoded using the majority logic decoding The basic idea of majority logic decoding is to build several checksums for each received code word element Since each of the different checksums must all have the same value (ie the value of the message word element weight) we can use a majority logic decoding to decipher the value of the message word element

Once each order of the polynomial is decoded the received word is modified

accordingly by removing the corresponding codewords weighted by the decoded message

contributions up to the present stage So for a r-th order RM code we have to decode

iteratively r+1 times before we arrive at the final received code-word Also the values of the

message bits are calculated through this scheme finally we can calculate the codeword by

multiplying the message word (just decoded) with the generator matrix

One clue if the decoding succeeded is to have an all-zero modified received word at the end

of r+1-stage decoding through the majority logic decoding This technique was proposed by

Irving S Reed and is more general when applied to other finite geometry codes

Check Sum Generator

A checksum is a form of redundancy check (a redundancy check is extra data

added to a message for the purposes of error detection) a simple way to protect the integrity

of data by detecting errors in data that are sent through space (telecommunications) or time

(storage) It works by adding up the basic components of a message typically the asserted

bits and storing the resulting value

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 20: Reed Muller Error Correcting Code

Anyone can later perform the same operation on the data compare the result to the

authentic checksum and (assuming that the sums match) conclude that the message was

probably not corrupted

Stage ndash1 Orthogonal Checksum generator

Majority Logic Coding_S1

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 21: Reed Muller Error Correcting Code

Block Diagram Stage -1

STAGE-2

1 Code Generator

2Orthogonal checksum generator

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 22: Reed Muller Error Correcting Code

Block Diagram of Orthogonal Checksum Generator

Waveform of Orthogonal Check Sum Generator

3 MLD

Block Diagram for MLD

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 23: Reed Muller Error Correcting Code

Waveform for MLD

STAGE 3

1 Orthogonal Check Sum Generator

Block Diagram for Orthogonal Check Sum generator

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 24: Reed Muller Error Correcting Code

Waveform of orthogonal checksum generator

2MLD

Block Diagram for MLD

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 25: Reed Muller Error Correcting Code

Waveform of MLD

Design Considerations

Concatenation

Two similar codes can be cascaded to expand the message width For a 32-bit wide

message two RM(25) codes are concatenated making C = X Y where X and Y are

independent RM(25) code Instead of combining two code words side by side

X0X31Y0Y31 it is recommended to interleave the code word such that the

combined code word is X0 Y0 X1 Y1X31Y31 This organization can enhance the

correcting capability of certain consecutive bit errors A concatenated 32-bit reference

design is also available

Use Models

For single-data rate (SDR) memory the external memory interface width should be

the same as the code word width For double-data rate (DDR) memory applications the

external memory interface width can either be the same as the code word width or the

message width (half the code word width) In the later case half the code word can be

accessed with both rising and falling edges at the memory In both cases the entire code word

is accessed in one cycle on theuser side

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 26: Reed Muller Error Correcting Code

FPGA

FPGA PROTOTYPING

Design Specifications

Chip design commences with design Specifications Like the design should have these

many no iprsquos oprsquos function propagation delay area power etc These ideas are then

translated into architectural and electrical specifications The architectural specifications

define the functionality and partitioning of the topmodule into several manageable blocks

while the electrical specifications define the relationship between the blocks in terms of

timing information

RTL CODING

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 27: Reed Muller Error Correcting Code

The next phase involves the implementation of these specifications In the past this

was achieved by manually drawing the schematics utilizing the components found in a cell

library(logic cells) This process was time consuming and was impractical for design reuse

To overcome this problem hardware description languages (HDL) were developed

As the name suggests the functionality of the design is coded using the HDL There are two

main HDLs in use today Verilog and VHDL

Initially developed HDL is VHDL (Very High Speed IC HDL)

Harder to learn

As design gets complex ndash designing using VHDL gets complexed

So to replace VHDL Language developers developed another HDL called Verilog

which is similar to Programming Language lsquo C lsquoNow Defence uses VHDL for security

purpose and Verilog is used for Commercial purpose

There are four levels of abstraction that may be used to represent the design Data

Flow level Behavioral sturcural RTL RTL is a combination of Data Level and Behavioural

level This type of coding is used to describe the functionality of the design and is

synthesizable to form a structural netlist This netlist comprises of the components from a

target library and their respective connections very similar to the schematic based approach

The design is coded using the RTL style in either Verilog or VHDL or bothIt can

also be partitioned if necessary into a number of smaller blocks to form a hierarchy with a

top-level block connecting all lower level blocks

Note Use proper coding techniques

eg like incomplete if and else statement infer LATCH

RTL Simulation

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 28: Reed Muller Error Correcting Code

The next step is to check the functionality of the design by simulating the RTL code

The design is simulated by forcing all possible input values covering your design So that

seems to be time consuming

Then designers started writing the stimuli for your design file which is called as

TESTBENCH for simulation This test bench is normally written in behavior HDL while the

actual design is coded in RTL It is important to note that the coverage of the design is

totally dependent on the number of tests performed and the quality of the test bench This is

the reason why a sound test bench is extremely critical to the design

Design File ndash Synthesizable HDL

Test-Bench File ndash Non-Synthesizable HDL

Logic Synthesis

The process of converting RTL code to the gate-level netlist This process is termed

as synthesis Synthesizing a design is an iterative process and begins with defining timing

constraints for each block of the design These timing constraints define the relationship of

each signal with respect to the clock input for a particular block In addition to the

constraints a file defining the synthesis environmentis also needed The environment file

specifies the technology cell libraries and other relevant information that DC uses during

synthesis The RTL code of the design and using the timing constraints synthesizes the code

to structural level thereby producing a mapped gate level netlist

Once you generate a netlist you can implement the design

bull Implementation includes many phases

ndash Translate Merge multiple design files into a single netlist

ndash Map Group logical symbols from the netlist (gates) into physical

components (slices and IOBs)

ndash Place amp Route Place components onto the chip connect the components

and extract timing data into reports

bull Once a design is implemented you must create a file that the FPGA can understand

ndash This file is called a bitstream a BIT file (bit extension)

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 29: Reed Muller Error Correcting Code

bull The BIT file can be downloaded directly into the FPGA or the BIT file can be

converted into a PROM file which stores the programming information

Floorplanning is the process of choosing the best grouping and connectivity of logic

in a design It is also the process of manually placing blocks of logic in an FPGA where the

goal is to increase density routability or performance

Why floor plan Floorplanning is an optional methodology that you can use to

improve the performance of your automatically placed and routed design Floorplanning is

particularly useful on structured designs and data path logic The Floorplanner helps you to

determine where to place logic in the floorplan for optimal results You can place data paths

at the desired location on the die

- Map Analyze TIming

Need for timing analysis

bull To check whether design is working at the specified frequency or not

bull To detect the bug in the early phase of design

bull To find the Redundant Logic

bull To reduce the NRE cost

- Place amp Route

bull Analyze timing

bull Analyze power

Transistor Used in Chip are CMOS because of its Two important characteristics of CMOS

devices are high noise immunity and low static power consumption Significant power is only

drawn when the transistors in the CMOS device are switching between on and off states

Consequently CMOS devices do not produce as much waste heat as other forms of logic for

example transistor-transistor logic (TTL) CMOS also allows a high density of logic

functions on a chip

Field Programmable Gate Arrays (FPGAs)

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 30: Reed Muller Error Correcting Code

Field Programmable Gate Arrays are called this because rather thanhaving a structure similar

to a PAL or other programmable device they are structured very much like a gate array

ASIC This makes FPGAs very nice for use in prototyping ASICs or in places where and

ASIC will eventually be used For example an FPGA maybe used in a design that need to get

to market quickly regardless of cost Later an ASIC can be used in place of the FPGA when

the production volume increases in order to reduce cost

FPGA Architectures

Each FPGA vendor has its own FPGA architecture but in general terms they are all a

variation of that shown in Figure 8 The architecture consists of configurable logic blocks

configurable IO blocks and programmable interconnect Also there will be clock circuitry

for driving the clock signals to each logic block and additional logic resources such as

ALUs memory and decoders may be available The two basic types of programmable

elements for an FPGA are Static RAM and anti-fuses

Configurable Logic Blocks

Configurable Logic Blocks contain the logic for the FPGA In a large grain

architecture these CLBs will contain enough logic to create a small state machine In a fine

grain architecture more like a true gate array ASIC the CLB

will contain only very basic logic The diagram in Figure 9 would be considered a large grain

block It contains RAM for creating arbitrary combinatorial logic

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 31: Reed Muller Error Correcting Code

functions It also contains flip-flops for clocked storage elements and multiplexers in order to

route the logic within the block and to and from

external resources The muxes also allow polarity selection and reset and clear

input selection

FPGA Configurable Logic Block

Configurable IO Blocks

A Configurable IO Block shown in Figure 10 is used to bring signals onto the chip and

send them back off again It consists of an input buffer and an output buffer with three state

and open collector output controls Typically there are pull up resistors on the outputs and

sometimes pull down resistorsThe polarity of the output can usually be programmed for

active high or active low output and often the slew rate of the output can be programmed for

fast or slow rise and fall times In addition there is often a flip-flop on outputs so that clocked

signals can be output directly to the pins without encountering significant delay It is done for

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 32: Reed Muller Error Correcting Code

inputs so that there is not much delay on a signal before reaching a flip-flop which would

increase the device hold time requirement

FPGA Configurable IO Block

Programmable Interconnect

The interconnect of an FPGA is very different than that of a CPLD but is rather similar to that of a gate array ASIC In Figure 11 a hierarchy of interconnect resources can be seen There are long lines which can be used to connect critical CLBs that are physically far from each other on the chip without inducing much delay They can also be used as buses within the chip There are also short lines which are used to connect individual CLBs which are located physically close to each other There is often one or several switch matrices like that in a CPLD to connect these long and short lines together in specific ways Programmable switches inside the chip allow the connection of CLBs to interconnect lines and interconnect lines to each other and to the switch matrix Three-state buffers are used to connect many CLBs to a long line creating a bus Special long lines called global clock lines are specially designed for low impedance and thus fast propagation times These are connected to the clock buffers and to each clocked element in each CLB This is how the clocks are distributed throughout the FPGA

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 33: Reed Muller Error Correcting Code

FPGA Programmable Interconnect

Clock Circuitry

Special IO blocks with special high drive clock buffers known as clock drivers are

distributed around the chip These buffers are connect to clock input pads and drive the clock

signals onto the global clock lines described above These clock lines are designed for low

skew times and fast propagation times As we will discuss later synchronous design is a must

with FPGAs since absolute skew and delay cannot be guaranteed Only when using clock

signals from clock buffers can the relative delays and skew times be guaranteed

Small vs Large Granularity

Small grain FPGAs resemble ASIC gate arrays in that the CLBs contain only small very

basic elements such as NAND gates NOR gates etc The philosophy

is that small elements can be connected to make larger functions without wasting too much

logic In a large grain FPGA where the CLB can contain two or more flip-flops a design

which does not need many flip-flops will leave many of them unused Unfortunately small

grain architectures require much more routing resources which take up space and insert a

large amount of delay which can more than compensate for the better utilization

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 34: Reed Muller Error Correcting Code

SRAM vs Anti-fuse Programming

There are two competing methods of programming FPGAs The first SRAM

programming involves small Static RAM bits for each programming element Writing the bit

with a zero turns off a switch while writing with a one turns on a switch The other method

involves anti-fuses which consist of microscopic structures which unlike a regular fuse

normally makes no connection A certain amount of current during programming of the

device causes the two sides of the anti-fuse to connect

The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays

The advantages of Anti-fuse based FPGAs are that they are non-volatile and the delays due to

routing are very small so they tend to be faster The disadvantages are that they require a

complex fabrication process they require an external programmer to program them and once

they are programmed they cannot be changed

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 35: Reed Muller Error Correcting Code

Software Programming

Encoder program

-----------------------------------------------------------------------------

encoder - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename encoderv

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module encoder(clk reset force_error datacode_out)

input clk

input reset

input [20]force_error

input [150] data

output [310] code_out

reg[310] single_error

reg[310] double_error

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 36: Reed Muller Error Correcting Code

reg[310] triple_error

reg[310] quad_error

reg[310] pent_error

reg [310] code_out

wire [310] enc_in

assign enc_in[0] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[1] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[10] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[2] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[10] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[3] = data[15] ^ data[12] ^ data[11] ^ data[10] ^ data[2] ^ data[1] ^ data[0]

assign enc_in[4] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[10] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[5] = data[15] ^ data[13] ^ data[11] ^ data[10] ^ data[4] ^ data[3] ^ data[0]

assign enc_in[6] = data[15] ^ data[14] ^ data[11] ^ data[10] ^ data[7] ^ data[6] ^ data[0]

assign enc_in[7] = data[15] ^ data[11] ^ data[10] ^ data[0]

assign enc_in[8] = data[15] ^ data[14] ^ data[13] ^ data[12]^ data[10] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[9] = data[15] ^ data[13] ^ data[12] ^ data[10] ^ data[5] ^ data[3] ^ data[1]

assign enc_in[10] = data[15] ^ data[14] ^ data[12] ^ data[10] ^ data[8] ^ data[6] ^ data[1]

assign enc_in[11] = data[15] ^ data[12] ^ data[10] ^ data[1]

assign enc_in[12] = data[15] ^ data[14] ^ data[13] ^ data[10] ^ data[9] ^ data[6] ^ data[3]

assign enc_in[13] = data[15] ^ data[13] ^ data[10] ^ data[3]

assign enc_in[14] = data[15] ^ data[14] ^ data[10] ^ data[6]

assign enc_in[15] = data[15] ^ data[10]

assign enc_in[16] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[17] = data[15] ^ data[13] ^ data[12] ^ data[11] ^ data[5] ^ data[4] ^ data[2]

assign enc_in[18] = data[15] ^ data[14] ^ data[12] ^ data[11] ^ data[8] ^ data[7] ^ data[2]

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 37: Reed Muller Error Correcting Code

assign enc_in[19] = data[15] ^ data[12] ^ data[11] ^ data[2]

assign enc_in[20] = data[15] ^ data[14] ^ data[13] ^ data[11] ^ data[9] ^ data[7] ^ data[4]

assign enc_in[21] = data[15] ^ data[13] ^ data[11] ^ data[4]

assign enc_in[22] = data[15] ^ data[14] ^ data[11] ^ data[7]

assign enc_in[23] = data[15] ^ data[11]

assign enc_in[24] = data[15] ^ data[14] ^ data[13] ^ data[12] ^ data[9] ^ data[8] ^ data[5]

assign enc_in[25] = data[15] ^ data[13] ^ data[12] ^ data[5]

assign enc_in[26] = data[15] ^ data[14] ^ data[12] ^ data[8]

assign enc_in[27] = data[15] ^ data[12]

assign enc_in[28] = data[15] ^ data[14] ^ data[13] ^ data[9]

assign enc_in[29] = data[15] ^ data[13]

assign enc_in[30] = data[15] ^ data[14]

assign enc_in[31] = data[15]

always (posedge clk or posedge reset)

begin single_error_gen

if (reset == 1b1)

begin

single_error lt= 32h00000001 1 represents LSB and 0 is MSB

end

else

begin

single_error[0] lt= single_error[31]

single_error[311] lt= single_error[300]

end

end

always (posedge clk or posedge reset)

begin double_error_gen

if (reset == 1b1)

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 38: Reed Muller Error Correcting Code

begin

double_error lt= 32h00000003 3 represents LSB nd 0 is MSB

end

else

begin

double_error[0] lt= double_error[31]

double_error[311] lt= double_error[300]

end

end

always (posedge clk or posedge reset)

begin triple_error_gen

if (reset == 1b1)

begin

triple_error lt= 32h00000007 7 represents LSB and 0 is MSB

end

else

begin

triple_error[0] lt= triple_error[31]

triple_error[311] lt= triple_error[300]

end

end

always (posedge clk or posedge reset)

begin quad_error_gen

if (reset == 1b1)

begin

quad_error lt= 32h0000000f

end

else

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 39: Reed Muller Error Correcting Code

begin

quad_error[0] lt= quad_error[31]

quad_error[311] lt= quad_error[300]

end

end

always (posedge clk or posedge reset)

begin pent_error_gen

if (reset == 1b1)

begin

pent_error lt= 32h0000001f

end

else

begin

pent_error[0] lt= pent_error[31]

pent_error[311] lt= pent_error[300]

end

end

always (enc_in or force_error or single_error or double_error or triple_error or quad_error or pent_error)

case (force_error)

3b000 code_out lt= enc_in ^ 32h00000000 0 error feedthrough

3b001 code_out lt= enc_in ^ single_error[310] 1 bit error walk-thru

3b010 code_out lt= enc_in ^ double_error[310] 2-bit error walk-thru

3b011 code_out lt= enc_in ^ triple_error[310]

3b100 code_out lt= enc_in ^ quad_error[310]

3b101 code_out lt= enc_in ^ pent_error[310]

default code_out lt= enc_in

endcase

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 40: Reed Muller Error Correcting Code

endmodule

The encoder implements the following RM[25] matrix

1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3 0 0 0 0 1 1 1 1 0 0 00 1 1 1 1 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4 0 0 0 0 0 0 0 0 1 1 11 1 1 1 1 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1

X1X2 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1 0 0 01 0 0 0 1 0 0 0 1

X1X3 0 0 0 0 0 1 0 1 0 0 00 0 1 0 1 0 0 0 0 0 1 01 0 0 0 0 0 1 0 1

X1X4 0 0 0 0 0 0 0 0 0 1 01 0 1 0 1 0 0 0 0 0 0 00 0 1 0 1 0 1 0 1

X1X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 1 0 1 0 1 01 0 1 0 1 0 1 0 1

X2X3 0 0 0 0 0 0 1 1 0 0 00 0 0 1 1 0 0 0 0 0 0 11 0 0 0 0 0 0 1 1

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 41: Reed Muller Error Correcting Code

X2X4 0 0 0 0 0 0 0 0 0 0 11 0 0 1 1 0 0 0 0 0 0 00 0 0 1 1 0 0 1 1

X2X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 0 0 11 0 0 1 1 0 0 1 1

X3X4 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1

X3X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 1 11 0 0 0 0 1 1 1 1

X4X5 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1

Code for ClockReset

`timescale 1ns100ps

module clkrst(clkinresetclk2x locked)

input clkin

input reset

output clk2x

output locked

wire clk0 clkfb clk2x_dcm clk

BUFG buf1 (I ( clk0 ) O ( clkfb ))

BUFG buf2 (I ( clk2x_dcm ) O ( clk2x ))

DCM DCM_inst (

CLK0(clk0) 0 degree DCM CLK ouptput

CLK180() 180 degree DCM CLK output

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 42: Reed Muller Error Correcting Code

CLK270() 270 degree DCM CLK output

CLK2X(clk2x_dcm) 2X DCM CLK output

CLK2X180() 2X 180 degree DCM CLK out

CLK90() 90 degree DCM CLK output

CLKDV() Divided DCM CLK out (CLKDV_DIVIDE)

CLKFX() DCM CLK synthesis out (MD)

CLKFX180() 180 degree CLK synthesis out

LOCKED(locked) DCM LOCK status output

PSDONE() Dynamic phase adjust done output

STATUS() 8-bit DCM status bits output

CLKFB(clkfb) DCM clock feedback

CLKIN(clkin) Clock input (from IBUFG BUFG or DCM)

DSSEN()

PSCLK() Dynamic phase adjust clock input

PSEN() Dynamic phase adjust enable input

PSINCDEC() Dynamic phase adjust incrementdecrement

RST(reset) DCM asynchronous reset input

)

Endmodule

Code for Orthogonal Checksum Generator 1

-----------------------------------------------------------------------------

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 43: Reed Muller Error Correcting Code

ocs_gen_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Orthogonal checksum generator 1

`timescale 1ns100ps

module ocs_gen_s1(code_inx9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1

x1_s1x0_s1)

input [310] code_in

output [70] x9_s1

output [70] x8_s1

output [70] x7_s1

output [70] x6_s1

output [70] x5_s1

output [70] x4_s1

output [70] x3_s1

output [70] x2_s1

output [70] x1_s1

output [70] x0_s1

assign x9_s1[7] = code_in[0] ^ code_in[1] ^ code_in[2] ^ code_in[3]

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 44: Reed Muller Error Correcting Code

assign x9_s1[6] = code_in[4] ^ code_in[5] ^ code_in[6] ^ code_in[7]

assign x9_s1[5] = code_in[8] ^ code_in[9] ^ code_in[10] ^ code_in[11]

assign x9_s1[4] = code_in[12] ^ code_in[13] ^ code_in[14] ^ code_in[15]

assign x9_s1[3] = code_in[16] ^ code_in[17] ^ code_in[18] ^ code_in[19]

assign x9_s1[2] = code_in[20] ^ code_in[21] ^ code_in[22] ^ code_in[23]

assign x9_s1[1] = code_in[24] ^ code_in[25] ^ code_in[26] ^ code_in[27]

assign x9_s1[0] = code_in[28] ^ code_in[29] ^ code_in[30] ^ code_in[31]

assign x8_s1[7] = code_in[0] ^ code_in[1] ^ code_in[4] ^ code_in[5]

assign x8_s1[6] = code_in[2] ^ code_in[3] ^ code_in[6] ^ code_in[7]

assign x8_s1[5] = code_in[8] ^ code_in[9] ^ code_in[12] ^ code_in[13]

assign x8_s1[4] = code_in[10] ^ code_in[11] ^ code_in[14] ^ code_in[15]

assign x8_s1[3] = code_in[16] ^ code_in[17] ^ code_in[20] ^ code_in[21]

assign x8_s1[2] = code_in[18] ^ code_in[19] ^ code_in[22] ^ code_in[23]

assign x8_s1[1] = code_in[24] ^ code_in[25] ^ code_in[28] ^ code_in[29]

assign x8_s1[0] = code_in[26] ^ code_in[27] ^ code_in[30] ^ code_in[31]

assign x7_s1[7] = code_in[9] ^ code_in[8] ^ code_in[1] ^ code_in[0]

assign x7_s1[6] = code_in[11] ^ code_in[10] ^ code_in[3] ^ code_in[2]

assign x7_s1[5] = code_in[13] ^ code_in[12] ^ code_in[5] ^ code_in[4]

assign x7_s1[4] = code_in[25] ^ code_in[24] ^ code_in[17] ^ code_in[16]

assign x7_s1[3] = code_in[15] ^ code_in[14] ^ code_in[7] ^ code_in[6]

assign x7_s1[2] = code_in[27] ^ code_in[26] ^ code_in[19] ^ code_in[18]

assign x7_s1[1] = code_in[29] ^ code_in[28] ^ code_in[21] ^ code_in[20]

assign x7_s1[0] = code_in[31] ^ code_in[30] ^ code_in[23] ^ code_in[22]

assign x6_s1[7] = code_in[17] ^ code_in[16] ^ code_in[1] ^ code_in[0]

assign x6_s1[6] = code_in[19] ^ code_in[18] ^ code_in[3] ^ code_in[2]

assign x6_s1[5] = code_in[21] ^ code_in[20] ^ code_in[5] ^ code_in[4]

assign x6_s1[4] = code_in[25] ^ code_in[24] ^ code_in[9] ^ code_in[8]

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 45: Reed Muller Error Correcting Code

assign x6_s1[3] = code_in[23] ^ code_in[22] ^ code_in[7] ^ code_in[6]

assign x6_s1[2] = code_in[27] ^ code_in[26] ^ code_in[11] ^ code_in[10]

assign x6_s1[1] = code_in[29] ^ code_in[28] ^ code_in[13] ^ code_in[12]

assign x6_s1[0] = code_in[31] ^ code_in[30] ^ code_in[15] ^ code_in[14]

assign x5_s1[7] = code_in[6] ^ code_in[4]^ code_in[2] ^ code_in[0]

assign x5_s1[6] = code_in[7] ^ code_in[5]^ code_in[3] ^ code_in[1]

assign x5_s1[5] = code_in[14] ^ code_in[12]^ code_in[10] ^ code_in[8]

assign x5_s1[4] = code_in[22] ^ code_in[20]^ code_in[18] ^ code_in[16]

assign x5_s1[3] = code_in[15] ^ code_in[13]^ code_in[11] ^ code_in[9]

assign x5_s1[2] = code_in[23] ^ code_in[21]^ code_in[19] ^ code_in[17]

assign x5_s1[1] = code_in[30] ^ code_in[28]^ code_in[26] ^ code_in[24]

assign x5_s1[0] = code_in[31] ^ code_in[29]^ code_in[27] ^ code_in[25]

assign x4_s1[7] = code_in[10] ^ code_in[8]^ code_in[2]^ code_in[0]

assign x4_s1[6] = code_in[11] ^ code_in[9]^ code_in[3]^ code_in[1]

assign x4_s1[5] = code_in[14] ^ code_in[12]^ code_in[6]^ code_in[4]

assign x4_s1[4] = code_in[26] ^ code_in[24]^ code_in[18]^ code_in[16]

assign x4_s1[3] = code_in[15] ^ code_in[13]^ code_in[7]^ code_in[5]

assign x4_s1[2] = code_in[27] ^ code_in[25]^ code_in[19]^ code_in[17]

assign x4_s1[1] = code_in[30] ^ code_in[28]^ code_in[22]^ code_in[20]

assign x4_s1[0] = code_in[31] ^ code_in[29]^ code_in[23]^ code_in[21]

assign x3_s1[7] = code_in[18] ^ code_in[16] ^ code_in[2]^ code_in[0]

assign x3_s1[6] = code_in[19] ^ code_in[17] ^ code_in[3]^ code_in[1]

assign x3_s1[5] = code_in[22] ^ code_in[20] ^ code_in[6]^ code_in[4]

assign x3_s1[4] = code_in[26] ^ code_in[24] ^ code_in[10]^ code_in[8]

assign x3_s1[3] = code_in[23] ^ code_in[21] ^ code_in[7]^ code_in[5]

assign x3_s1[2] = code_in[27] ^ code_in[25] ^ code_in[11]^ code_in[9]

assign x3_s1[1] = code_in[30] ^ code_in[28] ^ code_in[14]^ code_in[12]

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 46: Reed Muller Error Correcting Code

assign x3_s1[0] = code_in[31] ^ code_in[29] ^ code_in[15]^ code_in[13]

assign x2_s1[7] = code_in[12]^ code_in[8]^ code_in[4]^ code_in[0]

assign x2_s1[6] = code_in[13]^ code_in[9]^ code_in[5]^ code_in[1]

assign x2_s1[5] = code_in[14]^ code_in[10]^ code_in[6]^ code_in[2]

assign x2_s1[4] = code_in[28]^ code_in[24]^ code_in[20]^ code_in[16]

assign x2_s1[3] = code_in[15]^ code_in[11]^ code_in[7]^ code_in[3]

assign x2_s1[2] = code_in[29]^ code_in[25]^ code_in[21]^ code_in[17]

assign x2_s1[1] = code_in[30]^ code_in[26]^ code_in[22]^ code_in[18]

assign x2_s1[0] = code_in[31]^ code_in[27]^ code_in[23]^ code_in[19]

assign x1_s1[7] = code_in[20]^ code_in[16]^ code_in[4]^ code_in[0]

assign x1_s1[6] = code_in[21]^ code_in[17]^ code_in[5]^ code_in[1]

assign x1_s1[5] = code_in[22]^ code_in[18]^ code_in[6]^ code_in[2]

assign x1_s1[4] = code_in[28]^ code_in[24]^ code_in[12]^ code_in[8]

assign x1_s1[3] = code_in[23]^ code_in[19]^ code_in[7]^ code_in[3]

assign x1_s1[2] = code_in[29]^ code_in[25]^ code_in[13]^ code_in[9]

assign x1_s1[1] = code_in[30]^ code_in[26]^ code_in[14]^ code_in[10]

assign x1_s1[0] = code_in[31]^ code_in[27]^ code_in[15]^ code_in[11]

assign x0_s1[7] = code_in[24]^ code_in[16]^ code_in[8]^ code_in[0]

assign x0_s1[6] = code_in[25]^ code_in[17]^ code_in[9]^ code_in[1]

assign x0_s1[5] = code_in[26]^ code_in[18]^ code_in[10]^ code_in[2]

assign x0_s1[4] = code_in[28]^ code_in[20]^ code_in[12]^ code_in[4]

assign x0_s1[3] = code_in[27]^ code_in[19]^ code_in[11]^ code_in[3]

assign x0_s1[2] = code_in[29]^ code_in[21]^ code_in[13]^ code_in[5]

assign x0_s1[1] = code_in[30]^ code_in[22]^ code_in[14]^ code_in[6]

assign x0_s1[0] = code_in[31]^ code_in[23]^ code_in[15]^ code_in[7]

endmodule

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 47: Reed Muller Error Correcting Code

Code for Majority Logic Detector 1

-----------------------------------------------------------------------------

MLD_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 100ns1ns

module MLD_s1(clk reset x9_s1x8_s1x7_s1x6_s1x5_s1x4_s1x3_s1x2_s1x1_s1x0_s1x error)

input clk

input reset

input [70] x9_s1

input [70] x8_s1

input [70] x7_s1

input [70] x6_s1

input [70] x5_s1

input [70] x4_s1

input [70] x3_s1

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 48: Reed Muller Error Correcting Code

input [70] x2_s1

input [70] x1_s1

input [70] x0_s1

output [90] x

output [10] error

wire [70] xp [90]

wire [90] error_p

wire [90] y

wire [90] x

reg [10] error

wire [30] syndrome

always (posedge clk or posedge reset) begin

if (reset)

begin

error lt= 2b0

end

else

begin

case (syndrome)

4b0000 error lt= 2b00 inputs are all zeros - no error

4b1000 error lt= 2b00 inputs are all ones - no error

4b0001 error lt= 2b01

4b0010 error lt= 2b01

4b0011 error lt= 2b01

4b0101 error lt= 2b01

4b0110 error lt= 2b01

4b0111 error lt= 2b01

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 49: Reed Muller Error Correcting Code

4b0100 error lt= 2b10 four oneszeros quad error

default error lt= 2b11 invalid errors

endcase

end

end

assign syndrome = x0_s1[7] + x0_s1[6] + x0_s1[5] + x0_s1[4] + x0_s1[3] + x0_s1[2] + x0_s1[1] + x0_s1[0]

assign x = y

assign xp[9] = x9_s1 8-bit value is passed to 8-bit port

assign xp[8] = x8_s1

assign xp[7] = x7_s1

assign xp[6] = x6_s1

assign xp[5] = x5_s1

assign xp[4] = x4_s1

assign xp[3] = x3_s1

assign xp[2] = x2_s1

assign xp[1] = x1_s1

assign xp[0] = x0_s1

replicate(to duplicate) MLD for each bit using logic implementation

genvar i

generate

for (i=0 i lt 10 i=i+1)

begin u1_MLD

MLD_adder_s1 inst (

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 50: Reed Muller Error Correcting Code

datain(xp[i])

dataout(y[i])

)

end

endgenerate

endmodule

Code for Majority Logic Detector Adder

-----------------------------------------------------------------------------

MLD_adder_s1 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s1v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns 100ps

`timescale 100ps 1ps

module MLD_adder_s1(dataindataout)

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 51: Reed Muller Error Correcting Code

input [70] datain

output dataout

wire [30] sum

assign sum = datain[7] + datain[6] + datain[5] + datain[4] + datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[2] ^ sum[3] xor to reduce logic level

endmodule

Code for Code generator 2

-----------------------------------------------------------------------------

code_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename code_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 52: Reed Muller Error Correcting Code

-----------------------------------------------------------------------------

`timescale 1ns100ps

module code_gen_s2(datacode_in code_out)

input [90] data

input [310] code_in

output [310] code_out

assign code_out[0] = code_in[0] ^ data[9] ^ data[8] ^ data[7] ^ data[6] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[1] = code_in[1] ^ data[5] ^ data[4] ^ data[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[2] = code_in[2] ^ data[8] ^ data[7] ^ data[6] ^ data[2] ^ data[1] ^ data[0]

assign code_out[3] = code_in[3] ^ data[2] ^ data[1] ^ data[0]

assign code_out[4] = code_in[4] ^ data[9] ^ data[7] ^ data[6] ^ data[4] ^ data[3] ^ data[0]

assign code_out[5] = code_in[5] ^ data[4] ^ data[3] ^ data[0]

assign code_out[6] = code_in[6] ^ data[7] ^ data[6] ^ data[0]

assign code_out[7] = code_in[7] ^ data[0]

assign code_out[8] = code_in[8] ^ data[9] ^ data[8] ^ data[6] ^ data[5] ^ data[3] ^ data[1]

assign code_out[9] = code_in[9] ^ data[5] ^ data[3] ^ data[1]

assign code_out[10] = code_in[10] ^ data[8] ^ data[6] ^ data[1]

assign code_out[11] = code_in[11] ^ data[1]

assign code_out[12] = code_in[12] ^ data[9] ^ data[6] ^ data[3]

assign code_out[13] = code_in[13] ^ data[3]

assign code_out[14] = code_in[14] ^ data[6]

assign code_out[15] = code_in[15]

assign code_out[16] = code_in[16] ^ data[9] ^ data[8] ^ data[7] ^ data[5] ^ data[4] ^ data[2]

assign code_out[17] = code_in[17] ^ data[5] ^ data[4] ^ data[2]

assign code_out[18] = code_in[18] ^ data[8] ^ data[7] ^ data[2]

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 53: Reed Muller Error Correcting Code

assign code_out[19] = code_in[19] ^ data[2]

assign code_out[20] = code_in[20] ^ data[9] ^ data[7] ^ data[4]

assign code_out[21] = code_in[21] ^ data[4]

assign code_out[22] = code_in[22] ^ data[7]

assign code_out[23] = code_in[23]

assign code_out[24] = code_in[24] ^ data[9] ^ data[8] ^ data[5]

assign code_out[25] = code_in[25] ^ data[5]

assign code_out[26] = code_in[26] ^ data[8]

assign code_out[27] = code_in[27]

assign code_out[28] = code_in[28] ^ data[9]

assign code_out[29] = code_in[29]

assign code_out[30] = code_in[30]

assign code_out[31] = code_in[31]

endmodule

Code for Orthogonal Check sum generator 2

-----------------------------------------------------------------------------

ocs_gen_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

Further details can be found in XAPP715

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 54: Reed Muller Error Correcting Code

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s2(code_inx14_s2x13_s2x12_s2x11_s2x10_s2)

input [310] code_in

output [150] x14_s2

output [150] x13_s2

output [150] x12_s2

output [150] x11_s2

output [150] x10_s2

assign x14_s2[15] = code_in[1]^ code_in[0]

assign x14_s2[14] = code_in[17]^ code_in[16]

assign x14_s2[13] = code_in[9]^ code_in[8]

assign x14_s2[12] = code_in[25]^ code_in[24]

assign x14_s2[11] = code_in[5]^ code_in[4]

assign x14_s2[10] = code_in[21]^ code_in[20]

assign x14_s2[9] = code_in[13]^ code_in[12]

assign x14_s2[8] = code_in[29]^ code_in[28]

assign x14_s2[7] = code_in[3]^ code_in[2]

assign x14_s2[6] = code_in[19]^ code_in[18]

assign x14_s2[5] = code_in[11]^ code_in[10]

assign x14_s2[4] = code_in[27]^ code_in[26]

assign x14_s2[3] = code_in[7]^ code_in[6]

assign x14_s2[2] = code_in[23]^ code_in[22]

assign x14_s2[1] = code_in[15]^ code_in[14]

assign x14_s2[0] = code_in[31]^ code_in[30]

assign x13_s2[15] = code_in[2]^ code_in[0]

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 55: Reed Muller Error Correcting Code

assign x13_s2[14] = code_in[18]^ code_in[16]

assign x13_s2[13] = code_in[10]^ code_in[8]

assign x13_s2[12] = code_in[26]^ code_in[24]

assign x13_s2[11] = code_in[6]^ code_in[4]

assign x13_s2[10] = code_in[22]^ code_in[20]

assign x13_s2[9] = code_in[14]^ code_in[12]

assign x13_s2[8] = code_in[30]^ code_in[28]

assign x13_s2[7] = code_in[3]^ code_in[1]

assign x13_s2[6] = code_in[19]^ code_in[17]

assign x13_s2[5] = code_in[11]^ code_in[9]

assign x13_s2[4] = code_in[27]^ code_in[25]

assign x13_s2[3] = code_in[7]^ code_in[5]

assign x13_s2[2] = code_in[23]^ code_in[21]

assign x13_s2[1] = code_in[15]^ code_in[13]

assign x13_s2[0] = code_in[31]^ code_in[29]

assign x12_s2[15] = code_in[4]^ code_in[0]

assign x12_s2[14] = code_in[20]^ code_in[16]

assign x12_s2[13] = code_in[12]^ code_in[8]

assign x12_s2[12] = code_in[28]^ code_in[24]

assign x12_s2[11] = code_in[6]^ code_in[2]

assign x12_s2[10] = code_in[22]^ code_in[18]

assign x12_s2[9] = code_in[14]^ code_in[10]

assign x12_s2[8] = code_in[30]^ code_in[26]

assign x12_s2[7] = code_in[5]^ code_in[1]

assign x12_s2[6] = code_in[21]^ code_in[17]

assign x12_s2[5] = code_in[13]^ code_in[9]

assign x12_s2[4] = code_in[29]^ code_in[25]

assign x12_s2[3] = code_in[7]^ code_in[3]

assign x12_s2[2] = code_in[23]^ code_in[19]

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 56: Reed Muller Error Correcting Code

assign x12_s2[1] = code_in[15]^ code_in[11]

assign x12_s2[0] = code_in[31]^ code_in[27]

assign x11_s2[15] = code_in[8]^ code_in[0]

assign x11_s2[14] = code_in[24]^ code_in[16]

assign x11_s2[13] = code_in[12]^ code_in[4]

assign x11_s2[12] = code_in[28]^ code_in[20]

assign x11_s2[11] = code_in[10]^ code_in[2]

assign x11_s2[10] = code_in[26]^ code_in[18]

assign x11_s2[9] = code_in[14]^ code_in[6]

assign x11_s2[8] = code_in[30]^ code_in[22]

assign x11_s2[7] = code_in[9]^ code_in[1]

assign x11_s2[6] = code_in[25]^ code_in[17]

assign x11_s2[5] = code_in[13]^ code_in[5]

assign x11_s2[4] = code_in[29]^ code_in[21]

assign x11_s2[3] = code_in[11]^ code_in[3]

assign x11_s2[2] = code_in[27]^ code_in[19]

assign x11_s2[1] = code_in[15]^ code_in[7]

assign x11_s2[0] = code_in[31]^ code_in[23]

assign x10_s2[15] = code_in[16]^ code_in[0]

assign x10_s2[14] = code_in[24]^ code_in[8]

assign x10_s2[13] = code_in[20]^ code_in[4]

assign x10_s2[12] = code_in[28]^ code_in[12]

assign x10_s2[11] = code_in[18]^ code_in[2]

assign x10_s2[10] = code_in[26]^ code_in[10]

assign x10_s2[9] = code_in[22]^ code_in[6]

assign x10_s2[8] = code_in[30]^ code_in[14]

assign x10_s2[7] = code_in[17]^ code_in[1]

assign x10_s2[6] = code_in[25]^ code_in[9]

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 57: Reed Muller Error Correcting Code

assign x10_s2[5] = code_in[21]^ code_in[5]

assign x10_s2[4] = code_in[29]^ code_in[13]

assign x10_s2[3] = code_in[19]^ code_in[3]

assign x10_s2[2] = code_in[27]^ code_in[11]

assign x10_s2[1] = code_in[23]^ code_in[7]

assign x10_s2[0] = code_in[31]^ code_in[15]

endmodule

Code for Majority Logic Decoder 2

-----------------------------------------------------------------------------

MLD_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s2(clkx14_s2x13_s2x12_s2x11_s2x10_s2x)

input clk

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 58: Reed Muller Error Correcting Code

input [150] x14_s2

input [150] x13_s2

input [150] x12_s2

input [150] x11_s2

input [150] x10_s2

output [1410] x

wire [1410] error_p

wire [150] xq [1410]

wire [1410] x

assign xq[14] = x14_s2

assign xq[13] = x13_s2

assign xq[12] = x12_s2

assign xq[11] = x11_s2

assign xq[10] = x10_s2

genvar j

generate

for (j=10 j lt 15 j=j+1)

begin u2_MLD

MLD_adder_s2 inst (

datain(xq[j])

dataout(x[j])

)

end

endgenerate

endmodule

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 59: Reed Muller Error Correcting Code

Code For Majority Logic Decoder Adder 2

-----------------------------------------------------------------------------

MLD_adder_s2 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_adder_s2v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_adder_s2(dataindataout)

input [150] datain

output dataout

output error

wire [40] sum

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 60: Reed Muller Error Correcting Code

assign sum = datain[15] + datain[14] + datain[13] + datain[12]

+ datain[11] + datain[10] + datain[9] + datain[8]

+ datain[7] + datain[6] + datain[5] + datain[4]

+ datain[3] + datain[2] + datain[1] + datain[0]

assign dataout = sum[3] ^ sum [4] xor to reduce logic level

assign error = (sum == 5b01000)

endmodule

Code for Orthogonal Checksum Generator 3

-----------------------------------------------------------------------------

ocs_gen_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename ocs_gen_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module ocs_gen_s3(dataincode_in code_out)

input [40] datain

input [310] code_in

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 61: Reed Muller Error Correcting Code

output [310] code_out

wire [1410] data

assign data = datain

assign code_out[0] = code_in[0] ^ data[14] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[1] = code_in[1] ^ data[13] ^ data[12] ^ data[11] ^ data[10]

assign code_out[2] = code_in[2] ^ data[14] ^ data[12] ^ data[11] ^ data[10]

assign code_out[3] = code_in[3] ^ data[12] ^ data[11] ^ data[10]

assign code_out[4] = code_in[4] ^ data[14] ^ data[13] ^ data[11] ^ data[10]

assign code_out[5] = code_in[5] ^ data[13] ^ data[11] ^ data[10]

assign code_out[6] = code_in[6] ^ data[14] ^ data[11] ^ data[10]

assign code_out[7] = code_in[7] ^ data[11] ^ data[10]

assign code_out[8] = code_in[8] ^ data[14] ^ data[13] ^ data[12] ^ data[10]

assign code_out[9] = code_in[9] ^ data[13] ^ data[12] ^ data[10]

assign code_out[10] = code_in[10] ^ data[14] ^ data[12] ^ data[10]

assign code_out[11] = code_in[11] ^ data[12] ^ data[10]

assign code_out[12] = code_in[12] ^ data[14] ^ data[13] ^ data[10]

assign code_out[13] = code_in[13] ^ data[13] ^ data[10]

assign code_out[14] = code_in[14] ^ data[14] ^ data[10]

assign code_out[15] = code_in[15] ^ data[10]

assign code_out[16] = code_in[16] ^ data[14] ^ data[13] ^ data[12] ^ data[11]

assign code_out[17] = code_in[17] ^ data[13] ^ data[12] ^ data[11]

assign code_out[18] = code_in[18] ^ data[14] ^ data[12] ^ data[11]

assign code_out[19] = code_in[19] ^ data[12] ^ data[11]

assign code_out[20] = code_in[20] ^ data[14] ^ data[13] ^ data[11]

assign code_out[21] = code_in[21] ^ data[13] ^ data[11]

assign code_out[22] = code_in[22] ^ data[14] ^ data[11]

assign code_out[23] = code_in[23] ^ data[11]

assign code_out[24] = code_in[24] ^ data[14] ^ data[13] ^ data[12]

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 62: Reed Muller Error Correcting Code

assign code_out[25] = code_in[25] ^ data[13] ^ data[12]

assign code_out[26] = code_in[26] ^ data[14] ^ data[12]

assign code_out[27] = code_in[27] ^ data[12]

assign code_out[28] = code_in[28] ^ data[14] ^ data[13]

assign code_out[29] = code_in[29] ^ data[13]

assign code_out[30] = code_in[30] ^ data[14]

assign code_out[31] = code_in[31]

endmodule

Code for Majority Logic Decoder 3

-----------------------------------------------------------------------------

MLD_s3 - Module

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

Filename MLD_s3v

-----------------------------------------------------------------------------

Description

Top level design for 16-bit Multiple Error Detection and Correction

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

`timescale 1ns100ps

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 63: Reed Muller Error Correcting Code

module MLD_s3(clkresetx15_s3x)

input clk

input reset

input [310] x15_s3

output x

wire [20] sum0_0 sum0_1 sum0_2 sum0_3 sum0_4 sum0_5 sum0_6 sum0_7

wire [30] sum1_0 sum1_1 sum1_2 sum1_3

wire [110] sum1

wire [40] sum2_0 sum2_1

wire [50] sum

reg x

assign sum0_0 = x15_s3[31] + x15_s3[30] + x15_s3[29] + x15_s3[28]

assign sum0_1 = x15_s3[27] + x15_s3[26] + x15_s3[25] + x15_s3[24]

assign sum0_2 = x15_s3[23] + x15_s3[22] + x15_s3[21] + x15_s3[20]

assign sum0_3 = x15_s3[19] + x15_s3[18] + x15_s3[17] + x15_s3[16]

assign sum0_4 = x15_s3[15] + x15_s3[14] + x15_s3[13] + x15_s3[12]

assign sum0_5 = x15_s3[11] + x15_s3[10] + x15_s3[9] + x15_s3[8]

assign sum0_6 = x15_s3[7] + x15_s3[6] + x15_s3[5] + x15_s3[4]

assign sum0_7 = x15_s3[3] + x15_s3[2] + x15_s3[1] + x15_s3[0]

assign sum1_0 = sum0_0 + sum0_1

assign sum1_1 = sum0_2 + sum0_3

assign sum1_2 = sum0_4 + sum0_5

assign sum1_3 = sum0_6 + sum0_7

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 64: Reed Muller Error Correcting Code

assign sum2_0 = sum1_0 + sum1_1

assign sum2_1 = sum1_2 + sum1_3

assign sum= sum2_0 + sum2_1

assign x = sum[4] ^ sum[5]

endmodule

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays
Page 65: Reed Muller Error Correcting Code

Reference

[1] Arazi Benjamin _A Commonsense Approach to the Theory of Error Correcting

Codes_ MIT Press 1988

[2] Ho_man D G et al _Coding Theory the Essentials_ Marcel Dekker Inc 1991

[3] Mann Henry B _Error Correcting Codes_ John Wiley and Sons 1968

[4] Purser Michael _Introduction to Error-Correcting Codes_ Artech House Inc Norwood

MA 1995

[5] Reed Irving S _A Class of Multiple-Error-Correcting Codes and Decoding

Scheme_ MIT Lincoln Laboratory 1953

[6] Roman Steven _Coding and Information Theory_ Springer-Verlag 1992

[7] Van Lindt J H _Introduction to Coding Theory_ Springer-Verlag 1982

  • Reference Design
    • Encoder
      • Decoder
        • STAGE-2
        • Design Considerations
          • FPGA Architectures
            • Configurable IO Blocks
            • Programmable Interconnect
            • Clock Circuitry
              • Small vs Large Granularity
              • SRAM vs Anti-fuse Programming
                • The advantages of SRAM based FPGAs is that they use a standard fabrication process that chip fabrication plants are familiar with and are always optimizing for better performance Since the SRAMs are reprogrammable the FPGAs can be reprogrammed any number of times even while they are in the system just like writing to a normal SRAM The disadvantages are that they are volatile which means a power glitch could potentially change it Also SRAMbased devices have large routing delays