VHDL实验1源程序Word文档下载推荐.docx
《VHDL实验1源程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VHDL实验1源程序Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
![VHDL实验1源程序Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/1f20dc5d-bb90-4389-bc29-6831a6c04aca/1f20dc5d-bb90-4389-bc29-6831a6c04aca1.gif)
--半加器描述
(2):
真值表描述方法
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYh_adderIS
PORT(a,b:
INSTD_LOGIC;
co,so:
OUTSTD_LOGIC);
ENDENTITYh_adder;
ARCHITECTUREfh1OFh_adderis
SIGNALabc:
STD_LOGIC_VECTOR(1DOWNTO0);
--定义标准逻辑位矢量数据类型
BEGIN
abc<
=a&
b;
--a相并b,即a与b并置操作
PROCESS(abc)
CASEabcIS--类似于真值表的CASE语句
WHEN"
00"
=>
so<
='
;
co<
;
01"
10"
11"
WHENOTHERS=>
NULL;
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREfh1;
实验4——全加器VHDL描述
--半加器描述
(1):
布尔方程描述方法
PORT(a,b:
BEGIN
so<
=NOT(aXOR(NOTb));
co<
=aANDb;
ENDARCHITECTUREfh1;
--或门逻辑描述
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor2aIS
INSTD_LOGIC;
c:
ENDENTITYor2a;
ARCHITECTUREoneOFor2aIS
c<
=aORb;
ENDARCHITECTUREone;
LIBRARYIEEE;
--1位二进制全加器顶层设计描述
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYf_adderIS
PORT(ain,bin,cin:
cout,sum:
ENDENTITYf_adder;
ARCHITECTUREfd1OFf_adderIS
COMPONENTh_adder--调用半加器声明语句
PORT(a,b:
co,so:
ENDCOMPONENT;
COMPONENTor2a
ENDCOMPONENT;
SIGNALd,e,f:
STD_LOGIC;
--定义3个信号作为内部的连接线。
U1:
h_adderPORTMAP(a=>
ain,b=>
bin,co=>
d,so=>
e);
--例化语句
U2:
e,b=>
cin,co=>
f,so=>
sum);
U3:
or2aPORTMAP(a=>
d,b=>
f,c=>
cout);
ENDARCHITECTUREfd1;
实验5——递减函数发生器VHDL程序
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdcrsIS
PORT(clk,reset:
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDdcrs;
ARCHITECTUREbhvOFdcrsIS
PROCESS(clk,reset)
VARIABLEtmp:
STD_LOGIC_VECTOR(7DOWNTO0);
IFreset='
THEN
tmp:
="
11111111"
ELSIFclk'
EVENTANDclk='
IFtmp="
00000000"
ELSE
=tmp-1;
ENDIF;
q<
=tmp;
ENDPROCESS;
ENDbhv;
实验6—四选一多路数据选择器VHDL
entityselection41is
port(a,b,c,d:
inSTD_LOGIC_vector(1downto0);
s:
inSTD_LOGIC_VECTOR(1downto0);
y:
outSTD_LOGIC_vector(1downto0));
endentityselection41;
architecturearcofselection41is
begin
process(a,b,c,d)
ifs="
then
y<
=a;
elsifs="
y<
=b;
=c;
else
=d;
endif;
endprocess;
endarchitecturearc;
(参考)实验7---分频器VHDL程序(可通过修改分频数来任意输出方波)
--分频器
--**************库定义、包定义********************
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
--**************实体定义********************
Entitydivis
generic(duty:
integer:
=5);
--类属参数说明语句
--端口说明
port(clk:
instd_logic;
--时钟输入
q:
outstd_logic--分频输出
);
enddiv;
--**************构造体定义********************
Architecturediv20ofdivis
constantperiod:
integer:
=20;
--常数定义,分频数20,可以自行修改
signalcount:
integerrange0toperiod-1;
--信号定义,计数作用
begin
process(clk)--进程,由clk这个信号启动
ifrising_edge(clk)then--上升沿驱动,还有另一种写法,见其他例程
ifcount<
dutythen
q<
count<
=count+1;
elsifcount<
period-1then
else
=0;
endif;
endif;
enddiv20;
(参考)实验8——正弦波发生器VHDL程序(简易函数发生器设计2)
ENTITYsinIS
OUTINTEGERRANGE0TO255);
ENDsin;
ARCHITECTUREbhvOFsinIS
INTEGERRANGE0TO63;
IFtmp=63THEN
=tmp+1;
CASEtmpIS
WHEN00=>
=255;
WHEN01=>
=254;
WHEN02=>
=252;
WHEN03=>
=249;
WHEN04=>
=245;
WHEN05=>
=239;
WHEN06=>
=233;
WHEN07=>
=225;
WHEN08=>
=217;
WHEN09=>
=207;
WHEN10=>
=197;
WHEN11=>
=186;
WHEN12=>
=174;
WHEN13=>
=162;
WHEN14=>
=150;
WHEN15=>
=137;
WHEN16=>
=124;
WHEN17=>
=112;
WHEN18=>
=99;
WHEN19=>
=87;
WHEN20=>
=75;
WHEN21=>
=64;
WHEN22=>
=53;
WHEN23=>
=43;
WHEN24=>
=34;
WHEN25=>
=26;
WHEN26=>
=19;
WHEN27=>
=13;
WHEN28=>
=8;
WHEN29=>
=4;
WHEN30=>
=1;
WHEN31=>
WHEN32=>
WHEN33=>
WHEN34=>
WHEN35=>
WHEN36=>
WHEN37=>
WHEN38=>
WHEN39=>
WHEN40=>
WHEN41=>
WHEN42=>
WHEN43=>
WHEN44=>
WHEN45=>
WHEN46=>
WHEN47=>
WHEN48=>
WHEN49=>
WHEN50=>
WHEN51=>
WHEN52=>
WHEN53=>
WHEN54=>
WHEN55=>
WHEN56=>
WHEN57=>
WHEN58=>
WHEN59=>
WHEN60=>
WHEN61=>
WHEN62=>
WHEN63=>
WHENOTHERS=>
NULL;
ENDCASE;
以下是附加内容:
EDA实验--序列信号发生器VHDL程序
ENTITYsequencerIS
PORT(clk,clr:
y:
BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));
ENDsequencer;
ARCHITECTUREbhvOFsequencerIS
PROCESS(clk,clr)
IFCLK'
EVENTANDCLK='
IFclr='
10000000"
CASEyIS
WHEN"
=>
11000001"
11100000"
00010000"
11111000"
00000011"
11110011"
00000001"
方波信号发生器VHDL程序:
ENTITYsquareIS
q:
OUTSTD_LOGIC);
ENDsquare;
ARCHITECTUREbhvOFsquareIS
VARIABLEcnt:
cnt:
=cnt+1;
IFcnt<
31THEN
考虑低位的2位数值比较器VHDL
ENTITYcompare2wlIS
PORT(a,b:
INSTD_LOGIC_VECTOR(1DOWNTO0);
i:
INSTD_LOGIC_VECTOR(2DOWNTO0);
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDcompare2wl;
ARCHITECTUREarcOFcompare2wlIS
PROCESS(a,i)
IF(a
(1)>
b
(1))THEN
y<
100"
ELSIF(a
(1)<
010"
ELSIF(a
(1)=b
(1))THEN
IF(a(0)>
b(0))THEN
ELSIF(a(0)<
ELSIF(a(0)=b(0))THEN
IF(i="
)THEN
ELSIF(i="
ELSE
001"
ENDarc;
分频器VHDL
ENTITYclk_divIS
PORT(clk_in:
INBIT;
clk_out:
BUFFERBIT);
ENDclk_div;
ARCHITECTUREbhvOFclk_divIS
SIGNALcounter:
STD_LOGIC_VECTOR(25DOWNTO0);
PROCESS(clk_in)
CONSTANTcnt:
INTEGER:
=50_000_000;
IFCLK_IN'
EVENTANDCLK_IN='
counter<
=counter+1;
IFcounter=cnt/2-1THEN
clk_out<
=NOTclk_out;
=(OTHERS=>
'
);
函数信号发生器的VHDL设计
--------------------------------------------------------------------------------
信号发生器在电子测量和自动控制领域应用十分广泛,常用的信号发生器大多由模拟电路构成,由于电路复杂、调试麻烦且精度低等缺点,一些复杂模拟电路已被数字电路所代替。
随着计算机软、硬件的发展,计算机与外设之间的数据通信越来越频繁,也越来越便利,虚拟仪器应运而生。
本文介绍基于SOPC实现的函数信号发生器部分原理。
1 SOPC的简介
SOPC技术是美国Altrea公司于2000年最早提出的,并同时推出了相应的开发软件QuartusII。
SOPC是基于FPGA解决方案的SOC,SOPC的设计是以IP为基础的,以硬件描述语言VHDL为主要设计手段,借助于以计算机为平台的EDA工具进行的。
与传统的专用集成电路设计技术相比,SOPC的设计全程,包括电路系统描述、硬件设计、仿真测试、综合、调试、系统软件设计,直至整个系统的完成,都由计算机完成。
其设计技术直接面向用户,使系统级专用集成电路的实现有了更多的途径,即除传统的ASIC器件外,还能通过大规模FPGA等可编程器件来实现。
SOPC设计包括以32位Nios软核处理器为核心的嵌入式系统的硬件配置、硬件设计、硬件仿真、软件设计、软件调试等。
SOPC系统设计的基本软件工具主要有:
QuartusII,用于完成Nios系统的综合、硬件优化、适配、编程下载和硬件系统测试;
SOPCbuilder是AlteraNios嵌入式处理器开发软件包,用于实现Nios系统的配置、生成、Nios系统相关的监控和软件调试平台的生成;
ModelSim用于对SOPCBuilder生成的Nios的HDL描述进行系统功能仿真;
Matlab/DSPBuilder,可借助于生成Nios系统的硬件加速器,进而为其定制新的指令;
GNUPro用于进行软件调试。
2 函数信号发生器的设计步骤与实现
(1)设计步骤
用VHDL语言结合原理图设计实现一个函数信号发生器,输出正弦波、方波和三角波三种波形。
将频率控制、分频、三角波、正弦波、方波发生各个模块分别用VHDL语言编程为一个子程序,并把每一个模块转换成图形文件,然后在原理图编辑框调用这些图形模块
(2)原理实现
frqload.vhd:
把四位频率控制字f〔3...0〕转换为相对应的整数输出q,用于分频计数使用;
frq_div.vhd:
把输入的时钟CLK进行分频,对分频计数a逐次减一,当分频计数a被减到零时,给出一个输出q;
作为三角波模块(delta_gen)、方波模块(square_gen)、正弦波模块(sin_gen)的时钟clk,实现了对输入时钟CLK的a分频。
delta_gen.vhd:
设定一个变量num,定义其范围为“00000111”到“11111000”,每到一个脉冲,分别对它进行+8或-8,然后把改变后的num送到输出q,生成了三角波信号。
square_gen.vhd:
设定一个变量num,每到一个脉冲,检测它是否小于512,若小于512,则把高电平送到输出,并对num+1,否则就输出低电平,并赋值num为0,生成了方波信号。
sin_gen.vhd:
通过定义正弦数据表,每到一个脉冲,逐次查找并输出相应的正弦数据,生成了正弦波形。
mkgrp.vhd:
用于控制输出波形的选通,若只有sin输入高电平,则输出正弦波,以此类推,假若