1、这样,在传输过程中即使发生了成串差错,恢复成一条相继比特串的消息时,差错也就变成单个(或长度很短),这时再用信道编码纠错功能纠正差错,恢复原消息。如此可见交织技术进一步提高了系统的抗干扰性能交织编码根据交织方式的不同,可分为分组交织、卷积交织等。其中分组交织编码是一种比较常见的形式。一个典型的分组交织器是一个按着NM矩阵描述的周期为TNM的交织器,这些交织器典型的特征就是在数据的读写过程中是按着行读列出或列读行出的形式进行的。交织编码引入的延时应尽可能小。本次设计实验中,为了同时满足块内交织进行32*32矩阵转置变换和延时尽可能小的要求,该交织器利用2片双口RAM实现,记作RAM1和RAM2。
2、交织处理时,按地址从01023将输入数据全部写入RAM1,待数据全部送入RAM1后,控制信号使RAM1由写状态转换到读状态,同时,将输入的待交织数据写入RAM2,RAM2为写状态,交织器由RAM1输出数据。经过1024个时钟周期后,从RAM1读出数据的同时,RAM2写入数据。此时,改变RAM1和RAM2的读写状态,RAM1开始写,从RAM2读取数据。如此反复完成数据的实时连续交织处理。五、实验步骤及结果1、IP核双口RAM的使用(1)添加IP核:点击【Tools】【MegaWizard Plug-In Manager】,在弹出的对话框中,选择【Create a new custom megaf
3、unction variation】,并点击【Next】 (2)选择IP核:选择【Memory Compiler】中的【RAM: 2-PORT】,并在【What name do you want for the output file?】中为生成的IP核模块命名。(3)配置IP参数:根据向导进行配置。(4)点击finish,设计完成。2、分组交织器的设计jiaozhiqi工程由四个模块构成。他们分别是:计数器模块counter、两个RAM1024_10构成的RAM模块、存储读取地址的rom_64_6模块以及顶层的控制模块jiaozhi模块。其中RAM1024_10模块按要求采用了IP核,并采用
4、了大小为1024*10的双端口RAM;而工程中还包含测试向量文件tb_jiaozhi.vhd。编译成功后,Modelsim仿真得到:由上图可以看出,交织器输出对输入存在延时。将图像局部放大:可以看出可在第1028个时钟信号时,交织器输出交织后的第一个数0,接着输出32,64,表明第一帧交织正常,且交织存在3个时钟信号的延迟。由上图可知,输出为1023时,下一个输出是0,表明第一帧交织完成,第二帧开始交织。因此,帧的连续交织正常。仿真的输入和输出数据如下:打开datain:其中连续输入三次01023。打开dataout:交织器先是输出一连串0,然后输出32,64在实验中需要注意的地方:(1)关于
5、写入地址的得到方法:高/低地址:0000000001000100001100100A0A1A2A3A4B0B1B2B3B4C0C1C2C3C4D0D1D2D3D432*32的RAM地址为10位,分为高5位和低5位。只要把高地位地址互换就能得到写入的地址。(2)仿真输入的datain数据要足够多,设置的仿真时间要足够长。在实验中,输入的文本中有1024*3个数,由于设计的交织器是32*32的,一次可以处理1024个数,因此恰好能处理3次,由此检查交织器是否能够连续工作。设置足够长的仿真时间,是因为交织延时的存在,防止时间不够而无法正常输出。如下图:由于仿真时间设置过短以及交织延时的存在,只有10
6、23个数据输入,且不能正确输出。六、实验感想通过这次实验,我学到了很多东西:首先,对IP核有了一定的了解,并学会了使用IP核构建双口RAM;其次,加深了对分组交织器的理解,通过自己动手实验并观察结果,对交织延时的概念更加清晰。再者,在这次实验的过程中,也更为熟练的掌握了Quartus II与Modelsim联合仿真的步骤,学习了在一个工程中调用自己编写的文件的方法。附录1、交织器源文件(1)counterlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNE
7、D.ALL;entity counter isPort( reset : in std_logic; clock : cnt_wr_address : out std_logic_vector(9 downto 0); cout: out std_logic; cout2: out std_logic);end counter;architecture Behavioral of counter issignal inner_reg : std_logic_vector(9 downto 0):=0000000000;signal inner_cout: std_logic :=0 begin
8、 cnt_wr_address =inner_reg; cout=inner_cout; process(clock,reset) if (reset = 1) then inner_reg = elsif(clockevent and clock= inner_reg = inner_reg+0000000001 if(inner_reg=1111111111)then inner_cout=NOT inner_cout; end if; if(inner_reg=0000000010 cout2end process;end Behavioral;(2)rom_64_6LIBRARY IE
9、EE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY rom_64_6 isPORT( rom_din : IN STD_LOGIC_VECTOR(9 DOWNTO 0); clk: IN STD_LOGIC; rom_dout_wr: OUT STD_LOGIC_VECTOR(9 DOWNTO 0); rom_dout_rd: out std_logic_vector(9 downto 0);END rom_64_6;ARCHITECTURE rtl OF rom_64_6 ISBEGIN PROCESS(clk)BEGIN IF clkEVENT AND clk= T
10、HEN rom_dout_rd=rom_din(4 downto 0) & rom_din(9 downto 5); rom_dout_wrclk, reset=clr, cnt_wr_address=romin_address, cout=sel, cout2=sel2 );rom:ROM_64_6PORT MAP(clk= rom_din= rom_dout_rd=rd_address, rom_dout_wr=wr_address);ram1:RAM1024_10PORT MAP(clock= q=dout_tmp1, data=din, wren=wren_ctl, rdaddress
11、= wraddress=ram2:dout_tmp2,wren_ctl_2,wren_ctl_2=not wren_ctl; BEGINevent and clk= IF sel= wren_ctl - ram1 write ELSE -ram2 write END IF; if sel2= then dout clr= din= dout=dout ); Clk_process :process clk wait for Clk_period/2; end process; writing: process(clk) variable line_out : line; variable line_in : variable input_tmp : integer; if(clk readline(file_in,line_in); read(line_in,input_tmp); din=conv_std_logic_vector(input_tmp,8); write(line_out,conv_integer(dout); writeline(file_out,line_out);end behave;