当前位置:文档之家› 利用VHDL实现(2,1,2)卷积码编码

利用VHDL实现(2,1,2)卷积码编码

专业课程设计报告题目:利用VHDL实现(2,1,2)卷积码编码姓名:专业:通信工程班级学号:同组人:指导教师:南昌航空大学信息工程学院20 17 年6 月27 日专业课程设计任务书2016-2017学年第 2 学期第 17 周- 19 周摘要在现代数字通信中,为降低数据传输的误码率,提高通信质量及其可靠性,常在通信中采用纠错编码技术。

其中卷积码就是一种具有较强纠错能力的纠错码。

由于Vitebrbi译码算法比较容易实现,卷积码得到了广泛应用。

本课题简明地介绍了用EDA技术实现卷积码编码器的实现。

卷积码纠错性能常常优于分组码,是一种性能优越的信道编码。

由于码字之间的相关性,其编码器要利用移位寄存器来存储状态。

随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。

卷积码作为通信系统中重要的编码方式,以其良好的编码性能,合理的译码方式,被广泛应用。

本文在阐述卷积码编码器基本工作原理的基础上,给出了(2,1,2)卷积编码器的VHDL设计,在QuartusⅡ环境下进行了波形功能仿真,并下载到EP1C6T144C8N芯片上进行验证,最终实现输入四位序列,编码输出八位通过指示灯显示。

关键词:卷积码QuartusⅡEP1C6T144C8N目录:摘要 (4)目录: (5)第一章系统设计要求 (6)1.1系统设计要求 (6)第二章系统组成与工作原理 (6)2.1系统组成 (6)2.2编码器设计原理 (6)2.2.1结构图法描述编码器 (7)2.2.2(2,1,2)卷积码的状态转移图 (8)第三章编码器设计方案与对比选择 (9)第四章 VHDL语言实现及仿真调试 (10)4.1编码器电路设计 (10)4.2VHDL描述编码器 (11)4.2调试 (12)第五章 FPGA编程下载 (15)第六章实验心得 (16)参考文献 (17)第一章系统设计要求1.1系统设计要求1.设计一个(2,1,2)卷积码编码器。

2.在FPGA上用VHDL硬件描述语言实现上述编码器和译码器。

3. 通在试验箱上过拨码开关输入信息序列,观察编码输出(即指示灯的亮灭)第二章系统组成与工作原理2.1系统组成2.2编码器设计原理卷积码也是分组码,但它的监督码元不仅与本组的信息码(k位)有关,而且还与前面若干组(m组)的信息码元有关。

用(n,k,m)表示。

卷积编码的原理框:图2-1 图图图图图图图卷积编码的编码约束长度定义为:串行输入比特通过编码其所需的移位次数,它表示编码过程中相互约束的分支码数,所以具有m级移位寄存器的编码器得约束长度为m十1,有时也说(m十1)n为卷积编码的编码约束长度。

与分组编码一样,卷积编码的编码效率也定义为R=k/n,与分组码具有固定码长n不同,卷积码没有,我们可通过周期性地截断来获得分组长度。

为了达到清空编码移位寄存器数据bit的目的,需要在输入数据序列末尾附加若干0bit。

由于附加的0不包含任何信息,因而,有效编码效率降至k/n以下,如果截断周期取值较大,则有效编码效率会逼近k/n。

2.2.1结构图法描述编码器卷积码编码器主要由移位寄存器和模2加法器组成,(2,1,2)卷积码编码器结构图如下:图2-2-1 图2,1,2图图图图图图图图图图2.2.2(2,1,2)卷积码的状态转移图该状态图描述了编码器每输入一个信息元时,编码器各可能状态以及伴随状态的转移所产生的分支码字。

图2-2-2 (2,1,2)卷积编码器状态转移图图中的小框表示寄存器的状态,连接小框的箭头表示状态转移的方向,两线旁的数字表示:输出分支码字/输入信息比特。

状态图简明的表示了在某一时刻编码器的输入比特和输出分支码字的关系。

2.2.3(2,1,2)卷积码的生成多项式●卷积码编码器第i 条支路的生成多项式g ()i (D)= ()()()2()012...i i i i k k g g D g D g D ++++,对于(2,1,2)卷积码其生成多项式为:g(1)(D)=1+D+2D , g (2)(D)=1+2D ,信息序列a=(0121,,,...,N a a a a -)也可表示为a(D)= 210121...N N a a D a D a D --++++,相应的第i 条路径的输出为()()()()()i i v D g D a D =,输出序列可根据v(D)= g (1)(D)a(D)与g(2)(D) a(D) 交织求得。

● 该(2,1,2)卷积码,一位输入有两位输出,两位都是检验位,信息位被隐藏。

