基于FPGA的曼彻斯特编译码设计.docx
《基于FPGA的曼彻斯特编译码设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的曼彻斯特编译码设计.docx(13页珍藏版)》请在冰豆网上搜索。
![基于FPGA的曼彻斯特编译码设计.docx](https://file1.bdocx.com/fileroot1/2022-10/10/47fd8a4a-3e8c-4e10-abdf-3c26aac56e0e/47fd8a4a-3e8c-4e10-abdf-3c26aac56e0e1.gif)
基于FPGA的曼彻斯特编译码设计
合肥学院
课程设计报告
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
题目:
基于FPGA的曼彻斯特编译码设计与实现
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
系别:
电子信息与电气工程系
专业:
通信工程
班级:
10通信工程1班
学号:
070112
姓名:
柯望吕烨邓超
导师:
段慧敏
成绩:
________________________
2013年12月9日
基于FPGA的曼彻斯特编译码设计与实现
中文摘要
随着科学技术的进步,现代战争样式向信息战形式发展。
现代战争胜负对于信息获取的依赖程度前所未有的提高。
在现代战争中,若己方的通讯交流方式早敌军破获,则地方将获取己方部队动向或实施信息干扰。
将会使部队陷入极其危险地境地中。
因此,信息战对通讯加密手段的要求极高。
伪随机序列(Pseudo-noise Sequence)又称伪噪声或伪随机码,具有类似随机信号的一些统计特性,但又是有规律的,容易产生和复制的。
最大长度线性移位寄存器序列(m序列)是保密通信中非常重要的一种伪随机序列,它具有随机性、规律性及较好的自相关和互相关性,而且密钥量很大。
利用m序列加密数字信号,使加密后的信号在携带原始信息的同时具有伪噪声的特点,以达到在信号传输的过程中隐藏信息的目的;在信号接收端,再次利用m序列加以解密,恢复出原始信号。
这样,通过对m序列的应用,将大大的提高通讯的保密程度和防窃取能力。
这样的通讯手段被称为扩展频谱通信
关键词:
伪随机码;曼彻斯特码;曼彻斯特编译码;FPGA
一、前言
曼彻斯特码(Manchestercode),又称裂相码,双向码,是一种自同步的编码方式,即时钟同步信号隐藏在数据波形中,亦即在传输代码信息的同时,也将时钟同步信号一起传输到对方。
另外,曼彻斯特码每位编码中有一跳变,不存在直流分量。
因此该码具有自同步能力和良好的抗干扰性能。
曼彻斯特编码(ManchesterEncoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期和转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输入输出模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。
FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
二、方案论证及选择
由实验要求本次课程设计分四个模块分别为基于FPGA的伪随机序列产生模块;基于FPGA的曼彻斯特编码模块;基于FPGA的曼彻斯特解码模块;基于FPGA的四分频模块。
1.1方案一
方案一:
实现上述四个模块可以用Quartus软件中的原理图编辑功能进行各个模块的设计,然后进行元件封装进行连接实现整体设计。
但是由于Quartus软件所提供的基本元件有限不能满足本实验的实验要求。
故不采用原理图设计本实验。
1.2方案二
方案二:
由VHDL硬件描述语言的强大功能可以运用VHDL语言对各个模块的功能进行功能描述,使得各个模块能够实现各自的子功能。
与原理图编辑类似,将用VHDL语言描述的各个子模块进行元件封装以便用例化语句进行调用。
此方案可以减少原理图设计时的线路连接的繁琐工作,可以方便的进行功能的改变和错误检查。
故本次实验选择VHDL语言进行功能描述完成实验要求。
三、理论分析
1.1伪随机序列模块
伪随机序列模块:
由实验要求需要产生的伪随机序列满足特征方程:
f=1+x^2+x^3+x^4+x^8。
由特征方程的表达式可知线性反馈移位寄存器的抽头位置分别在c0,c5,c9。
并且c5和c9进行异或运算作为输入输入给D8。
根据功能要求用VHDL语言进行描述。
在进行软件设计时可以通过使能端控制对c0--c8进行初始设置,并且在时钟控制下按照程序设置运行程序,并进行波形仿真以验证程序功能的正确性。
m序列实验程序波形见附录一
图1线性反馈移存器的一般组成原理图
1.2曼彻斯特编码模块
曼彻斯特编码模块:
由曼彻斯特解码规则可将程序设置为在输入一个二进制码元时将此输入二进制码元作为标准逻辑矢量的一个元素,再将此码元取反作为标准逻辑矢量的另一个元素。
最后将所得的两个元素进行并置输出为二位的标准逻辑矢量,并将此标准逻辑矢量按位输出即可得到曼彻斯特编码在仿真时可以通过输入码元与对应的仿真输出二位的标准逻辑矢量进行比较确认是否输出正确。
曼彻斯特编码的实验程序见附录二。
1.3曼彻斯特解码模块
曼彻斯特解码模块:
与曼彻斯特编码类似,可以根据曼彻斯特解码的规则可将程序设置为在输入两个码元后,对两个码元所组成的码组进行判别从而输出相应的单个的二进制码元。
在曼彻斯特解码的过程中为保证在输入两个码元后在进行判别需要用到两个不同频率的时钟信号。
控制进行曼彻斯特解码输入的时钟信号时钟频率是进行码组判别的时钟信号时钟频率的4倍。
因此需要对同一个时钟信号进行4分频。
曼彻斯特解码实验程序见附录三。
1.4四分频模块设计
四分频模块设计:
为了减少在一个实验中用到多个外接时钟信号,可以通过将一个时钟信号进行分频获得满足要求的不同频率的时钟信号。
为满足曼彻斯特解码对输入时钟信号的要求,需要对同一时钟信号进行四分频。
四分频实验程序见附录四。
四、系统整体设计
按照以上各个子系统模块以及整体连接可以完成实验基本要求。
编码速率可以通过调节时钟CLK1的频率来改变。
对于实验要求的伪码数据率为10~100kbps,可以调节时钟CLK1的时钟频率在10K~100K之间。
仿真分析:
在Quartus软件中进行整体软件设计程序仿真,通过仿真波形图分析输入数据和输出数据可以验证系统满足实验要求。
图2系统总体设计框图
五、实验相关程序
1.1M序列产生程序
libraryieee;
useieee.std_logic_1164.all;
entityMis
port(clk,led:
instd_logic;
z:
instd_logic_vector(8downto0);
MOT:
outstd_logic_vector(8downto0);
MO:
outstd_logic);
endentity;
architectureM1ofMis
signalreg:
std_logic_vector(8downto0);
signalcy,A,B,C:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')and(clk'last_value='0')then
caseledis
when'1'=>reg(8downto0)<=z(8downto0);
when'0'=>reg(7downto0)<=reg(8downto1);
cy<=reg(0);
A<=reg(5)xorreg(0);
B<=reg(6)xorA;
C<=reg(7)xorB;
reg(8)<=C;
endcase;
endif;
endprocess;
MO<=cy;MOT(8downto0)<=reg(8downto0);
endM1;
1.2曼彻斯特编码程序
libraryieee;
useieee.std_logic_1164.all;
entityMCis
port(clk,MCI:
instd_logic;
MCOV:
outstd_logic_vector(1downto0);
MCO:
outstd_logic);
endentity;
architectureMC1ofMCis
signala,b,d,e:
std_logic;
signalc:
std_logic_vector(1downto0);
begin
u1:
process(clk,MCI)
begin
if(clk'eventandclk='1')and(clk'last_value='0')
then
b<=MCI;
a<=notMCI;
c(1downto0)<=a&b;
e<=c(0);
endif;
endprocess;
MCO<=e;MCOV(1downto0)<=c(1downto0);
endarchitectureMC1;
1.3曼彻斯特解码程序
libraryieee;
useieee.std_logic_1164.all;
entityMCJis
port(clk1,clk2,MCJI:
instd_logic;
MCOJV:
outstd_logic_vector(1downto0);
MCJO:
outstd_logic);
endentityMCJ;
architectureMCJ1ofMCJis
signala,c:
std_logic_vector(1downto0);
signalb:
std_logic;
begin
process(clk1,MCJI)
variableJ:
std_logic_vector(1downto0);
begin
if(clk1'eventandclk1='1')and(clk1'last_value='0')
then
J
(1):
=J(0);
J(0):
=MCJI;
J(1downto0):
=J
(1)&J(0);
endif;
a(1downto0)<=J(1downto0);
endprocess;
c(1downto0)<=a(1downto0);
process(clk2,c(1downto0))
variableh:
std_logic;
begin
if(clk2'eventandclk2='1')and(clk2'last_value='0')
then
casec(1downto0)is
when"10"=>h:
='1';
when"01"=>h:
='0';
whenothers=>h:
=h;
endcase;
b<=h;
endif;