Quartus实验报告和PN9,交织器.docx

上传人:牧羊曲112 文档编号:4888614 上传时间:2023-05-21 格式:DOCX 页数:19 大小:425.20KB
返回 下载 相关 举报
Quartus实验报告和PN9,交织器.docx_第1页
第1页 / 共19页
Quartus实验报告和PN9,交织器.docx_第2页
第2页 / 共19页
Quartus实验报告和PN9,交织器.docx_第3页
第3页 / 共19页
Quartus实验报告和PN9,交织器.docx_第4页
第4页 / 共19页
Quartus实验报告和PN9,交织器.docx_第5页
第5页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Quartus实验报告和PN9,交织器.docx》由会员分享,可在线阅读,更多相关《Quartus实验报告和PN9,交织器.docx(19页珍藏版)》请在三一办公上搜索。

1、大人课程实验名称名称专业班级姓名学号日期通信系统集成电路设计Quartus II 实验二2012.12.16实验二:PN9序列,交织器1. 实验目的a)了解伪随机序列的应用和产生原理、方法;b)掌握在FPGA上利用线性反馈移位寄存器实现伪随机码发生器的方法。c)通过波形仿真验证此实现方法的正确性和伪随机序列的周期性。2. 实验环境a) Quartus II 9.1 (32-Bit)b) ModelSim-Altera 6.5a (Quartus II 9.1)c) WinXP操作系统3. 实验要求1)PN9序列编写生成PN9的程序,用测试向量将结果写到txt文件中,用Matlab统计周 期内的

2、0和1数目。2)分组交织器8*8从文本中读出数据(0255:用8bits表示)交织后写到另一个文本,交 织采用分组RAM实现,分组RAM调用IP核实现(先写一个文本,然后按 列写入,按行输出)。3)汉明码(选做)将PN9 4个4个地输入到汉明码编码器中,得到(7,4)汉明码,然后按1% 的比例加错。然后进行译码,观察汉明码的纠错能力。此部分一共包含3个 模块:编码,译码和测试模块。4. 实验内容1)PN9伪随机码发生器在扩频通信、信息加密和系统测试等领域中有着广泛的应用。 伪随机序列的伪随机性表现在预先的可确定性、可重复产生与处理。伪随机序列 虽然不是真正的随机序列,但是当伪随机序列周期足够长

3、时,它便具有随机序列 的良好统计特性。本报告给出了利用VHDL语言实现伪随机码发生器的设计, 在FPGA内利用线性反馈移位寄存器结构实现伪随机码的产生,该方法结构简 单,易于实现,所产生的伪随机序列具有周期长和随机特性好的特点。如图所示的一个n级线性移位寄存器可以用n次多项式来表征,称以此式为特征多项式的n级线性反馈移位寄存器所产生的序列,其周期p W25-1。特征式:/ (x ) =c;1+e|+erv:+*+n级线性反馈移位寄存器(LSFR)的输出是一个周期序列。当初始状态是0 状态时,LSFR的输出都是0序列。同一个LSFR的输出序列还和起始状态有关。本实验的特征多项式为:f(X)=XA

4、9+XA5+1故原理图应包含9个移位寄存器,a8a7-a0为寄存器的初值,程序中令初值为 100, 000, 000。原理图2)分组交织器信道编码中采用交织技术,可打乱码字比特之间的相关性,将信道中传输过 程中的成群突发错误转换为随机错误,从而提高整个通信系统的可靠性。交织编 码根据交织方式的不同,可分为分组交织、卷积交织等。其中分组交织编码是一 种比较常见的形式。交织编码引入的延时应尽可能小。为了同时满足块内交织进行8*8矩阵转置 变换和延时尽可能小的要求,该交织器利用2片双口 RAM实现,记作RAM_A 和RAM_B。交织处理时,按地址从064将64 bits输入数据全部写入RAM_A,

