FPGA设计基础设计实例BCD码到余3码的转换电路BCD码和余3码之间有如下关系:-BCD码加3即为余3码。-余3码是一个自补码,即对于任意一个余3码a,存在另外一个a’,使得a+a’=9。电路设计要求:假设码流以串行流的形式进入转换电路,并以串行流的方式进行发送,BCD码的低位先进入本转换电路,余-3码的低位先发送序列BCD余3码000000011100010100200100101300110110401000111501011000601101001701111010810001011910011100BCD到余3码转换表并串转换电路___使用有限状态机/*SIN_POUT_SHIFT*/moduleSIN_POUT_SHIFT(RSTB,IN,CLK,Q);inputRSTB,CLK,IN;output[3:0]Q;reg[3:0]Q;always@(posedgeCLKornegedgeRSTB)Q=(!RSTB)?0:{Q,IN};endmodule常见的串并/并串转换/*PIN_SOUT_SHIFT*/modulePIN_SOUT_SHIFT(LOAD,IN,CLK,Q);inputLOAD,CLK;input[3:0]IN;output[3:0]Q;reg[3:0]Q;always@(posedgeCLKorposedgeLOAD)if(LOAD)Q=IN;elseQ=Q1;endmodule把4位的并行数据转换为符合以下协议的串行数据流,数据流用scl和sda两条线传输,sclk为输入的时钟信号,data[3:0]为输入数据,d_en为数据输入的使能信号。设计要求:通信协议:scl为不断输出的时钟信号,如果scl为高电平时,sda由高变低,串行数据流开始。如果scl为高电平时,sda由低变高,串行数据结束。sda信号的串行数据位必须在scl为低电平时变化,若变为高则为1,否则为零。Data[3:0]sclkd_enMsclsdasclsdamoduleptos(d_en,data,scl,sclk,sda,rst);inputd_en,rst;wired_en;input[3:0]data;inputsclk;wiresclk;outputscl;outputsda;wiresda;regscl,link_sda,sdabuf;reg[3:0]databuf;reg[7:0]state;assignsda=link_sda?sdabuf:1'bz;parameterready=8'b00000001,start=8'b00000010,bit1=8'b00000100,bit2=8'b00001000,bit3=8'b00010000,bit4=8'b00100000,bit5=8'b01000000,stop=8'b10000000;always@(posedgesclkornegedgerst)beginif(!rst)scl=1;elsescl=~scl;endalways@(posedged_en)begindatabuf=data;end//FSMalways@(negedgesclkornegedgerst)if(!rst)beginlink_sda=0;state=ready;sdabuf=1;endelsebegincase(state)ready:if(d_en)beginlink_sda=1;state=start;endelsebeginlink_sda=0;state=ready;endstart:if(scl&&d_en)beginsdabuf=0;state=bit1;endelsestate=start;bit1:if(!scl)beginsdabuf=databuf[3];state=bit2;endelsestate=bit1;bit2:if(!scl)beginsdabuf=databuf[2];state=bit3;endelsestate=bit2;bit3:if(!scl)beginsdabuf=databuf[1];state=bit4;endelsestate=bit3;bit4:if(!scl)beginsdabuf=databuf[0];state=bit5;endelsestate=bit4;bit5:if(!scl)beginsdabuf=0;state=stop;endelsestate=bit5;stop:if(scl)beginsdabuf=1;state=ready;endelsestate=stop;default:beginlink_sda=0;sdabuf=1;state=ready;endendcaseendendmodule伪随机序列产生器设计伪随机序列的应用非常广泛,可以用作误码率测量,通信系统性能的测量,信号的加密,数据序列的扰码,扩展频谱等许多方面。一般来说,伪随机序列的电路为一个反馈移位寄存器,它可分为线性反馈移位寄存器(简称LFSR计数器)和非线性反馈移位寄存器,由线性反馈移位寄存器产生出的周期最长的二进制数字序列称为最大长度线性反馈移位寄存器序列,通常简称为M序列。M序列产生器由于M序列有很好的信息相关性和伪随机性能,电路实现比较简单,所以在信号的加密,数据序列的扰码,扩频等方面有着广泛的应用。一个2n-1的M序列,可以用n级的移位寄存器产生。实现方式主要有两类,一类是“多对一”方式,另一类是“一对多”的方式。“多对一”方式,如图a,其中Cn,Cn-1,Cn-2,………C0,为反馈系数,这些系数的取值为“1”或“0”,“1”表示该反馈支路连通,“0”表示该反馈支路断开。特征多项式的表达式为ƒ(x)=CnXn+Cn-1Xn-1+………+C2X2+C1X1+C0“一对多”的方式,如图b,其中Dn,Dn-1,Dn-2,………D0,为反馈系数,这些系数的取值为“1”或“0”,“1”表示该反馈支路连通,“0”表示该反馈支路断开。特征多项式的表达式为G(x)=D0Xn+D1Xn-1+………+Dn-2X2+Dn-1X1+Dn在设计m序列产生器时,移位寄存器的反馈线的数目可由“常用m序列产生器的特征多项式表”查表得到。例:9位M序列生成器1、串行输出的9位M序列生成器(采用“多对一”方式)特征多项式:ƒ(x)=X9+X4+1//设计modulelfsr9(clock,reset,lfsr_out);inputclock,reset;outputlfsr_out;reg[8:0]lfsr_count;assignlfsr_out=lfsr_count[8];always@(posedgeclockorposedgereset)if(reset)lfsr_count=0;//反馈为同或情况elsebeginlfsr_count[8:1]=lfsr_count[7:0];lfsr_count[0]=lfsr_count[8]~^lfsr_count[3];endendmodule2、八位并行输出的9位M序列在8位的并行输出中,每一个时钟周期需要产生8个比特,设9位M序列产生器某个时刻的状态是lfsr_a[8:0],并行输出的8位数据是lfsr_a[8:1],产生下一个状态的移位寄存器输入为lfsr_b[8:0]。根据特征多项式:ƒ(x)=X9+X4+1可以推出下列关系。lfsr_b[7]=lfsr_a[8]⊕lfsr_a[3]lfsr_b[6]=lfsr_a[7]⊕lfsr_a[2]lfsr_b[5]=lfsr_a[6]⊕lfsr_a[1]lfsr_b[4]=lfsr_a[5]⊕lfsr_a[0]lfsr_b[3]=lfsr_a[4]⊕lfsr_b[8]=lfsr_a[4]⊕lfsr_a[8]⊕lfsr_a[3]lfsr_b[3]=lfsr_a[3]⊕lfsr_b[7]=lfsr_a[3]⊕lfsr_a[7]⊕lfsr_a[2]lfsr_b[2]=lfsr_a[2]⊕lfsr_b[6]=lfsr_a[2]⊕lfsr_a[6]⊕lfsr_a[1]lfsr_b[1]=lfsr_a[1]⊕lfsr_b[5]=lfsr_a[1]⊕lfsr_a[5]⊕lfsr_a[0]lfsr_b[8]=lfsr_a[0]fsr_out=lfsr_a[8:1]modulelfsr9p(clock,reset,lfsr_out);inputclock,reset;output[8:1]lfsr_out;reg[8:0]lfsr_a;wire[8:0]lfsr_b;assignlfsr_out=lfsr_a[8:1];assignlfsr_b[7:4]=lfsr_a[8:5]^lfsr_a[3:0];assignlfsr_b[3:0]=lfsr_a[4:1]^lfsr_a[8:5]^lfsr_a[3:0]assignlfsr_b[8]=lfsr_a[0];always@(posedgeclockorposedgereset)if(reset)lfsr_a=9`h1ff;//反馈为异或情况elselfsr_a[8:0]=lfsr_b[8:0];endmodule汉明距离计算电路设计主要内容:汉明距离的概念汉明距离计算电路的实现方法一、汉明距离汉明距离定义:两个长为N的二元序列S和U之间对应位不相同的位数,用d(S,U)来表示。在扩频通信和数字突发通信(如TDMA)系统中,接收机进行的数字相关检测或独特码(UW)检测,实际上就是计算本地一组确定序列与接收到的未知序列之间汉明距离的过程。将汉明距离与事先确定的门限相比较,就可以得到检测结果。图1检测器结构框图设检测的序列长度为N,本地码为确定的二元序列UU=(U1,U2,…,UN)Ui{0,1}接收机将接收到的数据连续不断地送入N位串行移位寄存器中,任一瞬间移位寄存器的内容为:S=(S1,S2,…,SN)Si{0,1}S与U的对应位进行模二加,当S与U的对应位相同时结果为“0”,不同时结果为“1”,最后得到D=(D1,D2,…,DN)其中序列D中“1”的数目就是S与U之间的汉明距离,可表示为序列D是序列S与U的比较结果,要得到汉明距离的数值,必须从序列D中计算出“1”的个数。1、求和网络法图2求和网络法原理图二、汉明距离计算电路实现方法原理:将序列D中的各项逐个加在一起,最终累加结果便是汉明距离。分析:在一般情况下,为了保证计算结果的可靠性,需要将序列D用N位寄存器锁存。在求和网络中,信号每经过一次加法运算,就引入一定的延迟。要求信号总延时要小于输入信号码元周期。2、计数法原理:首先将序列D并行送入一个“并入串出”的N位移位寄存器中,然后用一个高速时钟将数据送出,同时利用计数器来统计“1”的数目,最后用清零脉冲将计数器清零,为下一周期的计数做好准备。图3计数法原理图计数时钟清零脉冲计数器CLKCLREN12ND1DND2N位并入串出移位寄存器分析:假设接收机接收数据速率为R0由此可以确定计数时钟的最低速率为R=N×R0周期为结论:计数法的实现电路比较简单,但是当数据速率R0较高或N值较大时,计数时钟的速率R会很大,导致电路难以实现。适合于低速数据,码序列不宜很长,而且需要有高速率的时钟和高速器件。3、查找表法图4查找表法原理图原理:将存储器做成一个查找表,把序列D作为地址信号,从表中查找出其对应的汉明距离。分析:序列D的长度为N,存储单元的数据宽度为P,则P=INT(log2N)+1从而要求存储器的容量M为M=2N×P随着序列长度N的增加,存储器容