可编程逻辑器件控制VHDL 结课作业 结课论文.docx
《可编程逻辑器件控制VHDL 结课作业 结课论文.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件控制VHDL 结课作业 结课论文.docx(11页珍藏版)》请在冰豆网上搜索。
![可编程逻辑器件控制VHDL 结课作业 结课论文.docx](https://file1.bdocx.com/fileroot1/2022-12/7/c47645c6-a30c-4569-b0fc-a17ddbab5a03/c47645c6-a30c-4569-b0fc-a17ddbab5a031.gif)
可编程逻辑器件控制VHDL结课作业结课论文
可编程逻辑电路原理与设计作业
姓名:
蔺子杰
学号:
10021202
专业:
电子信息工程
完成日期:
2012年12月
一.实验报告
1.实验题目
3×8译码器的VHDL设计
2.实验说明
译码器:
把输入的数码解出其对应的数码。
NxM译码器:
N条输入线及M条输出线
设计原理:
先判断使能端口EN状态,当其满足高电平时,判断三个输入端口A2,A1,A0的状态来决定输出。
若使能端口为低电平则固定输出不受逻辑输出A2,A1,A0的影响。
使能有效时按照三个输入状态决定八个输出的状态。
3.实验步骤
1)创建新工程:
打开QuartusII软件,在主界面中执行FILE—>NewprojectWizard在向导的第一页设置工程文件夹,工程名称及顶层实体名称。
点击Next按钮,进入添加设计文件对话框。
点击Next进入选择目标芯片对话框,ACEX1K系列EP1K30QC208-3。
点击Next进入EDA工具设置页面。
在新建工程向导最后,QuartusII给出新建工程摘要信息,点击Finish完成向导。
2)程序输入:
程序代码:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
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";
when"001"=>Y<="00000010";
when"010"=>Y<="00000100";
when"011"=>Y<="00001000";
when"100"=>Y<="00010000";
when"101"=>Y<="00100000";
when"110"=>Y<="01000000";
when"111"=>Y<="10000000";
whenothers=>Y<="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:
outstd_logic;
bpsk_out:
outstd_logic
);
endentity;
architecturebehaveoflynis
componentdff
port(d,clk:
instd_logic;
q:
outstd_logic);
endcomponent;
signala:
std_logic_vector(0to3);
signaltemp0:
std_logic;
signalout0,out1,out2,out3:
std_logic;
signalref_clock:
std_logic;
begin
ref_clock<=mux_clock;
ref_clk<=ref_clock;
data0:
process(mux_clock)--产生时钟信号的八分频
variablecnt:
integerrange0to8;
begin
ifmux_clock'eventandmux_clock='1'then
cnt:
=cnt+1;
ifcnt<=4then
out0<='1';
elsifcnt<8then
out0<='0';
else
cnt:
=0;
endif;
endif;
endprocessdata0;
data1:
process(mux_clock)--时钟信号十六分频电路
variablecnt:
integerrange0to16;
begin
ifmux_clock'eventandmux_clock='1'then
cnt:
=cnt+1;
ifcnt<=8then
out1<='1';
elsifcnt<16then
out1<='0';
else
cnt:
=0;
endif;
endif;
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<='0';--获取全零序列
output:
process(mux_clock)--通过m_sel选择某一输出信号,并对其进行BPSK编码
begin
casem_selis
when"00"=>data_out<=out0;bpsk_out<=out0xorref_clock;
when"01"=>data_out<=out1;bpsk_out<=out1xorref_clock;
when"10"=>data_out<=out2;bpsk_out<=out2xorref_clock;
when"11"=>data_out<=out3;bpsk_out<=out3xorref_clock;
whenothers=>data_out<=out3;bpsk_out<=out3xorref_clock;
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:
INstd_logic;
a:
INstd_logic;
b:
OUTstd_logic);
ENDli;
ARCHITECTUREbehaveOFliIS
SIGNALc:
integerRANGE0TO3;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
IFstart='0'THENc<=0;
ELSIFc=0THENc<=c+1;
IFa='1'THENb<='1';
ELSEb<='0';
ENDIF;
ELSIFc=3THENc<=0;
ELSEc<=c+1;
ENDIF;
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.程序代码解析
libraryieee;
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='1'then--检测时钟上升沿
dount:
=dount+1;--计数器dount累加
endif;
del<=dount;--片选信号
endprocess;--结束进程
process(key)--进程,key变化时启动进程
begin
casekeyis
when"0000"=>ledag<="0111111";--七段数码管显示0
when"0001"=>ledag<="0000110";--1
when"0010"=>ledag<="1011011";--2
when"0011"=>ledag<="1001111";--3
when"0100"=>ledag<="1100110";--4
when"0101"=>ledag<="1101101";--5
when"0110"=>ledag<="1111101";--6
when"0111"=>ledag<="0000111";--7
when"1000"=>ledag<="1111111";--8
when"1001"=>ledag<="1101111";--9
when"1010"=>ledag<="1110111";--R
when"1011"=>ledag<="1111100";--b
when"1100"=>ledag<="0111001";--C
when"1101"=>ledag<="1011110";--d
when"1110"=>ledag<="1111001";--E
when"1111"=>ledag<="1110001";--F
whenothers=>null;
endcase;
endprocess;--结束进程
endwhbkrc;--结束结构体
说明:
程序有三部分构成,其为:
库和包library(设计资源);实体entity(外部端口);结构体architecture(内部结构)
在此程序中:
实体说明主要描述对象的外貌,即对象的输入和输出(I/O)的端口信息,它并不描述器件的具体功能。
结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。
编辑输入端口波形:
仿真后得到的波形: