巴克码检测器课程设计.docx
《巴克码检测器课程设计.docx》由会员分享,可在线阅读,更多相关《巴克码检测器课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
巴克码检测器课程设计
课程设计任务书
学生姓名:
专业班级:
电子科学与技术0803班
指导教师:
工作单位:
信息工程学院
题目:
巴克码检测器
课题要求:
(1)学会在QuartusⅡ环境中运用VHDL语言设计方法构建具有一定逻辑功能的模块,并能运用图形设计方法完成顶层原理图的设计。
(2)掌握巴克码检测器的主要功能与在CPLD中的实现方法。
课题内容:
(1)设计一个七位巴克码(X1110010)代码检测器,当识别到一组代码时,输出一个高电平脉冲。
(2)运用QuartusⅡ软件中的仿真功能对所设计的巴克码检测器的各个模块及顶层电路的功能进行仿真分析。
时间安排:
学习VHDL语言的概况第1天
学习VHDL语言的基本知识第2、3天
学习VHDL语言的应用环境,调试命令第4、5天
课程设计第6-9天
答辩第10天
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
本课程设计主要是利用QUARTERSⅡ设计一个七位巴克码(X1110010)代码检测器,当识别到一组代码时,输出一个高电平脉冲。
巴克码主要用于通信系统中的帧同步,其特点是具有尖锐的自相关函数,便于与随机的数字信息相区别,易于识别,出现伪同步的可能性小。
巴克码是一种具有特殊规律的二进制码组,它是一种非周期序列。
关键词:
QUARTERSⅡ,巴克码,信号检测器,序列
Abstract
ThiscourseisdesignedusingQUARTERSⅡdesignasevenbuckcode(X1110010)codedetector,whentorecognizeasetofcode,andtheoutputpulseahighlevel.
Buckcodeismainlyusedforcommunicationsystemofframesynchronization,characterizedbyasharpautocorrelation,facilitateandrandomdigitalinformationtodistinguish,easytoidentify,appearthepossibilityofpseudosynchronoussmall.Buckcodeisonekindhasthespeciallawofbinarycodegroup,itisanon-periodicsequence.
Keywords:
QUARTERSⅡ,buckyards,signaltester,sequence
1绪论
在通信系统中,同步技术起着相当重要的作用。
通信系统能否有效地、可靠地工作,很大程度上依赖于有无良好的同步系统。
通信系统中的同步可分为载波同步、位同步、帧同步等几大类。
当采用同步解调或相干检测时,接收端需要提供一个与发射端调制载波同频同相的相干载波,获得此相干载波的过程称为载波提取,或称为载波同步。
而在数字通信中,消息是一串连续的信号码元序列,解调时常须知道每个码元的起止时刻。
因此,就要求接收端必须能产生一个用作定时的脉冲序列,以便与接收的每一个码元的起止时刻一一对齐。
在接收端产生与接收码元的重复频率和相位一致的定时脉冲序列的过程称为码元同步或位同步。
数字通信中的消息数字流总是用若干码元组成一个“字”,又用若干“字”组成一“句”。
因此,在接收这些数字流时,同样也必须知道这些“字”、“句”的起止时刻,在接收端产生与“字”、“句”起止时刻相一致的定时脉冲序列,统称为群同步或帧同步。
当通信是在两点之间进行时,完成了载波同步、位同步和帧同步之后,接收端不仅获得了相干载波,而且通信双方的时标关系也解决了,这时,接收端就能以较低的错误概率恢复出数字信息。
在数字通信系统中,实现帧同步的方法通常有两种:
起止式同步法和集中式插入同步法。
起止式同步比较简单,一般是在数据码元的开始和结束位置加入特定的起始和停止脉冲来表示数据帧的开始和结束。
另外在计算机RS232串口通信中通常也使用类似方法。
而在集中式插入同步法中,要求插入的同步码在接收端进行同步识别时出现伪同步的概率尽可能小,并且要求该码组具有尖锐的自相关函数以便于识别。
同时接收机端的同步码识别器要尽量简单。
目前用得比较广泛的是性能良好的巴克(Barker)码。
2巴克码简介
巴克码主要用于通信系统中的帧同步,其特点是具有尖锐的自相关函数,便于与随机的数字信息相区别,易于识别,出现伪同步的可能性小。
巴克码是一种具有特殊规律的二进制码组,它是一种非周期序列。
一个n位的巴克码组为{,:
,,.,},其中的取值是+1或一1,其局部自相关函数为:
目前已发现的所有巴克码组如表1:
表1已发现的巴克码组
其中,“+”表示取值为高电平1,“一”表示取值为低电平0。
依要求及上面的巴克码组可知,8位的巴克码发生器应在输入时钟信号作用下依次产生“”的码元序列。
3QuartersⅡ设计软件介绍
3.1VHDL发展史及特点
VHDL诞生于1982年。
随后各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
VHDL的英文全写是:
VHSIC(VeryHighSpeedIntegratedCircuit)HardwareDescriptiongLanguage.翻译成中文就是超高速集成电路硬件描述语言。
因此它的应用主要是应用在数字电路的设计中。
目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL语言特点
(1)VHDL语言功能强大、设计灵活。
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。
VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
(2)支持广泛、易于修改。
由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。
在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
(3)强大的系统硬件描述能力。
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。
而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。
另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。
VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
(4)独立于器件的设计、与工艺无关。
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。
当设计描述完成后,可以用多种不同的器件结构来实现其功能。
(5)很强的移植能力。
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
(6)易于共享和复用。
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。
这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
(7)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(8)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(9)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
总之,由于VHDL语言有这么多优点和特点,因此它被广泛的应用在电路系统的设计和器件的设计仿真中。
3.2QuartersⅡ应用
QuartersⅡ是Altera公司推出的新一代开发软件,适合于大规模逻辑电路设计,是Altera公司的第4代可编程逻辑器件集成开发环境,提供了从设计输入到器件编程的全部功能,与Max+plusⅡ相比,QuartersⅡ设计软件增加了网络编辑功能,提升了调试能力,解决了潜在的设计延迟,同时其强大的设计能力和直观易用的接口,受到数字系统设计者的普遍欢迎。
QuartersⅡ开发系统具有以下主要特点:
QuartersⅡ可以产生并识别EDIF网表文件、VHDL网表文件和VerilogHDL网表文件,为第三方EDA工具提供了方便的接口。
QuartersⅡ支持一个工作组环境下的设计要求,包括支持基于Internet的协作设计,与Cadence,ExemplarLogic,MentorGraphics,Synopsys和Synplicity等EDA
供应商的开发工具相兼容。
QuartersⅡ作为一种设计环境,除支持Altera的APEX20KE,APEX20KC,APEXⅡ,ARM的Excalibur嵌入式处理器方案,Mercury,FLEX10KE和ACEX1K之外,还支持MAX3000A和MAX7000系列乘积项器件。
QuartersⅡ增加了一个新的快速适配编译选项,可缩短50%的编译时间。
快速适配功能保留了最佳性能的设置,加快了编译过程,编译速度更快,对设计性能的影响最小[3]境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
QuartersⅡ设计软件界面如图3.1所示。
图3.1QuartersⅡ设计软件界面
4方案选择及论证
方案一:
在状态连续变化的数字系统设计中,采用状态机的设计思想有利于提高设计效率,增加程序的可读性,减少错误的发生几率。
同时,状态机的设计方法也是数字系统中一种常用的设计方法,其输出仅仅是当前状态值的函数,并且在时钟上升沿到来时才发生变化。
米立机的输出则是当前状态值、当前输出值和当前输入值的函数。
本实验要从一串二进制码中检测出一个已预置的7位二进制码,每增加一位二进制相当于增加一个状态,用7个状态可以实现。
方案二:
利用移位寄存器实现序列检测:
上面检测的原理是:
逐位检测,的那个检测到信号时则转入下一个状态。
这种检测的原理清晰,但缺点是当检测到序列比较长时就非常麻烦,而且检测的灵活性差。
利用移位寄存器能实现简便快速,可移植的序列检测器。
通过比较可以看出方案一比较容易实现,因此本次课程设计我选择的是方案一。
5设计原理
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
在本次设计中首先要设计一个巴克码发生器,然后再设计巴克码检测器。
5.1巴克码发生器
发生器原理:
N位触发器构成的计数器可产生M个代码。
原理图:
图5.1巴克码发生器原理图
当计数脉冲不断进入由Q3Q2Q1组成的三位二进制异步计数器时,3-8译码器的8个输出经反相器后顺序输出高电平。
其中五路信号经“或非”后再和其中3路“或”,在Y端便可顺序产生11000100代码序列。
代码序列发生:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitybak1is
port(clk,reset:
instd_logic;
dout:
outstd_logic);
endbak1;
architectureaofbak1is
signalcount:
std_logic_vector(2downto0);
signaltmp1:
std_logic;
begin
dout<=tmp1;
process(clk,reset)
begin
ifreset='0'then
count<=(others=>'0');
elsifrising_edge(clk)then
count<=count+1;
casecountis
when"000"=>tmp1<='1';
when"001"=>tmp1<='1';
when"010"=>tmp1<='1';
when"011"=>tmp1<='0';
when"100"=>tmp1<='0';
when"101"=>tmp1<='1';
when"110"=>tmp1<='0';
when"111"=>tmp1<='1';
whenothers=>tmp1<='0';
endcase;
endif;
endprocess;
enda;
5.2巴克码检测器
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
图5.2巴克码检测器状态图
用状态机设计的巴克码检测器总设计程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitycreateis
port(CLR:
instd_logic;
CLK_1S:
instd_logic;
SIG_OUT:
outstd_logic;
CODE:
instd_logic_vector(6downto0)
);
endentity;
architecturebehaveofcreateis
typestatesis(st0,st1,st2,st3,st4,st5,st6,st7);
signalcurrent_state:
states;
begin
process(CLK_1S,CLR,CODE)
begin
ifCLR='0'then
current_state<=st0;
SIG_OUT<='0';
elsifrising_edge(CLK_1S)then
casecurrent_stateis
whenst0=>SIG_OUT<=CODE(0);
current_state<=st1;
whenst1=>SIG_OUT<=CODE
(1);
current_state<=st2;
whenst2=>SIG_OUT<=CODE
(2);
current_state<=st3;
whenst3=>SIG_OUT<=CODE(3);
current_state<=st4;
whenst4=>SIG_OUT<=CODE(4);
current_state<=st5;
whenst5=>SIG_OUT<=CODE(5);
current_state<=st6;
whenst6=>SIG_OUT<=CODE(6);
current_state<=st7;
whenst7=>SIG_OUT<='0';
current_state<=st0;
whenothers=>current_state<=st0;
endcase;
endif;
endprocess;
endbehave;
本次课程设计所用的频率是由实验箱pin16提供20M的频率,但我们实际中不会用到那么高的频率,因此我们需要一个分频器将此20M的频率分频到我们所需的频率,分频器原程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitydivis
port(CLK_IN:
instd_logic;
CLK_OUT:
bufferstd_logic;
DIV_TIME:
instd_logic_vector(15downto0)
);
endentity;
architecturebehaveofdivis
signaldata1:
integerrange0to10000000;
signaldata2:
integerrange0to10000000;
begin
process(CLK_IN,DIV_TIME)
begin
ifrising_edge(CLK_IN)then
ifdata1=DIV_TIMEthen
data1<=0;
ifdata2=1000then
data2<=0;
CLK_OUT<=notCLK_OUT;
else
data2<=data2+1;
endif;
else
data1<=data1+1;
endif;
endif;
endprocess;
endbehave;
6编译与仿真
6.1程序编译
按要求安装好QuartersⅡ,打开已安装好的软件并新建一个工程
图6.1新建工程
完成后选择芯片,由于本次设计要求用到EP1C3T144C8芯片,因此如图5.2中选择该芯片。
图6.2选择芯片
由于本次设计要用到多种模块,应此要考虑元件例化或画连接图,为了编程简单我们选择画连接图,如图所示在新建文档里选择“BlockDiagram/SchematicFile”进入画图界面,如图6.3所示:
图6.3画图界面
课程设计总程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitydesignis
port(
CLK:
instd_logic;
KEY_CLR:
instd_logic;
KEY_IN:
instd_logic_vector(6downto0);
BELL:
outstd_logic;
LED:
outstd_logic;
LED_7:
outstd_logic_vector(6downto0)
);
endentity;
architecturebehaveofdesignis
componentdivis
port(CLK_IN:
instd_logic;
CLK_OUT:
bufferstd_logic;
DIV_TIME:
instd_logic_vector(15downto0)
);
endcomponent;
componentcreateis
port(CLR:
instd_logic;
CLK_1S:
instd_logic;
SIG_OUT:
outstd_logic;
CODE:
instd_logic_vector(6downto0)
);
endcomponent;
typestatesis(st0,st1,st2,st3,st4,st5,st6,st7);
signalcurrent_state:
states;
signalclk_1s:
std_logic;
signalclk_1k:
std_logic;
signalcode_in:
std_logic;
signalBELL1:
std_logic;
begin
process(clk_1s,KEY_CLR)
begin
ifKEY_CLR='0'then
current_state<=st0;
LED<='0';
LED_7<=(others=>'0');
BELL1<='0';
else
LED<=clk_1s;
ifrising_edge(clk_1s)then
casecurrent_stateis
whenst0=>ifcode_in='1'then
current_state<=st1;
else
current_state<=st0;
endif;
LED_7(0)<=code_in;
BELL1<='0';
whenst1=>ifcode_in='1'then
current_state<=st2;
else
current_state<=st0;
endif;
LED_7
(1)<=code_in;
whenst2=>ifcode_in='1'then
current_state<=st3;
else
curre