ch11.12.htm

来自「介绍asci设计的一本书」· HTM 代码 · 共 1,087 行 · 第 1/5 页

HTM
1,087
字号
<HTML>

<HEAD>

  <META NAME="GENERATOR" CONTENT="Adobe PageMill 2.0 Mac">

  

  <TITLE> 11.12&nbsp;&nbsp;&nbsp;A Viterbi Decoder</TITLE>

</HEAD><!--#include file="top.html"--><!--#include file="header.html"--><br><!--#include file="AmazonAsic.html"-->



<P><HR ALIGN="LEFT"></P>

<P><A HREF="CH11.htm">Chapter&nbsp;start</A></P>

<P><A HREF="CH11.11.htm">Previous page</A></P>

<P><A HREF="CH11.13.htm">Next page</A></P>

<H1><A NAME="pgfId=5203"></A>11.12&nbsp;&nbsp;&nbsp;A Viterbi Decoder</H1>

<P><P CLASS="BodyAfterHead"><A NAME="pgfId=100829"></A>This section describes

an ASIC design for a Viterbi decoder using Verilog. Christeen Gray completed

the original design as her MS thesis at the University of Hawaii (UH) working

with VLSI Technology, using the Compass ASIC Synthesizer and a VLSI Technology

cell library. The design was mapped from VLSI Technology design rules to

Hewlett-Packard design rules; prototypes were fabricated by Hewlett-Packard

(through Mosis) and tested at UH.</P>

<H2><A NAME="pgfId=129755"></A>11.12.1&nbsp;&nbsp;&nbsp;Viterbi Encoder</H2>

<P><P CLASS="BodyAfterHead"><A NAME="pgfId=129766"></A>Viterbi encoding

is widely used for satellite and other noisy <B>communications channels</B>.

There are two important components of a channel using Viterbi encoding:

the <B>Viterbi encoder</B> (at the transmitter) and the <B>Viterbi decoder</B>

(at the receiver). A Viterbi encoder includes extra information in the transmitted

signal to reduce the probability of errors in the received signal that may

be corrupted by noise.</P>

<P><P CLASS="Body"><A NAME="pgfId=132761"></A>I shall describe an encoder

in which every two bits of a data stream are encoded into three bits for

transmission. The ratio of input to output information in an encoder is

the <B>rate</B> of the encoder; this is a rate 2/3 encoder. The following

equations relate the three encoder output bits (Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

, Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP> , and Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP>

) to the two encoder input bits (X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

and X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP> ) at a time nT:</P>

<P>Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP> = X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP></P>

<P>Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP> = X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

xor X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP></P>

<P>Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP> = X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>&nbsp;</P>

<P><P CLASS="Body"><A NAME="pgfId=164907"></A>We can write the input bits

as a single number. Thus, for example, if X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

= 1 and X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP> = 0 , we can write X<SUB CLASS="Subscript">n</SUB>

= 2 . Equation&nbsp;11.1 defines a state machine with two memory elements

for the two last input values for X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

: X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP> and X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP>

. These two state variables define four states: {X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>,

X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP> } , with S<SUB CLASS="Subscript">0</SUB>

= { 0,&nbsp;0}, S<SUB CLASS="Subscript">1</SUB> = {1,&nbsp;0}, S<SUB CLASS="Subscript">2</SUB>

= {0,&nbsp;1}, and S<SUB CLASS="Subscript">3</SUB> = {1,&nbsp;1}. The 3-bit

output Y<SUB CLASS="Subscript">n</SUB> is a function of the state and current

2-bit input X<SUB CLASS="Subscript">n</SUB> .</P>

<P><P CLASS="Body"><A NAME="pgfId=149356"></A>The following Verilog code

describes the rate 2/3 encoder. This model uses two D flip-flops as the

state register. When reset (using active-high input signal <CODE>res</CODE>

) the encoder starts in state S<SUB CLASS="Subscript">0</SUB> . In Verilog

I represent Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP> by <CODE>Y2N</CODE>

, for example.</P>

<PRE>

/******************************************************/

/* module viterbi_encode                              */

/******************************************************/

/* This is the encoder. X2N (msb) and X1N form the 2-bit input

message, XN. Example: if X2N=1, X1N=0, then XN=2. Y2N (msb), Y1N, and

Y0N form the 3-bit encoded signal, YN (for a total constellation of 8

PSK signals that will be transmitted). The encoder uses a state

machine with four states to generate the 3-bit output, YN, from the

2-bit input, XN. Example: the repeated input sequence XN = (X2N, X1N)

= 0, 1, 2, 3 produces the repeated output sequence YN = (Y2N, Y1N,

Y0N) = 1, 0, 5, 4. */

<B>module</B> viterbi_encode(X2N,X1N,Y2N,Y1N,Y0N,clk,res);

<B>input</B> X2N,X1N,clk,res; <B>output</B> Y2N,Y1N,Y0N;

<B>wire</B> X1N_1,X1N_2,Y2N,Y1N,Y0N;

