基于Nios的通用编译码器的设计
扫描二维码
随时随地手机看文章
摘 要: 提出了一种基于Nios的通用编译码器的设计,利用嵌入在FPGA中的Nios处理器,对多种编译码模块进行控制。详细论述了主要模块的设计和实现方案及整个系统的启动机制。该编译码器在通信原理教学实验系统中运行良好,体现了它的稳定性及可扩展性。
关键词: Nios 位同步 帧同步
altera.com/">Altera公司的Nios是基于RISC技术的通用嵌入式处理器芯片软核,它特别为可编程逻辑进行了优化设计,也为可编程单芯片系统(SOPC)设计了一套综合解决方案。Nios采用改进的哈佛存储器结构,CPU带有分离的数据和程序存储器总线控制,并具备高速缓存、中断处理功能。与其他传统的CPU相比,Nios指令系统可通过自定义指令和标准CPU选项,利用硬件来明显提高系统性能,而这一措施的实现对PLD中处理器软核非常有利。Nios开发者可以在速度和面积间选择,增加了SOPC设计的灵活性。
基于Nios设计的这一款通用编译码器,是将多种编译码模块和微处理器控制部分集成到单片FPGA内部,大大减少了处理器外围扩展电路数目、提高了系统集成度、降低了外围电路布局走线的复杂度、提高了系统的抗干扰能力。由于FPGA的可编程性,使系统的扩展和升级更加容易,通过设置不同的技术指标,可以应用到多种通信系统中。
1 总体设计方案
通用编译码器总体方案框图如图1所示。它由信息源、编码器模块、信道仿真模块、同步提取模块、译码器模块、存储器模块、LCD和键盘模块组成,整个系统在嵌入式处理器软核的控制下完成对各种外设的操作,包括设置编译码类型和信码速率、LCD显示等。
该编译码器可以完成卷积码、CRC码、RS码等多种编译码方案。整个系统可工作在两种模式下:(1)调试模式。这种模式主要应用于系统调试及实验操作。在该模式下,信息源为其他模块提供信码,以便调试同步提取模块、编译码模块以及系统连接;信道仿真模块处于正常工作状态时,可向传输码元中加入干扰,以检验译码器是否正常工作。(2)应用模式。这种模式主要应用于实际系统。在该模式下,信息源模块只是把用户提供的信码传输给编码器,而信道仿真模块并不工作,编码模块及译码模块互不连接,编码后码元在特定的信道中传输,然后再回到译码器。
设计过程中使用的软件平台主要有Quartus Ⅱ、SOPC Builder和Nios IDE。其中,Quartus Ⅱ主要用于整个系统的构建、编译、综合、适配、时序分析和下载。整个SOPC系统设计完成后,在Quartus Ⅱ下进行管脚分配和编译,并生成pof或sof文件下载到专用配置器件或FPGA中;SOPC Builder用于Nios微处理器和外围模块的集成设计,Nios微处理器系统设计完成后,通过“System Generation”产生可用于Quartus Ⅱ综合的VHDL描述,同时生成Symbol文件供调用;Nios IDE用于Nios处理器的软件开发、调试和下载。
2 硬件实现
硬件主要包括定制合适的CPU和外设、编译码模块、同步提取模块、键盘显示、存储器模块。
2.1 位同步提取模块设计
在数字通信中,位同步是最基本的同步。它的基本含义是接收端和发送端时钟信号必须同频同相,这样接收端才能正确接收和判决发送端送来的每一个码元。实现位同步的方法可分为外同步法和自同步法。目前,在数字通信系统中,常常采用数字锁相法提取位同步[1],它属于自同步法。
位同步提取原理图如图2所示。它由晶振、分频器、相位比较器和控制器组成。其中控制器包括图中所示的扣除门、附加门和或门。若接收码元的速率为F(波特),则要求位同步脉冲的重复速率也为F。这时,晶振的振荡频率应设在NF(赫),由晶振输出经整形得到重复频率为NF的窄脉冲,经扣除门、或门并N次分频后,就可得到频率为F的信号。如果此信号不能准确反映接收码元的频率和相位,就要根据相位比较器输出的误差信号,通过控制器对分频器进行调整。接收码元的相位可以从基带信号的过零点提取,将每个码元的宽度分为两个区:前半码元称为滞后区。若位同步脉冲波形落入此区,分频器输出脉冲,使‘与门’B有输出,经过单稳2产生一滞后脉冲。后半码元称为超前区,若位同步脉冲落入此区,分频器的另一端使‘与门’A有输出,经过单稳1产生一超前脉冲。这样无论位同步脉冲超前或滞后,都会分别送出超前或滞后脉冲对加于分频器的脉冲进行扣除或附加,达到相位调整的目的。
图2中的单稳3是为了保证‘与门’A先有输出,以防位同步输出的脉冲与接收码元的相位相差180°。对位同步提取电路进行时序仿真,得到的仿真波形如图3所示。图3中,codein为输入码流,weifen为提取出的码元起始相位,weitongbu为位同步信号输出。
2.2 帧同步提取模块设计
数字通信时,一般总是以一定数目的码元组成一个“句”进行传输。在本设计中,为了方便部分编码方法的实现,采用了加帧头的方法。因此在解码端,相应设计了帧同步信号的提取模块。实现帧同步的基本方法是在发送端预先规定的时隙插入一组特殊码形的帧同步码组,在接收端有帧同步检测电路检测该码组以保证收发帧同步。
本方案中帧同步码为7位巴克码,即1110010,集中插入到每帧的第2~8个码元位置上,其原理框图如图4所示。本模块可分为信号源、巴克码识别器和同步保护三部分。每帧的具体结构可以通过键盘设置,此处以每帧24位为例,其中后16位为信息码元,则设置分频器1为24分频,分频器2设为3分频。巴克码识别器由图5所示的电路来实现。在移位时钟信号的作用下,当7位巴克码全部移进移位寄存器时,图5中的D0~D6全部为1。L0~L2端为门限控制端,其中L1和L2段已设置为1,而L0由同步保护端控制,只有当D0~D6中1的个数不小于门限值时,qout端才输出一脉冲,表示一帧的开始。
图5中,同步保护的作用是减少假同步和漏同步。当无基带信号输入或有基带信号输出但识别器无输出时,‘与门’1关闭,‘与门’2打开,单稳输出信号通过‘与门’2输入到分频器2,分频器2的输出信号使RS置0,从而关闭‘与门’3,同步器无输出信号;此时Q的反向端高电平把判决门限的电平置为7,打开‘与门’1,同步器处于捕捉状态,只要识别器输出一个信号,‘与门’4就可以输出一个置0脉冲使分频器1置0。这样分频器1就可以输出与识别器同频同相的信号。识别器输出信号通过‘与门’1后使状态触发器置1,从而打开‘与门’3,输出帧同步信号,同时使判决门限降为6,关闭‘或门’,使同步器进入维持状态。在维持状态下,因为判决门限较低,故识别器的漏识别概率减小,假识别概率增加,但假识别信号与单稳输出信号不同步,故‘与门’1与‘与门’4不输出假识别信号,‘与门’3输出的仍是正确的帧同步信号。在维持状态下,也可能出现漏识别,但由于漏识别概率比较小,只要识别器不连续出现三次漏识别,则分频器2就不输出一个脉冲信号,维持态不变;若超过三次,则维持态变为捕捉态,重新捕获帧同步码。若首次捕获的是信息数据中与帧同步码完全相同的码元序列,则系统将进入错误的同步维持状态。如果连续传输以一帧为周期的信号,此状态将维持下去。但在实际传输中,连续几帧都输出假识别信号的概率极小,所以这种错误的同步维持状态存在的时间很短。
2.3 编译码模块设计
限于篇幅,本文只简单介绍汉明码与卷积编码模块的实现。它们已很好地应用在本实验室的通信系统实验箱中。
2.3.1 汉明码编译码模块
以(7,4)汉明码为例,校正子与错码位置的对应关系如表1所示[2]。
监督位计算如下:
4位码元相应进入编码器,首先进行串并变换,然后进行汉明编码,最后进行并串变换。主要代码如下:
if(clk1‘event and clk1=‘0’) then
if (en=‘0’ and counter1=0) then
tempt(6 downto 3)〈=datain(3 downto 0);
tempt(2) 〈= (datain(3) XOR datain(2))
XOR datain(1);
tempt(1) 〈= (datain(3) XOR datain(2))
XOR datain(0);
tempt(0) 〈= (datain(3) XOR datain(1))
XOR datain(0);
end if;
end if;
在此模块中要设定输入时钟和输出时钟的周期为7比4的关系,具体周期大小与码元速率对应。对于译码模块,原理相同,在此不再赘述。汉明码编译码模块的仿真波形如图6所示。图中,outp1为编码输出,outp2为译码输出,仿真结果与理论计算值相同。
2.3.2 卷积码编译码模块
以(2,1,6)卷积编译码器为例,选择生成矩阵为G(D)=(1,1+D2+D5+D6)的卷积码。这种卷积码不仅是系统码,而且是自正交码。假设输入信息序列M=(1111),即M(D)=1+D+D2+D3,则编码器的输出C(D)=M(D)×G(D),即编码器输出序列为11111010010000000001。解码采用大数逻辑译码方法,可以纠正连续14个信息码元中的2个随机错误。对于存在突发干扰的信道,采用这种方法可获得非常大的编码增益。译码中完成纠错的代码如下:
summ:process(s)
begin
if s(6)=‘1’ then c6〈=1;else c6〈=0;end if;
if s(5)=‘1’ then c5〈=1;else c5〈=0;end if;
if s(2)=‘1’ then c2〈=1;else c2〈=0;end if;
if s(0)=‘1’ then c0〈=1;else c0〈=0;end if;
end process;
sum〈=c0+c2+c5+c6;
men:process(sum)
begin
if sum>=3 then temp〈=‘1’;else temp〈=‘0’;
end if;
end process;
卷积码模块仿真波形如图7所示。图中,encode为编码输出,decode为解码输出。由图可见,结果与理论计算相同。其中,编码输出速率为信息码速率的两倍。
2.4 Nios微处理器模块
Nios CPU核有Nios-16和Nios-32两种结构,这里选用Nios-32处理器,它的预配置有标准型、最小型、全功能、标准调试功能以及自定制。在此选用标准调试功能,在标准模式下增加了用于JTAG在线调试的OCI模块,可以通过JTAG进行Nios调试[3];还定义了一个ROM 和RAM 模块,其数据宽度均为32 位,大小均为2KB。ROM 用来存储GERMS Monitor程序,以便进行软件调试, RAM作为程序运行空间和变量空间。UART 为通用串行通信IP ,用来外接RS232,用于系统的调试和通信。Avalon交换结构总线用来连接外部的Flash、SRAM以及用户自定制逻辑。Avalon需要极小的FPGA资源,提供完全的同步操作。该模块还定义了一个4×4的键盘,用来选择编译码方式、信息速率以及工作模式等。
在SOPC Builder中添加相应模块,生成Nios微处理器及部分外设。在Quartus Ⅱ环境下采用模块化方法将SOPC Builder下定制的Nios CPU软核和用VHDL语言描述的硬件模块加以整合。通过图形化建模实现端口和信号流的匹配。
3 软件实现
软件实现包括系统的初始化,对RAM、ROM进行操作,读键盘和LCD显示等,主要由Nios SDK shell来完成,通过串行通信口测试Nios的控制程序,控制程序用C语言来实现。
Nios开发套件提供了将程序代码存储在Flash存储器的功能,GERMS监控程序在CPU启动后自动执行程序代码。将代码存储在片外存储器有两种方法[4],本文采用的方法是使用软件程序srec2flash将.srec格式的可执行程序代码转换为可以写入Nios系统Flash存储器的.flash文件,在完成该操作的同时,srec2flash在.Flash文件的开始添加了一段代码,用于将应用代码从Flash复制到RAM中并运行。软核启动机制如图8所示。系统上电后,串行配置器件EPCS4配置FPGA;配置完毕后复位Nios并运行片上ROM中的BootLoader;选择运行模式;在调试模式下,BootLoader启动GERM监控程序,为开发者提供对系统进行开发调试的条件。在控制模式下,BootLoader将Flash存储的主程序装载到RAM中,指针指向程序开始地址,开始运行主程序;初始化,并配置系统。
所选用Altera公司Cyclone系列的EP1C12Q240C8为核心的芯片,它内部包含12 060个基本逻辑单元和52个M4K RAM blocks,总共可以提供239 616bit的RAM资源,满足了系统的需求。
本文利用可编程逻辑的灵活性和Nios的强大处理能力,将多种编译码模块和微处理器模块集成到一片FPGA内部,方便地实现了通用编译码器的设计。由于采用了VHDL语言,使系统具有可移植性和可扩展性。该设计已通过实际运行且效果良好。
参考文献
1 王 志,石江洪,周剑扬等.同步数字复接的设计及其FPGA实现[J].电子技术应用,2005;(4):77~80
2 樊昌信,张甫翊.徐炳祥等.通信原理[M].北京:国防工业出版社,2001:288
3 潘 松,黄继业,曾 毓.SOPC技术实用教程[M].北京:清华大学出版社,2005
4 柳一村.基于Nios的SOPC系统设计以及程序引导[J]. 电子技术,2005;32(6):70~72