生成多项式为 g1=x ²+x+1 g2=x ²+1生成矩阵为G=[11100101100110110000000111000011] 生成矩阵每一行都是码字,即分别是1000,0100,0010,0001四种输入的编码输出,输入其他任意四位序列,其编码输出可以由对应行模2加得到。

以输入序列1101为例,其编码过程如下:输入:1101=1000⊕0100⊕0001输出: 11101000=11101100⊕00111011⊕00000011第三章 编码器设计方案与对比选择 根据前面对卷积码的描述,实现(2,1,2)编码器主要采用以下两种方案●方案一:(2,1,2)卷积码总共只有四种状态,对其采用二进制编码00,01,10,11,任意时刻输入0/1,其输出都在四种状态间跳转。

利用编码后的状态作为输出显示。

●方案二:用(2,1,2)卷积码两个生成多项式分别与输入信号卷积得到两位编码输出。

其间要设置寄存器的状态,并在输入时刻实现寄存器的移位功能。

最终通过模2加得到两位输出再通过中间存储输出最终序列。

实验箱上通过一位拨码开关控制输入,两个指示灯显示编码输出的跳换。

●对比选择两种方案的VHDL语言实现都较为简单。

都需要最初控制复位信号对寄存器清零。

但是最终实现下来,发现方案一较为局限。

虽然仿真结果成功,输入任意随机序列,可以达到编码效果,但是在实验箱上控制发现,因其只有一个输入,所以只用通过一位拨码开关实现输入,而实验箱上时钟频率过高,最后分频虽然能得到正确的编码输出,但输入太局限只能是一串1或0,最终显示灯停在10或者00状态,想要实现输入任意序列对时钟频率的要求过高,短时间难以实现。

而方案二通过改进,实现起来简单,可以直接通过四个拨码开关控制输入,显示灯直接显示8位编码后的输出。

所以综合优缺点,最终以方案二进行设计。

第四章VHDL语言实现及仿真调试4.1编码器电路设计(2,1,2)卷积码编码器模型图4.2VHDL描述编码器library ieee;use ieee.std_logic_arith.all;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity juanji1 isport(clk,rst:in std_logic;d:in std_logic_vector(3 downto 0);s:out std_logic_vector(9 downto 0));end entity; --编码器输入输出端口architecture behave of juanji1 issignal temp:std_logic_vector(9 downto 0);signal c1:std_logic_vector(4 downto 0);signal c2:std_logic_vector(4 downto 0); --中间变量,存储输出signal m:std_logic_vector(2 downto 0); --寄存器状态存储signal n:integer range 0 to 7;--signal rst1:std_logic; --只截取一次编码输出,截断后面的编码--signal cnt:std_logic_vector(3 downto 0);begin--process(rst,clk)--begin--if(clk'event and clk='1') then--if(cnt(3)='0') then--rst1<='0';--cnt<=cnt+1;--else--rst1<='1';--end if;--end if;--elsif(rst='1') then--rst1<='1';--end if;--end process; --控制复位信号,截断后续编码process(rst,clk)beginif(rst='1') thenm<="000";n<=0; --寄存器初始清零elseif (clk'event and clk='1') thenm(0)<=m(1);m(1)<=m(2);m(2)<=d(n); --时钟上升沿输入一位信息temp(2*n)<=c1(n);temp(2*n+1)<=c2(n); --暂存输出n<=n+1;end if;end if;end process;c1(n)<=m(0) xor m(1) xor m(2);c2(n)<=m(0) xor m(2); --编码输出逻辑描述s<=temp;end behave;4.2调试c1(n)<=m(0) xor m(1) xor m(2);c2(n)<=m(0) xor m(2);这两句是对编码输出的逻辑描述,最初放在进程中,发现系统报错:后查书发现,这两句属于简单信号赋值语句,属于并行语句,要放在结构体中,进程中是顺序语句,所以出错。

修改后虽然编译成功,也能仿真,但是8位输出中,前两位始终是0,而第四个信息位并没有实现编码,这是因为结构体中这两句复制信号并行执行,所以最开始就会把最低两位赋值,始终占据最低两位。

要想最后一位也编码,必须扩大输出,最终将8位输出扩大为10 位后,成功得到编码。

仿真如下:由上个仿真结果清楚地看到,虽然得到正确编码,但因为复位信号的无效,所以一直在输入状态,编码并不止一次,而由于卷积码编码是利用码字之间的相关性,后续编码实在是不好分析,最终通过控制复位信号实现截断,使之只产生一次编码,最终仿真如下:图仿真实现了输入1101,输出11010100。

●后续编码分析(不截断)为正确分析后续编码,将中间变量n添加进来。

temp(n)是个一维数组型变量,用来暂存输出。

n是个整形变量范围是0-4;quartus中自动用三位二进制数表示,三位二进制最大可以表示8个数,按照我们设定的temp的值,n只能取其中的五个数。

相关主题