5、待64 bits数据全部送入RAM_A后,控制信号使RAM_A由写状态转换到读状 态,同时,将输入的待交织数据写入RAM_B,RAM_B为写状态,交织器由 RAM_A输出数据。经过64个时钟周期后,从RAM_A读出64 bits数据的同时, RAM_B写入64 bits数据。此时,改变RAM_A和RAM_B的读写状态,RAM_A 开始写,从RAM_B中读取数据。如此反复完成数据的实时连续交织处理。完成交织处理的核心问题是处理好读/写地址之间的关系。为减少FPGA运 算量,可利用Matlab,C语言等实现读/写地址矩阵转置运算。这里采用Matlab 完成读/写地址矩阵转置运算,读/写地址的变换结

6、果存储在rom_64_6.vhd文 件的 rom_table 中。5. 实验步骤及结果(一)PN91)建立名为pn9的新工程,编写产生PN9序列的PN9.vdl和PN9测试向量文件tb_pn9.vhd,并添加到工程中;2)用Modelsim仿真结果。编译通过后仿真,结果如下:图仿真波形图由图初步看出,最后需要输出的Sout信号没有明显规律。这就是我们想要 的伪随机序列。3)生成的文本文件打开后(前面有连续多个的0是由于复位信号在10个时钟周期后才置1):4)将仿真结果dataout.txt文件中的数据导入matlab。由于PN9序列是周 期为511的伪随机序列,故采用一个二维矩阵x_511来处

7、理数据:二维矩阵大小 设置为511*100,按列顺序读入dataout.txt中的数据,即每一列为一个PN9序 列,一共100个PN9序列。对每列的PN9序列做如下处理:1. 求自相关函数,画出自相关函数,检查是否符合m序列的自相关特性。2. 统计1的个数和0的个数,看是不是满足m序列1比0多一位的特性。具体代码如下图所示:Mat lab处理PN9数据的代码其处理结果为:每列PN9的1的个数均为num1=256, 0的个数均为num0=255, 其自相关函数如下图:PN9序列的自相关函数经过Matlab处理分析数据可知,设计的PN9产生器符合要求。(二)分组交织器1) fzfinal工程由四个

8、模块构成。他们分别是:计数器模块counter、两个 RAM64_8构成的RAM模块、存储读取地址的rom_64_6模块以及顶层的 控制模块jiaozhi模块。其中RAM64_8模块按要求采用了 IP核,并采 用了大小为64*8的双端口 RAM。而工程中还包含测试向量文件 tb_jiaozhi.vhd。编译成功后,仿真得到:8,16,表明第一帧交织正常。交织存在3个时钟信号的延迟。在这里,输出为63时,下一个输出是64,表明第一帧的交织完成,第 二帧开始交织,帧的连续交织正常。仿真的输入数据如下:6. 需要注意的地方(一)、PN9a) a8a7-a0 初始为 100, 000, 000if(R

9、st=111)thenrc=rr000000001rr;同一个n级线性反馈移位寄存器的输出序列还和起始状态有关。这里初 始状态不能全为0,否则反馈时异或得到的都是0,最后输出的序列也是零, 就不具备伪随机性了。b) 验证此序列的伪随机性如图,周期6405-1295=5110。脉冲周期10ns,故511个为一伪随机码周 期。满足伪随机数列周期小于等于2AN-1的条件,即511=2A9-1=511一一 Clock period definitionsconstant Clk_period : time := 10 ns;图脉冲周期为10ns6500 ns6405 ns图计算伪随机序列的周期、交织器

