2 LS码在FPGA中的实现
和一般的FPGA开发过程一样,LS码在FPGA中的实现需要经过可行性分析、算法验证、设计输入、仿真和下载测试几个过程。针对某个软件无线电平台的要求,可以合理地设计码速率和码长,扩频前的码速率为64 Kb/s,C码和S码的长度都为16,扩频后的码速率为1.024 Mb/s。
2.1 LS码的实现算法
为了提高FPGA的处理效率,采用查找表的形式,首先生成了长度为16的C码和S码,生成码的算法是基于图1的树形结构,C码和S码关系为:
式中:n为C码和S码每一位的位置编号,N为码长。表1是所生成的长度为16,个数也为16的C码。S码可以根据式(1)求得,限于篇幅,这里不再单独列出,实验中只选取了表1中序号为1的一组C码和相应的S码作为查找表使用。
2.2 设计输入和仿真
FPGA的设计输入有多种表达方式,最常用的是原理图方式和HDL文本方式,这里采用的是混合输入方式,首先采用Verilog HDL的文本输入方式将算法做成模块,然后再通过原理图的方式定义连接和接口,这样不仅使得逻辑描述性、可重用性和移植性强,而且使得接口描述和连接关系清晰、直观。图4是所设计的原理图结构,为了表示清楚,只截取了C码的扩频和解扩模块,其中spread C_part是C码的扩频模块,Baud_parr和serial_out模块的输出分别为并行输出和串行输出,这样做的目的是为了方便之后其他算法功能模块的输入,如果后面要加入例如调制、波形成型之类的模块,就可以方便地选择并行输入或者串行输入,提高了设计的灵活性。receiveC_parr为C码的并行解扩模块,这里只考虑了对Baud_parr所输出的并行数据进行解扩,这样能提高接收端的处理效率。输入端口SCLK为32.768 MHz的时钟,输出端口SERIAL C为seri al_out模块的串行输出,Cout为receiveCparr模块的解扩输出。
在设计中,spreadC_part模块的扩频输出速率并不是所需的码速率,而是经过Baud_parr和serial_out模块后再构成所需的码速率。
当完成设计输入后,就需要对所设计的算法进行时序仿真,验证算法的正确性。图5的时序图是采用ModelSim对C码的扩频模块spreadC_part、扩频的并行输出模块Baud_parr、串行输出模块serial_out以及并行解扩模块receiveC_parr所进行的仿真时序。如图5所示,Baud16x是一个1.024 MHz的时钟,INDATA是速率为64 Kb/s的输入码元、D C(15:0)为spreadC_part模块输出的扩频数据。注意到此时的D_c(15:0)为总线结构的16位数据,速率为Baud16x/8=128 Kb/s,在空闲时刻输出的都是0,这个数据输入到Baud_parr模块和seriaI_out模块。SC(15:0)和SERIAL_C分别对应这两个模块的并行输出和串行输出。可以看出SC(15:0)是16位总线数据,速率为1.024 Mb/s,SERIAL_C的串行数据速率也为1.024.Mb/s。Cout为将SC(15:0)的并行数据解扩后恢复出来的码元,可以看出,Cout正确地恢复出了IN-DATA的码元。