实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx

上传人:b****5 文档编号:19904996 上传时间:2023-01-12 格式:DOCX 页数:13 大小:683.67KB
下载 相关 举报
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx_第1页
第1页 / 共13页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx_第2页
第2页 / 共13页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx_第3页
第3页 / 共13页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx_第4页
第4页 / 共13页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx

《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx

1,那么输出col输出信号将发生变化,Out1变为’0’,则col0~col3输出分别为“1110”。

 

可通过行扫描码和列输出码来获得分时扫描的键盘按压信号。

只要扫描时间适当,就可得到按键的按压情况。

3、键盘输入

一个完整的键盘控制程序应解决以下任务:

(1)检测有无按键按下

(2)有键按下,在无硬件去抖得情况下,应有软件延时除去抖动影响

(3)键扫描程序

(4)将键编码转换成相应键值

  整个设计程序包括三个模块:

时钟分频、键盘扫描和键译码转换。

为了显示,还必须在顶层添加显示部分。

由于使用的外部时钟频率为50MHz,这个频率对扫描来说太高,所以这里需要一个分频器来分得适合键盘扫描使用的频率。

三、程序框图(流程图)

四、源程序&

仿真波形

该系统主要由以下几个模块组成:

1.时钟分频模块

由于主芯片提供的频率赫兹与实际应用的频率不一样,所以必须将实验箱提供的时钟信号分频达到利用目的。

代码如下:

entityclk_devideris

Port(clkin:

inSTD_LOGIC;

clkout:

outSTD_LOGIC);

endclk_devider;

architectureBehavioralofclk_devideris

signalCounter:

IntegerRANGE1TO5000;

SIGNALClk:

std_logic;

begin

PROCESS(clkin)

BEGIN

IF(clkin'

eventANDclkin='

1'

)THEN

IFCounter=5000THEN

Counter<

=1;

Clk<

=NOTClk;

ELSE

Counter<

=Counter+1;

ENDIF;

ENDIF;

ENDPROCESS;

clkout<

=Clk;

endBehavioral;

仿真波形:

由于分频频率过低,仿真波形不太明显,所以将修改counter=5000改为counter=5.

2.键盘扫描模块

由于需要键盘输入数值,所以需要扫描键盘数值。

键盘模型如图:

键盘扫描原理:

如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下。

同时定义两个key_value存储键盘先后输入的两个数值,并且相加输出。

键盘扫描代码:

entitykey_scanis

Port(clk:

t_out:

outSTD_LOGIC_VECTOR(1downto0);

key_in:

inSTD_LOGIC_VECTOR(5downto0);

key_out:

outSTD_LOGIC_VECTOR(3downto0);

key_value_tmp:

outSTD_LOGIC_VECTOR(4downto0);

key_value:

outSTD_LOGIC_VECTOR(4downto0));

endkey_scan;

architectureBehavioralofkey_scanis

signalscan,scan_tp:

STD_LOGIC_VECTOR(3downto0);

signalflag:

integerrange1to4;

signalen_tp,en_old,en:

STD_LOGIC;

signalkey_value_lock,key_value_lock1,key_value_lock_tp,key_value_lock_tp1:

STD_LOGIC_VECTOR(9downto0);

signallight_out,light_out1:

signalcnt_low:

STD_LOGIC_VECTOR(9downto0):

="

0000000000"

;

signalcnt_high:

key_out<

=scan;

key_value<

='

0'

&

light_out;

--key_in&

scan;

key_value_tmp<

light_out1;

t_out(0)<

=en;

t_out

(1)<

process(clk)

begin

if(clk'

eventandclk='

)then

if(flag=1)then

scan<

1110"

flag<

=2;

elsif(flag=2)then

scan<

1101"

=3;

elsif(flag=3)then

1011"

=4;

elsif(flag=4)then

0111"

=1;

endif;

endif;

endprocess;

if((key_in(0)andkey_in

(1)andkey_in

(2)andkey_in(3)andkey_in(4)andkey_in(5))='

)then

scan_tp<

en_tp<

--key_value_lock1<

=key_value_lock;

key_value_lock_tp<

=key_in&

if((key_in(0)andkey_in

(1)andkey_in

(2)andkey_in(3)andkey_in(4)andkey_in(5))='

andscan_tp=scan)then

if(en_tp='

if(cnt_low<

100)then

cnt_low<

=cnt_low+1;

cnt_high<

=(others=>

'

);

else

if(cnt_high<

cnt_high<

=cnt_high+1;

cnt_low<

endif;

en_old<

if(cnt_high>

50)then

en<

if(cnt_low>

50)then

process(clk)

if(en_old='

anden='

key_value_lock_tp1<

=key_value_lock_tp;

if(en_old='

)then

key_value_lock1<

key_value_lock<

=key_value_lock_tp1;

case(key_value_lock)is

when"

1111101011"

=>

light_out<

0000"

0111110111"

0001"

0111111011"

0010"

0111111101"

0011"

1011110111"

0100"

1011111011"

0101"

1011111101"

0110"

1101110111"

1101111011"

1000"

1101111101"

1001"

--whenothers=>

ZZZZZZZZ"

whenothers=>

NULL;

endcase;

case(key_value_lock1)is

light_out1<

键盘扫描仿真波形:

仿真图表示键盘输入数字1.

3.加法模块

键盘输入两个值后,将之转换成8421码制,并且相加,同时需要判断是否进位点亮十位的数码管。

加法模块代码:

entityaddis

anum:

inSTD_LOGIC_VECTOR(4downto0);

bnum:

sum:

cout:

endadd;

architectureBehavioralofaddis

signalresult_tmp:

std_logic_vector(4downto0);

signalresult_tmpa:

sum<

=result_tmp(3downto0);

if(clk'

result_tmpa<

=anum+bnum;

--data_tmp+

if(result_tmpa>

01010"

result_tmp<

=result_tmpa-"

cout<

else

result_tmp<

=result_tmpa;

endif;

加法模块仿真波形:

图中表示先后输入1和6,并且最后求和赋给了result=7.

LED显示模块:

键盘输入的数字需要在八段数码管显示,并且最后需要显示相加的和。

显示代码如下:

entityledis

Port(key_in:

inSTD_LOGIC_VECTOR(3downto0);

light_out:

outSTD_LOGIC_VECTOR(7downto0);

clk:

inSTD_LOGIC);

endled;

architectureBehavioralofledis

process(clk)

case(key_in)is

00111111"

00000110"

01011011"

01001111"

01100110"

01101101"

01111101"

00000111"

01111111"

01101111"

endcase;

七、实验中遇到的问题和解决方法

VHDL语言与我们所了解的C、C++很不一样,他的所有进程都是并行的,当然还有其他很多不一样的地方,所有可能接受起来有些吃力,导致我们做了好几次都没有弄出来,在老师给了重点地方的代码之后还是没弄出来,直到老师给了完整的程序之后才算是可以运行。

仿真的时候由于不会设置I/O口的状态,而用相对简单的Quartus实现的。

这次试验不尽如人意。

在实验中也遇到了很多问题,感觉自己解决问题的能力很弱,就像找不着对应的I/O口,其实可以通过自己的能力解决的,但是因为有老师在,就觉得有指望,所以造成了自己的这种惰性,以后一定要努力克服自己的这种性格。

据我了解到,VHDL是现在很有用的一门语言,很多专业都在学习,但是以我个人观点来看,这门课应该至少设置六学分,且设置为必修课。

结束了这门课以后我们也应当在课下多多实践。

尽量掌握好这样一种很有用的工具。

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

当前位置:首页 > 法律文书 > 调解书

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

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