10、a)、关于写入地址的得到方法CONSTAIJt ruin: ruin t;5Ljle : =roii 七le 1 i:EuiriruinEuiriruinruinruinruinruinruinruinruine urnruine urnruine urnruine urnword1 i:ppuouuuopr), word1 (pp0010|00p,) word1 (rr010000rr) word1 (pp011000p,) word1 (FF100000F,) word1 (pp101000p,) word1 (FF110000F,) word1 (pp111000p,) word1 (F

11、F000001F,) word1 (pp001001p,) word1 (FF010001F,) word1 (rr011001rr) word1 (FF100001F,) word1 (rr101001rr) word1 (FF110001F,) word1 (rr111001rr) word1 (pp000010p,) word1 (rr001010rr)rnm T.Tnrri 1 f PPH1 nm nprl .这个地址表可以按照以下方法简便地生成:高/低地址:000001010011000001010011100A0A1A2A3A4B0B1B2B3B4C0C1C2C3C4D0D1D2D

12、3D4如图,8*8 RAM的地址应为6位,分为高3位和低3位。 写入地址为:000000,001000,010000,011000,100000,101000,110000,111000,读出地址为:000000,000001,000010,000011,000100,000101,000110,000111,由此可见,只要把高低位地址互换就能得到写入的地址。b)、要注意两块RAM模块的读写控制jiaozhi模块中sel与counter的输出cout相连,用于控制两块RAM哪个读、 哪个写。由于交织器存在延时,故用sel2与counter的输出cout2相连,用于交 织输出延时控制,使其输出正

13、确数据。c)、仿真输入的文本后面应有足够多的0先用matlab产生数据到txt文件,数据内容为0,1,2,255,0,0,0, 即先是0到255的256个数,后面全是0。取256个数是因为所设计的交织器是 8*8的,即一次处理64个数,256刚好处理4次,可以由此检查交织器是否能连 续工作。后面跟的长串的0是因为交织存在延时,所以后面多加了至少64+3个 0(64是处理数据延时,3是输出延时),以保证交织输出最后一个数255时,交 织器还有数据可读入。7. 实验结论:PN9序列可以采用线性反馈移位寄存器结构产生。伪随机序列不是真正的随 机序列,n级线性反馈移位寄存器所产生的序列,其周期p W2

14、5 -1。但是当n 足够大时,伪随机序列周期很长,它便具有随机序列的良好统计特性。利用VHDL 语言实现伪随机码发生器的设计,结构简单,易于实现,周期内随机特性好。用双口 RAM设计的交织器,其只通过控制双端口 RAM的读写地址的产生 而实现交织过程,而且读写地址易于产生,无需串/并转化,使得系统简化,稳 定性提高。8. 附程序1.PN9模块程序(PN9.vhd) library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; Uncomment the

15、 following library declaration if instantiatingany Xilinx primitives in this code.-library UNISIM;use UNISIM.VComponents.all;entity pn9 isPort(Clk:in STD_LOGIC;Rst:in STD_LOGIC;Sout:out STD_logic );end pn9;architecture Behavioral of pn9 issignal rc:STD_LOGIC_vector(0 to 8);-定义 9 级寄存器 beginSout=rc(0)

16、;process(Clk,Rst)beginif(Rst=1)thenrc=000000001;elsif(rising_edge(Clk)thenrc(0 to 7)=rc(1 to 8);-寄存器移位rc(8) Clk,Rst = Rst,Sout = Sout); Clock process definitions Clk_process :process beginClk = 0;wait for Clk_period/2;Clk = 1;wait for Clk_period/2;end process;Stimulus process stim_proc: process begi

