1、 0 专业设计报告 基于 FPGA 的交织器和解交器的实现 班 级: 08 集成 专 业: 学院: 电子信息工程 指导老师: 1 目录 一:交织器原理 2 1 实现原理 2 2 纠错原理 2 二 交织器的 FPGA 实现 1 整体结构 3 2 功能分析 3 3 模块设计 4 ( 1)计数器模块 4 . ( 2)选择器模块 5 ( 3) ROM 模块 6 ( 4) RAM 模块 7 ( 5)顶层模块 9 三 设计总结 .14 2 一: 交织器原理 1 实现原理 随着通信技术的发展,对系统要求不断提高,在移动通信领域,由于数字信号在传输途中会随各种干扰,使得信号失真,因此需要利用编码技术来纠正信道
2、中产生的随机错误。但是,仅利用纠错编码技术,对于传输过程中突发性干扰需要借助很长的码字 ,这样会很复杂,同时产生很长的延时,。 交织技术作为一项改善通信系统性能的方式,将数据按照一定的规律打乱,把原来聚集的错误分散,使得突发错误变为随机错误,使得突发码字个数在纠错范围内,接收 端就 可以用较短的码字进行纠错。 交织的过程就是将一个数据系列按一定的条件进行位置从新排布。其逆过程就是解交。 常用交织器主要有三种:矩阵分组式, 伪随机式, 半伪随机式 。本设计采用矩阵分组式。 矩阵分组式的原理及实现方式如下: 假设发送 X=( xxx 321 ) 首先将 X 送入交织器,此交织器设计为按行取出的 4
3、x4 的阵列存储器。送入交织器后,从存储器按行输出,送入突发 差错的信道,信道输出在送入反交织器,完成交织与反交织,即按行输入,按列输出。 按行读出 15xx 1 1x7x314xx 1 0x6x213xx9x5x1x 1 2x8x40x: 按列写入 则 交织器的 输出为( x0, x4 , x8, x12, x1, x5, x9, x13, x15) 2 纠错原理: 假设信道产生两个突发性错误,第一个产生与 x0 到 x12,连错 4 个,第二个产生于 x9 到 x2,连错三个,则此收到的信号为,( x0, x4 , x8, x12, x1, x5, x9,x13, x2, x6, x10,
4、 x14, x3, x7, x11, x15) (加 的为错误信号 ) 3 经过交织去交矩阵输出为( x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10,x11, x12, x13, x14, x15)可以看到原来的四连错和三连错变成了随机性独立差错。 二 交织器的 FPGA 实现 1 整体结构 交织器总是按顺序写入数据,然后按交织地址读出数据。解交的过程与此过程相反,按解交地址写入数据,再按顺序读出数据就可以了。因此交织器和解交器可以按相似电路完成。 2 功能分析 交织器要 写入数据,将数据存储起来,并读出,需要 ram 模块。 交织地址是固定的交织方式,
5、可以用 rom 将地址存储起来,按顺序读取 rom 存储的 ram地址就可以完成交织。 控制部分有计数器,选择器组成,完成对 ram 读写的控制。 电路框图如下 计数器产生顺序地址,数据选择器起地址控制作用,当需要顺序地址 时 ,直接由计数器输到地址总线,当需要交织地址时,计数器的 输出送到 ROM 地址总线,再将 ROM 读出的交织地址送出 。 RAM 模块 二选一选择器 ROM 模块 计数器 输出数据 输入数据 写信号 读信号 交织解交控制 交织地址 顺序地址 4 3 模块设计 ( 1) 计数器模块 计数器的作用是 ,为选择器提供顺序地址, 为 rom 提供地址 VHDL 描述如下: li
6、brary ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity countern is generic(n:integer:=16); port(clr,ena,clk:in std_logic; q:buffer integer range 0 to n-1; cout:out std_logic); end countern; architecture rtl of countern is begin process (clk,clr) begin if clr=1then q=0; else if
7、 clk=1 and clkevent then if ena=1 then if q=qhigh then q=0; else q=q+1; end if; end if; end if; end if; if q=qhigh then cout=1; else cout=0; end if ; end process; end rtl; 仿真波形如下: 5 ( 2) 选择器模块 VHDL 描述如下 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity mux2 is generic (
8、n:integer:=16); port (d0:in std_logic_vector(7 downto 0); d1: in integer range 0 to n-1; sel:in std_logic; yout: out std_logic_vector(7 downto 0); end mux2; architecture if_march of mux2 is begin process(d0,d1,sel) begin if(sel=1) then yout=conv_std_logic_vector(d1,8); else yout=d0; end if; end proc
9、ess; end if_march; 6 选择器仿真波形如下图 : ( 3) ROM 模块 library ieee; use ieee.std_logic_1164.all; entity rom_16_8 is generic(n:integer:=16); port(addr: in integer range 0 to n-1; clk: in std_logic; data: out std_logic_vector(7 downto 0); end rom_16_8; architecture rtl of rom_16_8 is subtype rom_word is std_l
10、ogic_vector(7 downto 0); type rom_table is array(0 to 15) of rom_word; constant rom :rom_table:=rom_table( rom_word(“00000000“), rom_word(“00000100“), rom_word(“00001000“), rom_word(“00001100“), rom_word(“00000001“), rom_word(“00000101“), rom_word(“00001001“), rom_word(“00001101“), rom_word(“0000001
11、0“), rom_word(“00000110“), rom_word(“00001010“), 7 rom_word(“00001110“), rom_word(“00000011“), rom_word(“00000111“), rom_word(“00001011“), rom_word(“00001111“); begin process(clk) begin if clkevent and clk=1 then data=rom(addr); end if; end process; end rtl; ROM 模块仿真波形图 ( 4) RAM 模块 library ieee; use
12、 ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity ram_16_8 is port (ad:in std_logic_vector(7 downto 0); clk :in std_logic ; di:in std_logic_vector(7 downto 0); do:out std_logic_vector(7 downto 0); 8 wr_en: in std_logic:=0; rd_en: in std_logic :=0); end r
13、am_16_8; architecture rtl of ram_16_8 is subtype ram_word is std_logic_vector(7 downto 0); type ram_table is array (0 to 15) of ram_word; signal ram:ram_table:=ram_table( ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“
14、), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“), ram_word(“00000000“); begin process(clk) begin if clkevent and clk=1then if rd_en=1then do=ram(conv
15、_integer(ad); end if ; if wr_en=1 then ram(conv_integer(ad)=di; end if ; end if ; end process; end rtl; 9 ( 5) 顶层模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity top is generic(n:integer:=16); port (clk: in std_logic; clr: in std_logic; ena :in std_logic; di: in std
16、_logic_vector(7 downto 0); do : out std_logic_vector(7 downto 0); end top; architecture rtl of top is component countern port(clr,ena,clk:in std_logic; q:buffer integer range 0 to n-1:=0; cout: out std_logic); end component; component rom_16_8 port(addr: in integer range 0 to n-1; clk: in std_logic; data: out std_logic_vector(7 downto 0); end component; component mux2 port(d0:in std_logic_vector(7 downto 0); d1: in integer range 0 to n-1; sel: in std_logic; yout:out std_logic_vector(7 downto 0); end component;