vhdl实验.docx
《vhdl实验.docx》由会员分享,可在线阅读,更多相关《vhdl实验.docx(56页珍藏版)》请在冰豆网上搜索。
vhdl实验
第一部分实验思路
1.1实验二(8位可逆计数器)
分两个进程,一个记录手动脉冲个数,另一个记录脉冲源脉冲个数,最后以方式选择开关决定显示哪个个数。
1.2实验三(任意整数分频电路设计)
分两个进程,一个记录上升沿个数,另一个纪录下降沿个数,当计数总和等于预分频数时,两个进程的标识位取反,最后将两个标识位的异或送给输出。
1.3实验四(多功能循环彩灯控制电路设计)
确定四种循环方式,分别为1、3、5、7,2、4、6、8,7、5、3、1,8、6、4、2。
用case,when语句,同时计数自动加一。
1.4实验五(8段数码管动态扫描显示控制)
设置一个顶层文件,三个模块文件(分频模块,计数模块,显示模块)。
分频是将20Mhz分成周期为1/100s和100us的方波。
计数是记录有多少个1/100s。
显示是以100us为步调扫描数码管以显示计数。
1.5实验六(频率计设计)
设置一个顶层文件,三个模块文件(分频模块,计数模块,显示模块)。
分频是将20Mhz分成周期为1s和1ms的方波。
计数是记录在1s内待测脉冲的周期数。
显示是以1ms为步调扫描数码管以显示计数。
1.6实验七(矩阵式键盘扫描与键码检测)
设立四个进程,一个完成由20Mhz到周期为10ms,100us的转换(10ms用于扫描键盘,100us用于扫描数码管以显示键码)。
一个完成键盘的横向扫描与列向接收。
其余两个完成显示键码。
1.7实验八(LPM的使用)
设立两个LPM,一个为三位计数器,另一个为三位比较器。
计数器的输出送入比较器,完成比较并输出比较结果。
1.8实验九(多功能电子钟设计)
设置一个顶层文件,五个模块文件(分频模块,计数模块,矫正模块,定点模块,显示模块)。
分频是将20Mhz分成周期为1s和100us的方波,1s用于记录时间,100us用于扫描数码管。
计数是记录时间。
矫正完成时间的重设。
定点完成定点设置。
显示模块是根据设置显示矫正状态,正常状态,定点状态,并控制上下午指示灯,定点报警指示灯。
1.9实验十(SPI总线时序模拟)
发射机:
设置一个顶层文件,三个模块文件(分频模块,信号输出模块,信号接收模块)。
分频是将20Mhz分成周期为1ms的方波,用于双机同步时钟设置。
信号输出模块依据spi协议,依次输出写使能,写命令,写地址,写数据,读命令,读地址,最后使信号接收使能开启。
信号接收模块完成数据的接收,并用led灯显示。
接收机:
设置一个顶层文件,一个模块文件(信号输出模块)。
顶层文件完成信号的接受,并存储数据,当依次读到“读命令”,“读地址”时,信号输出使能开启。
信号输出模块完成“读地址”数据的输出。
第二部分问题和解决方案
2.1数据不能锁存。
先写判断语句(如rising_edge()),再对数据操作。
2.2不同进程不能同时给一个信号赋值。
可以在一个进程中设置标记信号,在另一个进程中判断标记信号,完成目标信号赋值。
2.3现象与自己期望的相差若干节拍。
可能是信号赋值需要一段延时所致,可用变量赋值代替信号赋值。
2.4程序太长理不清思路。
可以设置多个模块,一个顶层文件。
在顶层文件中调用模块。
2.5位矢量赋值较不便。
可以设成integer类型,还可以通过range设置范围。
2.6一个进程不能有多个判断上升沿(下降沿)语句。
可以设置多个进程,在其他进程中判断。
注意进程之间是并行的。
2.7模块程序是对的,但当例化时结果出错。
可能是例化列表次序不对所致。
2.8进程中的程序过多,条理不清。
可以设立多个进程,进程之间通过信号传输信息。
2.9进程无语句错误,但仿真与自己想的不一致。
可能是信号列表中所列信号不全,还可能是忽略了进程的性质:
当信号列表中信号变化时进入进程,进程中语句是顺序执行的,当语句执行完毕后,重新处于等待信号列表中信号变化。
2.10在不同进程中遇到相同的数值处理问题,为此要在不同进程中输入大量相同的处理代码,这样是程序很冗余。
可以建立一个函数,并生成包。
当用时只需调用包和相应函数就行了。
第三部分技术的认识
与其他硬件描述语言相比,VHDL具有以下特点:
3.1功能强大、设计灵活
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
它具有多层次的设计描述功能,层层细化,最后可直接生成电路。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。
VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
3.2支持广泛、易于修改
由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。
在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
3.3强大的系统硬件描述能力
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。
而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。
另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。
VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
3.4独立于器件的设计、与工艺无关
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。
当设计描述完成后,可以用多种不同的器件结构来实现其功能。
3.5很强的移植能力
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
3.6易于共享和复用
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。
这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
第四部分课程的建议
4.1EDA实验室开放时间长,方便学生做实验,提高理论与实际结合能力。
第五部分程序源代码
--******************************************
--实验二(8位可逆计数器)
--******************************************
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytwois
port(clr,i1,i0,sel0,sel1:
instd_logic;
o:
outstd_logic_vector(7downto0));
sharedvariablem1,m2,m3:
std_logic_vector(7downto0);
endentitytwo;
architecturetroftwois
begin
a1:
process(sel0,i1,clr)
begin
ifi1='1'andi1'eventandi1'last_value='0'then
ifclr='1'thenm1:
=(others=>'0');
elsifclr='0'then
ifsel0='1'then
ifm1<255thenm1:
=m1+1;
elsem1:
=(others=>'0');
endif;
elsifsel0='0'then
ifm1>0thenm1:
=m1-1;
elsem1:
=(others=>'1');
endif;
endif;
endif;
endif;
endprocessa1;
a2:
process(sel0,i0)
begin
ifclr='1'thenm2:
=(others=>'0');
elsifi0='1'andi0'eventandi0'last_value='0'then
ifsel0='1'then
ifm2<255thenm2:
=m2+1;
elsem2:
=(others=>'0');
endif;
elsifsel0='0'then
ifm2>0thenm2:
=m2-1;
elsem2:
=(others=>'1');
endif;
endif;
endif;
endprocessa2;
o<=m1whensel1='1'else
m2whensel1='0'else
(others=>'0');
endtr;
--*******************************
--实验三(任意整数分频电路设计)
--*******************************
libraryieee;
useieee.std_logic_1164.all;
entityoneis
port(clki:
instd_logic;
sel:
inintegerrange0to255;
clko:
outstd_logic);
endone;
architecturefrequentofoneis
signaltemp1,temp2:
integerrange0to255;
signaltemp3,temp4:
std_logic;
begin
a2:
process(clki,sel)
variablea:
integerrange0to255;
begin
ifrising_edge(clki)then
a:
=temp2;
ifa>1thena:
=a-1;
elsea:
=sel;temp3<=nottemp3;
endif;
temp1<=a;
endif;
endprocessa2;
a3:
process(clki,sel)
variableb:
integerrange0to255;
begin
iffalling_edge(clki)then
b:
=temp1;
ifb>1thenb:
=b-1;
elseb:
=sel;temp4<=nottemp4;
endif;
temp2<=b;
endif;
endprocessa3;
clko<=temp3xortemp4;
endfrequent;
--***************************************
--实验四(多功能循环彩灯控制电路设计)
--***************************************
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitycycleis
port(clk,reset:
instd_logic;
p:
outstd_logic_vector(7downto0));
endcycle;
architecturebehaveofcycleis
typefsm_stis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);
signalpr_state,nx_state:
fsm_st;
signalm:
std_logic_vector(3downto0);signaln,b:
std_logic_vector(3downto0);signala:
std_logic_vector(3downto0);
signaltmp:
std_logic_vector(7downto0);
begin
P1:
process(reset,clk)
begin
if(reset='0')then
a<="0001";
m<="0000";
n<="0000";
pr_state<=s0;
elsif(clk'eventandclk='1')then
if(m<"0100")then
m<=m+1;
else
m<="0000";
endif;
if(m="0000")then
if(n<"0100")then
n<=n+1;
elsen<="0000";
endif;
endif;
if(n="0000")then
if(b<"0100")then
b<=b+1;elseb<="0000";
endif;
if(b="0000")then
if(a<"0100")then
a<=a+1;
elsea<="0001";
endif;
endif;
endif;
pr_state<=nx_state;
endif;
endprocessP1;
P3:
process(m,n,a)
begin
caseais
when"0001"=>
if(m="0000")then
nx_state<=s0;
tmp<="00000001";
elsif(m="0001")then
nx_state<=s1;
tmp<="00000011";
elsif(m="0010")then
nx_state<=s2;
tmp<="00000101";
elsif(m="0011")then
nx_state<=s3;
tmp<="00000111";
endif;
when"0010"=>
if(m="0000")then
nx_state<=s4;
tmp<="00000010";
elsif(m="0001")then
nx_state<=s5;
tmp<="00000100";
elsif(m="0010")then
nx_state<=s6;
tmp<="00000110";
elsif(m="0011")then
nx_state<=s7;
tmp<="00001000";
endif;
when"0011"=>
if(m="0000")then
nx_state<=s8;
tmp<="00000111";
elsif(m="0001")then
nx_state<=s9;
tmp<="00000101";
elsif(m="0010")then
nx_state<=s10;
tmp<="00000011";
elsif(m="0011")then
nx_state<=s11;
tmp<="00000001";
endif;
when"0100"=>
if(m="0000")then
nx_state<=s12;
tmp<="00001000";
elsif(m="0001")then
nx_state<=s13;
tmp<="00000110";
elsif(m="0010")then
nx_state<=s14;
tmp<="00000100";
elsif(m="0011")then
nx_state<=s15;
tmp<="01000010";
endif;
whenothers=>null;
endcase;
p<=tmp;
endprocessP3;
endbehave;
--******************************
--实验五(8段数码管动态扫描显示控制)
--*****************************
libraryieee;--顶层文件
useieee.std_logic_1164.all;
entityoneis
port(sel1,sel2,clki:
instd_logic;
sel:
outstd_logic_vector(1to6);
data:
outstd_logic_vector(1to7);
dp:
outstd_logic
);
endone;
architecturerhofoneis
componentfenpinis
port(clki:
instd_logic;
o1,o2:
outstd_logic
);
endcomponent;
componentjishuis
port(sel1,sel2,o1:
instd_logic;
a1,a2,a3,a4,a5,a6:
outintegerrange0to9
);
endcomponent;
componentxianshiis
port(a6,a5,a4,a3,a2,a1:
inintegerrange0to9;
o2:
instd_logic;
sel:
outstd_logic_vector(1to6);
data:
outstd_logic_vector(1to7);
dp:
outstd_logic);
endcomponent;
signalo1,o2:
std_logic;
signala1,a2,a3,a4,a5,a6:
integerrange0to9;
beginu1:
fenpinportmap(clki,o1,o2);
u2:
jishuportmap(sel1,sel2,o1,a1,a2,a3,a4,a5,a6);
u3:
xianshiportmap(a6,a5,a4,a3,a2,a1,o2,sel,data,dp);
endrh;
libraryieee;--分频
useieee.std_logic_1164.all;
entityfenpinis
port(clki:
instd_logic;
o1,o2:
outstd_logic
);
endfenpin;
architecturerhoffenpinis
signalo10,o20:
std_logic;
begin
process(clki)
variablea,b:
integerrange0to100000;
begin
ifrising_edge(clki)then
ifa<999thena:
=a+1;
elsea:
=0;o20<=noto20;
endif;
ifb<99999thenb:
=b+1;
elseb:
=0;o10<=noto10;
endif;
endif;
o1<=o10;
o2<=o20;
endprocess;
endrh;
libraryieee;--计数
useieee.std_logic_1164.all;
entityjishuis
port(sel1,sel2,o1:
instd_logic;
a1,a2,a3,a4,a5,a6:
outintegerrange0to9
);
endentity;
architecturerhofjishuis
begin
process(sel1,sel2,o1)
variableb6,b5,b4,b3,b2,b1:
integerrange0to9;
begin
ifrising_edge(o1)then
ifsel1='1'then
ifsel2='1'thenb6:
=0;b5:
=0;b4:
=0;b3:
=0;b2:
=0;b1:
=0;
elseifb1<=8thenb1:
=b1+1;
elseb1:
=0;
ifb2<=8thenb2:
=b2+1;
elseb2:
=0;
ifb3<=8thenb3:
=b3+1;
elseb3:
=0;
ifb4<=4thenb4:
=b4+1;
elseb4:
=0;
ifb5<=8thenb5:
=b5+1;
elseb5:
=0;
ifb6<=4thenb6:
=b6+1;
elseb6:
=0;
endif;
endif;
endif;
endif;
endif;
endif;
endif;
endif;
endif;
a1<=b1;
a2<=b2;
a3<=b3;
a4<=b4;
a5<=b5;
a6<=b6;
endprocess;
endrh;
libraryieee;--显示
useieee.std_logic_1164.all;
entityxianshiis
port(a6,a5,a4,a3,a2,a1:
inintegerrange0to9;
o2:
instd_logic;
sel:
outstd_logic_vector(1to6);
data:
outstd_logic_vector(1to7);
dp:
outstd_logic
);
endxianshi;
architecturerhofxianshiis
signaltemp:
integerrange0to10;
begin
process(o2)
variabletemp1:
integerrange1to6;
begin
ifrising_edge(o2)then
casetemp1is
when1=>sel<="000001";temp<=a1;dp<='0';
when2=>sel<="000010";temp<=a2;