vhdl实验.docx

上传人:b****4 文档编号:12412211 上传时间:2023-04-18 格式:DOCX 页数:56 大小:30.86KB
下载 相关 举报
vhdl实验.docx_第1页
第1页 / 共56页
vhdl实验.docx_第2页
第2页 / 共56页
vhdl实验.docx_第3页
第3页 / 共56页
vhdl实验.docx_第4页
第4页 / 共56页
vhdl实验.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

vhdl实验.docx

《vhdl实验.docx》由会员分享,可在线阅读,更多相关《vhdl实验.docx(56页珍藏版)》请在冰豆网上搜索。

vhdl实验.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1