Quartus实验报告和PN9交织器.docx
- 文档编号:27192493
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:25
- 大小:220.88KB
Quartus实验报告和PN9交织器.docx
《Quartus实验报告和PN9交织器.docx》由会员分享,可在线阅读,更多相关《Quartus实验报告和PN9交织器.docx(25页珍藏版)》请在冰豆网上搜索。
Quartus实验报告和PN9交织器
课程名称通信系统集成电路设计
实验名称QuartusII实验二
专业班级
姓名
学号
日期______2012.12.16__________
实验二:
PN9序列,交织器
1.实验目的
a)了解伪随机序列的应用和产生原理、方法;
b)掌握在FPGA上利用线性反馈移位寄存器实现伪随机码发生器的方法。
c)通过波形仿真验证此实现方法的正确性和伪随机序列的周期性。
2.实验环境
a)QuartusII9.1(32-Bit)
b)ModelSim-Altera6.5a(QuartusII9.1)
c)WinXP操作系统
3.实验要求
1)PN9序列
编写生成PN9的程序,用测试向量将结果写到txt文件中,用Matlab统计周期内的0和1数目。
2)分组交织器
8*8从文本中读出数据(0~255:
用8bits表示)交织后写到另一个文本,交织采用分组RAM实现,分组RAM调用IP核实现(先写一个文本,然后按列写入,按行输出)。
3)汉明码(选做)
将PN94个4个地输入到汉明码编码器中,得到(7,4)汉明码,然后按1%的比例加错。
然后进行译码,观察汉明码的纠错能力。
此部分一共包含3个模块:
编码,译码和测试模块。
4.实验内容
1)PN9
伪随机码发生器在扩频通信、信息加密和系统测试等领域中有着广泛的应用。
伪随机序列的伪随机性表现在预先的可确定性、可重复产生与处理。
伪随机序列虽然不是真正的随机序列,但是当伪随机序列周期足够长时,它便具有随机序列的良好统计特性。
本报告给出了利用VHDL语言实现伪随机码发生器的设计,在FPGA内利用线性反馈移位寄存器结构实现伪随机码的产生,该方法结构简单,易于实现,所产生的伪随机序列具有周期长和随机特性好的特点。
如图所示的一个n级线性移位寄存器可以用n次多项式来表征,称以此式为特征多项式的n级线性反馈移位寄存器所产生的序列,其周期p≤2^n-1。
特征式:
n级线性反馈移位寄存器(LSFR)的输出是一个周期序列。
当初始状态是0状态时,LSFR的输出都是0序列。
同一个LSFR的输出序列还和起始状态有关。
本实验的特征多项式为:
f(X)=X^9+X^5+1
故原理图应包含9个移位寄存器,a8a7…a0为寄存器的初值,程序中令初值为100,000,000。
原理图
2)分组交织器
信道编码中采用交织技术,可打乱码字比特之间的相关性,将信道中传输过程中的成群突发错误转换为随机错误,从而提高整个通信系统的可靠性。
交织编码根据交织方式的不同,可分为分组交织、卷积交织等。
其中分组交织编码是一种比较常见的形式。
交织编码引入的延时应尽可能小。
为了同时满足块内交织进行8*8矩阵转置变换和延时尽可能小的要求,该交织器利用2片双口RAM实现,记作RAM_A和RAM_B。
交织处理时,按地址从0~64将64bits输入数据全部写入RAM_A,待64bits数据全部送入RAM_A后,控制信号使RAM_A由写状态转换到读状态,同时,将输入的待交织数据写入RAM_B,RAM_B为写状态,交织器由RAM_A输出数据。
经过64个时钟周期后,从RAM_A读出64bits数据的同时,RAM_B写入64bits数据。
此时,改变RAM_A和RAM_B的读写状态,RAM_A开始写,从RAM_B中读取数据。
如此反复完成数据的实时连续交织处理。
完成交织处理的核心问题是处理好读/写地址之间的关系。
为减少FPGA运算量,可利用Matlab,C语言等实现读/写地址矩阵转置运算。
这里采用Matlab完成读/写地址矩阵转置运算,读/写地址的变换结果存储在rom_64_6.vhd文件的rom_table中。
5.实验步骤及结果
(一)PN9
1)建立名为pn9的新工程,编写产生PN9序列的PN9.vdl和PN9测试向量文件tb_pn9.vhd,并添加到工程中;
2)用Modelsim仿真结果。
编译通过后仿真,结果如下:
图仿真波形图
由图初步看出,最后需要输出的Sout信号没有明显规律。
这就是我们想要的伪随机序列。
3)生成的文本文件
打开后(前面有连续多个的‘0’是由于复位信号在10个时钟周期后才置‘1’):
4)将仿真结果dataout.txt文件中的数据导入matlab。
由于PN9序列是周期为511的伪随机序列,故采用一个二维矩阵x_511来处理数据:
二维矩阵大小设置为511*100,按列顺序读入dataout.txt中的数据,即每一列为一个PN9序列,一共100个PN9序列。
对每列的PN9序列做如下处理:
1.求自相关函数,画出自相关函数,检查是否符合m序列的自相关特性。
2.统计1的个数和0的个数,看是不是满足m序列1比0多一位的特性。
具体代码如下图所示:
Matlab处理PN9数据的代码
其处理结果为:
每列PN9的1的个数均为num1=256,0的个数均为num0=255,其自相关函数如下图:
PN9序列的自相关函数
经过Matlab处理分析数据可知,设计的PN9产生器符合要求。
(二)分组交织器
1)fzfinal工程由四个模块构成。
他们分别是:
计数器模块counter、两个RAM64_8构成的RAM模块、存储读取地址的rom_64_6模块以及顶层的控制模块jiaozhi模块。
其中RAM64_8模块按要求采用了IP核,并采用了大小为64*8的双端口RAM。
而工程中还包含测试向量文件tb_jiaozhi.vhd。
编译成功后,仿真得到:
由此可见,交织器输出对输入的延时。
放大图后,在第68个时钟信号,输出了交织后的第一个数0,接着是8,16,…表明第一帧交织正常。
交织存在3个时钟信号的延迟。
在这里,输出为63时,下一个输出是64,表明第一帧的交织完成,第二帧开始交织,帧的连续交织正常。
仿真的输入数据如下:
6.需要注意的地方
(一)、PN9
a)a8a7…a0初始为100,000,000
同一个n级线性反馈移位寄存器的输出序列还和起始状态有关。
这里初始状态不能全为0,否则反馈时异或得到的都是0,最后输出的序列也是零,就不具备伪随机性了。
b)验证此序列的伪随机性
如图,周期6405-1295=5110。
脉冲周期10ns,故511个为一伪随机码周期。
满足伪随机数列周期小于等于2^N-1的条件,即
511<=2^9-1=511
图脉冲周期为10ns
图计算伪随机序列的周期
(二)、交织器
a)、关于写入地址的得到方法
这个地址表可以按照以下方法简便地生成:
高/低地址:
000
001
010
011
100
……
000
A0
A1
A2
A3
A4
……
001
B0
B1
B2
B3
B4
……
010
C0
C1
C2
C3
C4
……
011
D0
D1
D2
D3
D4
……
……
……
……
……
……
……
……
如图,8*8RAM的地址应为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相连,用于交织输出延时控制,使其输出正确数据。
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≤2^n-1。
但是当n足够大时,伪随机序列周期很长,它便具有随机序列的良好统计特性。
利用VHDL语言实现伪随机码发生器的设计,结构简单,易于实现,周期内随机特性好。
用双口RAM设计的交织器,其只通过控制双端口RAM的读写地址的产生而实现交织过程,而且读写地址易于产生,无需串/并转化,使得系统简化,稳定性提高。
8.附程序
1.PN9
(1)模块程序(PN9.vhd)
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitypn9is
Port(Clk:
inSTD_LOGIC;
Rst:
inSTD_LOGIC;
Sout:
outSTD_logic);
endpn9;
architectureBehavioralofpn9is
signalrc:
STD_LOGIC_vector(0to8);--定义9级寄存器
begin
Sout<=rc(0);
process(Clk,Rst)
begin
if(Rst='1')then
rc<="000000001";
elsif(rising_edge(Clk))then
rc(0to7)<=rc(1to8);--寄存器移位
rc(8)<=rc(5)xorrc(0);--线性反馈
endif;
endprocess;
endBehavioral;
(2).测试向量(tb_pn9.vhd)
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.all;
USEieee.numeric_std.ALL;
usestd.textio.all;
ENTITYtb_pn9IS
ENDtb_pn9;
ARCHITECTUREbehaviorOFtb_pn9IS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTpn9
PORT(
Clk:
inSTD_LOGIC;
Rst:
inSTD_LOGIC;
Sout:
outSTD_LOGIC);
ENDCOMPONENT;
--Inputs
signalClk:
std_logic:
='0';
signalRst:
std_logic:
='0';
--Outputs
signalSout:
STD_LOGIC:
='0';
--Clockperioddefinitions
constantClk_period:
time:
=10ns;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
pn9PORTMAP(
Clk=>Clk,
Rst=>Rst,
Sout=>Sout
);
--Clockprocessdefinitions
Clk_process:
process
begin
Clk<='0';
waitforClk_period/2;
Clk<='1';
waitforClk_period/2;
endprocess;
--Stimulusprocess
stim_proc:
process
begin
--holdresetstatefor100ms.
Rst<='1';
waitforClk_period*10;
--insertstimulushere
Rst<='0';
wait;
endprocess;
writing:
process(Clk,Rst)
filefile_out:
TEXTisout"dataout.txt";
variableline_out:
LINE;
begin
if(Clk'eventandClk='1')then
if(Sout='1')then
write(line_out,1);
else
write(line_out,0);
endif;
writeline(file_out,line_out);
endif;
endprocess;
END;
2.8*8交织器
(1)交织器源文件
(a)counter模块
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycounteris
Port(
reset:
instd_logic;
clock:
instd_logic;
cnt_wr_address:
outstd_logic_vector(5downto0);
cout:
outstd_logic;
cout2:
outstd_logic
);
endcounter;
architectureBehavioralofcounteris
signalinner_reg:
std_logic_vector(5downto0):
="000000";
signalinner_cout:
std_logic:
='0';
begin
cnt_wr_address<=inner_reg;
cout<=inner_cout;
process(clock,reset)
begin
if(reset='1')then
inner_reg<="000000";
elsif(clock'eventandclock='1')then
inner_reg<=inner_reg+"000001";
if(inner_reg="111111")then
inner_cout<=NOTinner_cout;
endif;
if(inner_reg="000010")then
cout2<=inner_cout;
endif;
endif;
endprocess;
endBehavioral;
(b)rom_64_6模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYrom_64_6is
PORT(rom_din:
INSTD_LOGIC_VECTOR(5DOWNTO0);
clk:
INSTD_LOGIC;
rom_dout_wr:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
rom_dout_rd:
outstd_logic_vector(5downto0));
ENDrom_64_6;
ARCHITECTURErtlOFrom_64_6IS
SUBTYPErom_wordISSTD_LOGIC_VECTOR(5DOWNTO0);
TYPErom_tableISARRAY(0TO63)OFrom_word;
CONSTANtrom:
rom_table:
=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'("000010"),
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_word'("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"),
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")
);
BEGIN
PROCESS(clk)
BEGIN
IFclk'EVENTANDclk='1'THEN
rom_dout_rd<=rom(conv_integer(rom_din));
rom_dout_wr<=rom_din;
ENDIF;
ENDPROCESS;
ENDrtl;
(c)RAM64_8采用IP核
(d)顶层模块jiaozhi模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYjiaozhiIS
PORT(clk:
INSTD_LOGIC;
clr:
instd_logic;
din:
INSTD_LOGIC_VECTOR(7DOWNTO0);
dout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDjiaozhi;
ARCHITECTUREbehaveOFjiaozhiIS
COMPONENTcounter
Port(
reset:
instd_logic;
clock:
instd_logic;
cnt_wr_address:
outstd_logic_vector(5downto0);
cout:
outstd_logic;
cout2:
outstd_logic
);
ENDCOMPONENT;
COMPONENTROM_64_6
PORT(rom_din:
INSTD_LOGIC_VECTOR(5DOWNTO0);
clk:
INSTD_LOGIC;
rom_dout_wr:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
rom_dout_rd:
outstd_logic_vector(5downto0));
ENDCOMPONENT;
COMPONENTRAM64_8
PORT
(
clock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(7DOWNTO0);
rdaddress:
INSTD_LOGIC_VECTOR(5DOWNTO0);
wraddress:
INSTD_LOGIC_VECTOR(5DOWNTO0);
wren:
INSTD_LOGIC:
='1';
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
SIGNALwr_address:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALrd_add
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Quartus 实验 报告 PN9 交织