dff dff_1(X1N,X1N_1,clk,res); dff dff_2(X1N_1,X1N_2,clk,res);

<B>assign</B> Y2N=X2N; <B>assign</B> Y1N=X1N ^ X1N_2; <B>assign</B> Y0N=X1N_1; 

<B>endmodule </B></PRE>

<P><P CLASS="Body"><A NAME="pgfId=149374"></A>Figure&nbsp;11.3 shows the

state diagram for this encoder. The first four rows of Table&nbsp;11.6 show

the four different transitions that can be made from state S<SUB CLASS="Subscript">0</SUB>

. For example, if we reset the encoder and the input is X<SUB CLASS="Subscript">n</SUB>

= 3 (X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP> = 1 and X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

= 1), then the output will be Y<SUB CLASS="Subscript">n</SUB> = 6 &nbsp;(Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

= 1 ,&nbsp;&nbsp;Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP> = 1 , Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP>

= 0 ) and the next state will be S<SUB CLASS="Subscript">1</SUB> .</P>

<P><TABLE BORDER="1" CELLSPACING="2" CELLPADDING="2">

<TR>

<TD COLSPAN="2"><P><P CLASS="TableFigure"><A NAME="pgfId=165125"></A>&nbsp;</P>

<P><IMG SRC="CH11-26.gif" WIDTH="338" HEIGHT="268" NATURALSIZEFLAG="3" ALIGN="BOTTOM"></TD></TR>

<TR>

<TD COLSPAN="2"><P CLASS="TableFigureTitle"><A NAME="pgfId=135231"></A>FIGURE&nbsp;11.3&nbsp;&nbsp;A

state diagram for a rate 2/3 Viterbi encoder. The inputs and outputs are

shown in binary as X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP> X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

/ Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP>

, and in decimal as X<SUB CLASS="Subscript">n</SUB>/ Y<SUB CLASS="Subscript">n</SUB>

.</TD></TR>

</TABLE>

 <TABLE BORDER="1" CELLSPACING="2" CELLPADDING="2">

<TR>

<TD COLSPAN="12"><P CLASS="TableTitle"><A NAME="pgfId=165430"></A>TABLE&nbsp;11.6&nbsp;&nbsp;&nbsp;&nbsp;State

table for the rate 2/3 Viterbi encoder.</TD></TR>

<TR>

<TD ROWSPAN="3"><P CLASS="Table"><A NAME="pgfId=165454"></A><B>Present state</B></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165456"></A>&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165458"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165462"></A>&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165464"></A>&nbsp;</TD>

<TD COLSPAN="3"><P CLASS="Table"><A NAME="pgfId=165468"></A><B>Outputs</B></TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165474"></A>&nbsp;</TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165480"></A>&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165482"></A><B>Inputs</B></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165486"></A>&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165488"></A><B>State variables</B></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165495"></A>Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165500"></A>Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165505"></A>Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP>

&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165507"></A><B>Next state</B></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165513"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165518"></A>X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165523"></A>X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165525"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165530"></A>X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165535"></A>X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165540"></A>X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>

&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165545"></A>= X<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>

xor X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP> &nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165550"></A>= X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>

&nbsp;</TD>

<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165555"></A>{X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>,

X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP>} &nbsp;</TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165559"></A>S<SUB CLASS="Subscript">0</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165561"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165563"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165565"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165567"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165569"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165571"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165573"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165575"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165577"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165579"></A>00</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165581"></A>S<SUB CLASS="Subscript">0</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165583"></A>S<SUB CLASS="Subscript">0</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165585"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165587"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165589"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165591"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165593"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165595"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165597"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165599"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165601"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165603"></A>10</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165605"></A>S<SUB CLASS="Subscript">1</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165607"></A>S<SUB CLASS="Subscript">0</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165609"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165611"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165613"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165615"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165617"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165619"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165621"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165623"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165625"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165627"></A>00</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165629"></A>S<SUB CLASS="Subscript">0</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165631"></A>S<SUB CLASS="Subscript">0</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165633"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165635"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165637"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165639"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165641"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165643"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165645"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165647"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165649"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165651"></A>10</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165653"></A>S<SUB CLASS="Subscript">1</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165655"></A>S<SUB CLASS="Subscript">1</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165657"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165659"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165661"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165663"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165665"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165667"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165669"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165671"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165673"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165675"></A>01</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165677"></A>S<SUB CLASS="Subscript">2</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165679"></A>S<SUB CLASS="Subscript">1</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165681"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165683"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165685"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165687"></A>&nbsp;</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165689"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165691"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165693"></A>0</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165695"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165697"></A>1</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165699"></A>11</TD>

<TD><P CLASS="Table"><A NAME="pgfId=165701"></A>S<SUB CLASS="Subscript">3</SUB></TD></TR>

<TR>

<TD><P CLASS="Table"><A NAME="pgfId=165703"></A>S<SUB CLASS="Subscript">1</SUB></TD>

<TD><P CLASS="Table"><A NAME="pgfId=165705"></A>&nbsp;</TD>

⌨️ 快捷键说明

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