代码下载:https://download.csdn.net/download/xvrixingkong/10968192
一、系统功能描述:
实现如下图所示的直接序列扩频通信系统。
信源——不断发送简单的四一零码,即反复发送“11110”
扰码——用伪随机对数据比特进行扰码,可利用移位寄存器产生扰码序列,扰码序列的生成多项式为 ,移位寄存器的初始状态为“100101010000000”。扰码模块的结构框图如下图所示。
交织——采用简单的块交织,交织深度为64,交织器为8行8列,横向读入,纵向读出,可采用双RAM结构实现(即两个RAM,一个读,一个写,并交替读写),也可只采用一块RAM实现(自己思考方法,可加分)。以交织深度为16的块交织为例,输入数据比特的序号为1-16,写入的顺序为1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16,读出的顺序为1、5、9、13、2、6、10、14、3、7、11、15、4、8、12、16。
直扩——将数据比特与伪随机序列相乘,扩频比为63(即伪码速率为数据率的63倍),扩频序列为1+X+X6和1+X+ X2+ X5+ X6构成的Gold序列
BPSK——比特‘0’对应为符号“01111111”,‘1’对应为“10000000”
解调——BPSK解调,将符号对应为比特
相关——将接收数据与扩频序列相乘,并判决为‘0’或‘1’
解交织——交织的逆操作(实现方法与交织器相同)
解扰——扰码的逆操作(实线方法与扰码器相同)
附加功能:
在BPSK调制和解调之间加入噪声模块,检验直接序列扩频系统的抗干扰能力。
二、功能描述:
1、分频模块——Odiv_freq
功能描述:用于时钟分频,可以实现任意奇数分频。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
num_div | generic | integer | 分频数 |
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
div_clk | OUT | std_logic | 分频输出 |
2、信源模块——Source
功能描述:生成连续的四一零码数据 “11110”。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
dout | OUT | std_logic | 信号输出 |
3、扰码模块——Scrambling
功能描述:用伪随机码对数据比特进行扰码。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
idata | IN | std_logic | 输入信号 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
4、交织模块——Interweave
功能描述:对数据码进行交织,采用简单的块交织,交织深度为64,交织器8行8列,横向读入纵向读出。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
idata | IN | std_logic | 输入信号 |
i_valid | IN | std_logic | 输入有效信号 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
5、Gold码生成模块——Gold_code
功能描述:生成直扩模块和解扩模块需要用到的gold码。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
6、直扩模块——Spread
功能描述:利用Gold码生成模块得到的gold码对数据比特进行扩频。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
idata | IN | std_logic | 输入信号 |
i_gold | IN | std_logic | 输入gold码 |
odata | OUT | std_logic | 输出信号 |
7、BPSK调制模块——Bpsk_modu
功能描述:对直扩模块输出的数据进行BPSK调制。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
idata | IN | std_logic | 输入信号 |
odata | OUT | std_logic_vector | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
8、BPSK解调模块——Bpsk_demodu
功能描述:对接收到的数据进行BPSK解调。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
idata | IN | std_logic_vector | 输入信号 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
9、相关模块——Correlation
功能描述:数据同步后,在一个数据比特内将解调后的数据与gold码相乘并求和,若和大于判决门限判决为‘1’,否则判决为‘0’。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
idata | IN | std_logic | 输入信号 |
i_gold | IN | std_logic | 输入Gold码 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
10、解交织模块——De_Interweave
功能描述:将相关解扩后的数据比特进行解交织得到发射端的原数据序列。实现过程与交织器相同。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
i_valid | IN | std_logic | 输入有效信号 |
idata | IN | std_logic | 输入信号 |
odata | OUT | std_logic | 输出信号 |
o_valid | OUT | std_logic | 输出有效信号 |
11、解扰模块——De_Scrambling
功能描述:将交织后的数据比特进行扰码的逆操作得到信源输出的原信号。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
i_valid | IN | std_logic | 输入有效信号 |
idata | IN | std_logic | 输入信号 |
odata | OUT | std_logic | 输出信号 |
12、信号延迟模块——Delay
功能描述:可以实现将输入信号延迟任意需要的时钟周期。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
num | generic | integer | 延迟的时钟周期数 |
clk | IN | std_logic | 时钟 |
sig | IN | std_logic | 输入待延迟信号 |
del_sig | OUT | std_logic | 延迟后的输出信号 |
13、发射模块——Transmitter
功能描述:将信源、扰码、交织、直扩和BPSK调制等功能模块组合在一起,构成发射机模块。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
odata | OUT | std_logic_vector | 发射的BPSK信号 |
syn_sig | OUT | std_logic | 同步信号 |
14、接收模块——Receiver
功能描述:将BPSK解调、相关、解交织和解扰等功能模块组合在一起,构成接收机模块。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
reset | IN | std_logic | 复位信号 |
en | IN | std_logic | 使能信号 |
syn_sig | IN | std_logic | 同步信号 |
idata | IN | std_logic_vector | 接收的BPSK信号 |
odata | OUT | std_logic | 解调出的信源信号 |
15、测试模块——Transmitter_tb和Receiver_tb
功能描述:Transmitter_tb对发射模块进行测试。Receiver_tb对发射模块和接收模块进行综合测试。
16、噪声模块——Noise
功能描述:利用本原生成多项式 生成一个m序列,将m序列最高为与BPSK输出数据的低位进行异或,相当于给BPSK输出数据一个干扰。
输入输出解释:
端口名称 | 信号模式 | 信号类型 | 信号说明 |
---|---|---|---|
clk | IN | std_logic | 时钟 |
idata | IN | std_logic_vector | BPSK模块输出信号 |
odata | OUT | std_logic_vector | 加干扰后的BPSK信号 |
17、测试模块——Noise_Receiver_tb
功能描述:Noise_Receiver_tb对发射模块、噪声模块和接收模块进行综合测试。
三、仿真结果:
1、分频模块仿真测试:
实验中实现了一个任意奇数分频器,为便于测试分析,设置其为5分频得到的仿真结果如图1所示。
从图1中可以看出,设置的分频数为5。图中红色方框内为分频后的一个周期,可以看出里面有5个原时钟周期。即该模块功能完好。
2、信源模块仿真测试:
信源模块要生成连续的四一零码数据 “11110”,得到的仿真结果如图2所示。
从图2中可以看出,信源模块输出为连续的“11110”,红色方框内为一个周期。即该模块功能完好。
3、扰码模块仿真测试:
扰码模块用伪随机码对信源得到的数据进行扰码,得到的仿真结果如图3所示。
从图3中可以看出,扰码模块的输入idata为连续的“11110”,输出odata被扰码成随机序列。根据扰码结构框图可知,当en为‘1’时,输出是输入与移位寄存器左端异或的结果,在图3红色方框内第1个周期,idata为‘1’,寄存器左端为‘0’,异或的结果在下一个时钟周期赋给odata即‘1’。
4、交织模块仿真测试:
交织模块用块交织器对扰码模块输出的数据进行交织处理,得到的仿真结果如图4.1所示。
该模块在实现过程中进行了三版修改。
第一版Interweave3的设计思路是:使用3个RAM,第一个RAM写数据,写满64个数据后赋给第二个RAM,然后对第二个RAM中的数据进行交织变换,变换后将数据传送给第三个RAM用于读出。
第二版Interweave2的设计思路是:使用2个RAM,第一个RAM按顺序写入数据,写满64个数据后赋给第二个RAM,然后直接改变第二个RAM的数据读出顺序。
第三版Interweave的设计思路是:使用1个RAM,边读边写,每读出一个数据就在该地址重新写入一个数据。每64次读写为一个周期,每过一个周期调换一次读写顺序。
数据读写顺序用下面两句代码描述:
odata <= data_rom( Index_IIndex_a + Index_JIndex_b );
data_rom( Index_IIndex_a + Index_JIndex_b ) <= idata;
其中, Index_I和Index_J是一个双层循环,Index_I是外循环从7到0,Index_J是内循环从7到0。
如第一个周期内,Index_a = 8;Index_b = 1;则下一个周期内 Index_a = 1;Index_b = 8。
如果用交织深度为16,即4行4列来演示读写顺序如图4.2和图4.3表示。
5、Gold码生成模块仿真测试:
Gold码生成模块利用移位寄存器实现,得到的仿真结果如图5所示。
从图5中可以看出,Gold码生成模块的输出是寄存器g1的高位与寄存器g1的高位异或得到,如红色方框内,异或结果延迟一个时钟周期赋给odata。
6、直扩模块仿真测试:
直扩模块将Gold码与交织模块的输出数据进行异或,得到的仿真结果如图6所示。
从图6中可以看出,直扩模块输出odata是输入idata与Gold码异或并延迟一个时钟周期。图6中红色方框内为一个数据比特,对应63个Gold码,满足扩频比63.
7、BPSK调制模块仿真测试:
BPSK调制模块实现对直扩模块输出的数据进行BPSK调制,得到的仿真结果如图7所示。
图7中,BPSK调制结果odata比输出数据idata延迟一个时钟周期,由此可以看出idata为‘1’时,odata输出“10000000”,idata为‘0’时,odata输出“01111111”。
8、BPSK解调模块、解交织模块、解扰模块
BPSK解调模块、解交织模块、解扰模块分别与BPSK调制模块、交织模块和扰码模块功能实现相似,为其逆操作,故这里不再一一给出仿真测试结果。
9、相关模块仿真测试:
相关模块是将BPSK解调模块的输出数据与Gold码做异或并求和,然后进行数据比特判决,得到的仿真结果如图8所示。
因直扩模块中扩频比为63,即一个数据比特与63个Gold码异或,所以在相关模块中,使同步之后,将一个数据比特内的63个数据分别与对应的Gold码异或求和。若原数据比特为1,两次和Gold码异或后仍为1则理论上求和为63;若原数据比特为0,两次和Gold码异或后仍为0,则理论上求和为0;因此设置一个门限值如本次实验设置门限值为30,当求和sum大于30是将数据比特判决为‘1’,否则判决为‘0’,由此也可以得到扩频通信的抗干扰原理,允许传输过程中若一些数据错误,并不会影响数据判决进而影响结果。
10、延迟模块仿真测试:
为了在设计过程中将特定的信号进行延迟和在仿真调试过程中将关注的信号进行延迟和另一个信号比较便于分析,故设计了延迟模块,其可以实现任意时钟周期的延迟,为观察方便这里将延迟周期数设为3,得到的仿真结果如图9所示。
从图9中可以看出,延迟模块的输出del_sig比输入信号sig延迟了3个时钟周期,与设置的延迟周期数num为3相符。
11、发射模块和接收模块联合仿真测试:
利用testbench文件——Receiver_tb对发射模块和接收模块进行联合测试,得到的仿真结果如图10所示。
图10中,temp_data0为信源模块输出、temp_data1为扰码模块输出、temp_data2为交织模块输出、gold_data为Gold码生成模块输出、temp_data3为直扩模块输出、temp_data4为BPSK调制模块输出、temp_data5为BPSK解调模块输出、temp_data6为相关模块输出、temp_data7为解交织模块输出,U1/odata为解扰模块即最终解调结果输出。从图中可以看出左上角红色方框内为“11110”的信源,右下角红色方框内为“11110”的解调数据。可以看出该仿真系统最终完全解调出了信源数据。
12、加入噪声模块后的联合仿真测试:
利用testbench文件——Noise_Receiver_tb对发射模块、噪声模块和接收模块进行联合测试,得到的仿真结果如图11、图12和图13所示。
从图11可以看出,经过噪声模块加干扰后,BPSK模块输出的数据部分发生改变,即idata和odata的数据存在不同。
从图12可以看出,经过噪声模块加干扰后,当数据比特为‘1’时,相关模块的相关结果不再是63,当数据比特为‘0’时,相关模块的相关结果不再是0,是因为噪声干扰后存在误码,但是因为相关模块设置的判决门限为30,因此仍能正确判决,如图12中当U2/sum为44时判决为‘1’即U2/odata输出为‘1’;当U2/sum为16时判决为‘0’即U2/odata输出为‘0’。这在一定程度上验证了扩频通信的抗干扰能力。
从图13中可以看出最终解调输出仍为连续的“11110”。
系统的VHDL代码及报告下载,请点击这里.