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 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 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 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 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> </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 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, 0}, S<SUB CLASS="Subscript">1</SUB> = {1, 0}, S<SUB CLASS="Subscript">2</SUB>
= {0, 1}, and S<SUB CLASS="Subscript">3</SUB> = {1, 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 11.3 shows the
state diagram for this encoder. The first four rows of Table 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 (Y<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>
= 1 , 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> </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 11.3 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 11.6 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> </TD>
<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165458"></A> </TD>
<TD><P CLASS="Table"><A NAME="pgfId=165462"></A> </TD>
<TD COLSPAN="2"><P CLASS="Table"><A NAME="pgfId=165464"></A> </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> </TD></TR>
<TR>
<TD><P CLASS="Table"><A NAME="pgfId=165480"></A> </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> </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>
</TD>
<TD><P CLASS="Table"><A NAME="pgfId=165500"></A>Y<SUB CLASS="Subscript">n</SUB><SUP>1</SUP>
</TD>
<TD><P CLASS="Table"><A NAME="pgfId=165505"></A>Y<SUB CLASS="Subscript">n</SUB><SUP>0</SUP>
</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> </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>
</TD>
<TD><P CLASS="Table"><A NAME="pgfId=165525"></A> </TD>
<TD><P CLASS="Table"><A NAME="pgfId=165530"></A>X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>
</TD>
<TD><P CLASS="Table"><A NAME="pgfId=165535"></A>X<SUB CLASS="Subscript">n-2</SUB><SUP>1</SUP>
</TD>
<TD><P CLASS="Table"><A NAME="pgfId=165540"></A>X<SUB CLASS="Subscript">n</SUB><SUP>2</SUP>
</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> </TD>
<TD><P CLASS="Table"><A NAME="pgfId=165550"></A>= X<SUB CLASS="Subscript">n-1</SUB><SUP>1</SUP>
</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>} </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </TD>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?