17、nhold reset state for 100 ms.Rst=1;wait for Clk_period*10;insert stimulus here Rst=0;wait;end process;writing: process(Clk,Rst)file file_out : TEXT is out dataout.txt”; variable line_out : LINE;beginif(Clkevent and Clk=1)thenif(Sout=1)thenwrite(line_out,1);elsewrite(line_out,0);end if;writeline(file

18、_out,line_out);end if;end process;END;2.8*8交织器(1)交织器源文件(a) counter 模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; entity counter is Port(reset : in std_logic;clock : in std_logic;cnt_wr_address : out std_logic_vector(5 downto 0);cout: out std

19、_logic;cout2: out std_logic);end counter;architecture Behavioral of counter issignal inner_reg : std_logic_vector(5 downto 0):=000000;signal inner_cout: std_logic :=0; begincnt_wr_address =inner_reg;cout=inner_cout;process(clock,reset)beginif (reset = 1) theninner_reg = 000000;elsif(clockevent and c

20、lock=1) theninner_reg = inner_reg+000001;if(inner_reg=111111)theninner_cout=NOT inner_cout;end if;if(inner_reg=000010)then cout2=inner_cout;end if;end if;end process;end Behavioral;(b) rom_64_6 模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY rom_64_6 isPORT( rom_din

21、 : IN STD_LOGIC_VECTOR(5 DOWNTO 0);clk: IN STD_LOGIC;rom_dout_wr: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);rom_dout_rd: out std_logic_vector(5 downto 0);END rom_64_6;ARCHITECTURE rtl OF rom_64_6 ISSUBTYPE rom_word IS STD_LOGIC_VECTOR(5 DOWNTO 0);TYPE rom_table IS ARRAY(0 TO 63)OF rom_word;CONSTANt rom:rom_t

22、able:=rom_table(rom_word(000000),rom_word(001000),rom_word(010000),rom_word(011000),rom_word(100000),rom_word(101000),rom_word(110000),rom_word(111000),rom_word(000001),rom_word(001001),rom_word(010001),rom_word(011001),rom_word(100001),rom_word(101001),rom_word(110001),rom_word(111001),rom_word(000

23、010),rom_word(001010),rom_word(010010),rom_word(011010),rom_word(100010),rom_word(101010),rom_word(110010),rom_word(111010),rom_word(000011),rom_word(001011),rom_word(010011),rom_word(011011),rom_word(100011),rom_word(101011),rom_word(110011),rom_word(111011),rom_word(000100),rom_word(001100),rom_wo

24、rd(010100),rom_word(011100),rom_word(100100),rom_word(101100),rom_word(110100),rom_word(111100),rom_word(000101),rom_word(001101),rom_word(010101),rom_word(011101),rom_word(100101),rom_word(101101),rom_word(110101),rom_word(111101),rom_word(000110),rom_word(001110),rom_word(010110),rom_word(011110),

25、rom_word(100110),rom_word(101110),rom_word(110110),rom_word(111110),rom_word(000111),rom_word(001111),rom_word(010111),rom_word(011111),rom_word(100111),rom_word(101111),rom_word(110111),rom_word(111111);BEGINPROCESS(clk)BEGINIF clkEVENT AND clk=1 THEN rom_dout_rd=rom(conv_integer(rom_din); rom_dout

26、_wrclk,reset=clr,cnt_wr_address=romin_address,cout=sel,cout2=sel2 );rom:ROM_64_6PORT MAP(clk=clk,rom_din=romin_address,rom_dout_rd=rd_address, rom_dout_wr=wr_address);ram1:RAM64_8PORT MAP(clock=clk,q=dout_tmp1,data=din,wren=wren_ctl,rdaddress=rd_address, wraddress=wr_address);ram2:RAM64_8PORT MAP(cl

27、ock=clk,q=dout_tmp2,data=din,wren=wren_ctl_2,rdaddress=rd_address, wraddress=wr_address);wren_ctl_2=not wren_ctl;PROCESS(clk)BEGINIF clkevent and clk=1 THENIF sel=1 THENwren_ctl=1; rami writeELSEwren_ctl=0;ram2 writeEND IF;if sel2=1 thendout=dout_tmp2; rami readelsedoutclk,clr=clr,din=din,dout=dout)

28、;Clk_process :processbeginclk = 0;wait for Clk_period/2;clk = 1;wait for Clk_period/2;end process;writing: process(clk)variable line_out : line;variable line_in : line;variable input_tmp : integer;beginif(clkevent and clk=1)thenreadline(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 if;end process;end behave;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号