可编程逻辑器件控制VHDL 结课作业 结课论文文档格式.docx
《可编程逻辑器件控制VHDL 结课作业 结课论文文档格式.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件控制VHDL 结课作业 结课论文文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydemois
Port(A:
inSTD_LOGIC_VECTOR(2downto0);
EN:
inSTD_LOGIC;
Y:
outSTD_LOGIC_VECTOR(7downto0));
enddemo;
architectureDECofdemois
signalindata:
STD_LOGIC_VECTOR(2downto0);
begin
process(A,EN)
begin
indata(0)<
=A(0);
indata
(1)<
=A
(1);
indata
(2)<
=A
(2);
if(EN='
1'
)then
caseindatais
when"
000"
=>
Y<
="
00000001"
;
001"
00000010"
010"
00000100"
011"
00001000"
100"
00010000"
101"
00100000"
110"
01000000"
111"
10000000"
whenothers=>
11111111"
endcase;
endif;
endprocess;
endDEC;
3)编译:
启动编译:
执行菜单processing->
startcompilation。
在编译结束后,会出现以下编译报告:
4)仿真:
执行File->
NEW,选中OtherFiles中vectorwaveformfile,点击OK新建空白文件,名位waveform.vwf,执行file->
saveas保存。
默认仿真时间1us.
在波形编辑器左边Name列空白处双击,打开添加仿真信号对话框。
点击Nodefinder打开对话框,从filter列表中pins:
all,然后点击list,添加节点。
通过波形编辑器左侧的信号设置工具栏,编辑输入波形。
当需要设定某段波形时,将其用鼠标拖黑,然后用工具栏中的按钮赋值。
信号波形编辑完成后存盘。
执行processing-startsimulation.从波形图判断输入、输出状态是否符合设计要求。
输出状态如下图所示,符合要求。
在仿真后,会输出符合状态的波形:
5)对器件进行处理:
执行assignments-assignmenteditor,打开管脚分配图,选择左边上角pin进行管脚分配。
管脚分配图,如图所示:
在这部分实验中,除了管脚分配之外,还包括对器件进行编程:
将ByteBlaster电缆一端与PC机并口延长线相连,另一端与试验箱JTAG下载口相连,并打开试验箱电源。
执行Tools->
programmer,打开编程器窗口。
点击Hardwaresetup,在其下拉列表中选择ByteBlasterMVorByteBlasterII。
在编程窗口中,勾选program/configure,然后点击start,再进行一次编译,最后进行程序下载。
3.实验结果
通过实验台上的开关控制点亮希望点亮的灯,即3-8译码器的硬件模拟功能。
2.BPSK的调制、解调的VHDL设计
1.BPSK原理:
BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。
由于最单纯的键控移相方式虽抗噪音较强但传送效率差,所以常常使用利用4个相位的QPSK和利用8个相位的8PSK。
在大多数情况下,数字调制是利用数字信号的离散值去键控载波。
对载波的幅度、频率或相位进行键控,便可获得ASK、FSK、PSK等。
这三种数字调制方式在抗干扰噪声能力和信号频谱利用率等方面,以相干PSK的性能最好,目前已在中、高速传输数据时得到广泛应用。
2.BPSK调制解调原理:
调相信号是通过载波的相位变化来传输消息的,它具有恒定的包络,而且频率上也无法分离,所以不能采用包络解调,只能采用相干解调。
原理图如下:
3.BPSK调制:
程序代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitylynis
port(mux_clock:
instd_logic;
m_sel:
instd_logic_vector(1downto0);
ref_clk:
outstd_logic;
data_out:
bpsk_out:
outstd_logic
);
endentity;
architecturebehaveoflynis
componentdff
port(d,clk:
q:
outstd_logic);
endcomponent;
signala:
std_logic_vector(0to3);
signaltemp0:
std_logic;
signalout0,out1,out2,out3:
signalref_clock:
begin
ref_clock<
=mux_clock;
ref_clk<
=ref_clock;
data0:
process(mux_clock)--产生时钟信号的八分频
variablecnt:
integerrange0to8;
ifmux_clock'
eventandmux_clock='
then
cnt:
=cnt+1;
ifcnt<
=4then
out0<
='
elsifcnt<
8then
out0<
0'
else
cnt:
=0;
endif;
endprocessdata0;
data1:
process(mux_clock)--时钟信号十六分频电路
integerrange0to16;
=8then
out1<
16then
endprocessdata1;
a(0)<
=temp0;
--反馈系数为23的七位伪码序列
u13_1:
dffportmap(a(0),mux_clock,a
(1));
u13_2:
dffportmap(a
(1),mux_clock,a
(2));
u13_3:
dffportmap(a
(2),mux_clock,a(3));
temp0<
=not(a
(2)xora(3));
out2<
=nota(3);
out3<
--获取全零序列
output:
process(mux_clock)--通过m_sel选择某一输出信号,并对其进行BPSK编码
casem_selis
when"
00"
data_out<
=out0;
bpsk_out<
=out0xorref_clock;
01"
=out1;
=out1xorref_clock;
10"
=out2;
=out2xorref_clock;
11"
=out3;
=out3xorref_clock;
whenothers=>
endcase;
endprocessoutput;
endbehave;
仿真后的波形如图所示:
4.BPSK解调
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_arith.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;
ENTITYliIS
PORT(clk:
INstd_logic;
start:
a:
b:
OUTstd_logic);
ENDli;
ARCHITECTUREbehaveOFliIS
SIGNALc:
integerRANGE0TO3;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'
eventANDclk='
)THEN
IFstart='
THENc<
ELSIFc=0THENc<
=c+1;
IFa='
THENb<
ELSEb<
ENDIF;
ELSIFc=3THENc<
ELSEc<
ENDIF;
ENDPROCESS;
ENDbehave;
仿真后的波形为:
由上图可知:
当输入的已调波信号a相位为0时,输出的基带信号b为高电平。
当输入的相位为π时,输出的基带信号b为低电平。
说明解调成功。
三.八位七段数码管动态显示的VHDL设计
1.七段显示器显示原理
七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的(每一个二极管依位置不同而赋予不同的名称,请参见图4.1)。
我们可以简单的说,要产生数字,便是点亮特定数据的发光二极管。
例如要产生数字「0」,须只点亮A、B、C、D、E、F等节段的发光二极管;
要产生数字「5」,则须点亮A、C、D、F、G等节段发光二极管,以此类推,参见图4.6。
因此,以共阳极七段显示器而言,要产生数字「0」,必须控制CycloneIIFPGA芯片接连至A、B、C、D、E、F等接脚呈现“低电位”,使电路形成通路状态。
表4.1则为共阳极七段显示器显示之数字编码。
本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。
2.程序代码解析
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexp4is--exp4为实体名
port(clk:
instd_logic;
--定义动态扫描时钟信号
key:
instd_logic_vector(3downto0);
--定义四位输入信号
ledag:
outstd_logic_vector(6downto0);
--定义七位输出信号
del:
outstd_logic_vector(2downto0)--定义八位数码管位置显示信号
endexp4;
--结束实体
architecturewhbkrcofexp4is--whbkrc为结构体名
begin--以begin为标志开始结构体的描述
process(clk)--进程,clk变化时启动进程
variabledount:
std_logic_vector(2downto0);
--变量,计数
begin
ifclk'
eventandclk='
then--检测时钟上升沿
dount:
=dount+1;
--计数器dount累加
endif;
del<
=dount;
--片选信号
endprocess;
--结束进程
process(key)--进程,key变化时启动进程
casekeyis
when"
0000"
ledag<
0111111"
--七段数码管显示0
0001"
0000110"
--1
0010"
1011011"
--2
0011"
1001111"
--3
0100"
1100110"
--4
0101"
1101101"
--5
0110"
1111101"
--6
0111"
0000111"
--7
1000"
1111111"
--8
1001"
1101111"
--9
1010"
1110111"
--R
1011"
1111100"
--b
1100"
0111001"
--C
1101"
1011110"
--d
1110"
1111001"
--E
1111"
1110001"
--F
whenothers=>
null;
endcase;
--结束进程
endwhbkrc;
--结束结构体
说明:
程序有三部分构成,其为:
库和包library(设计资源);
实体entity(外部端口);
结构体architecture(内部结构)
在此程序中:
实体说明主要描述对象的外貌,即对象的输入和输出(I/O)的端口信息,它并不描述器件的具体功能。
结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。
编辑输入端口波形:
仿真后得到的波形: