实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx
- 文档编号:19904996
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:13
- 大小:683.67KB
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx
《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计VHDL输入Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
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是现在很有用的一门语言,很多专业都在学习,但是以我个人观点来看,这门课应该至少设置六学分,且设置为必修课。
结束了这门课以后我们也应当在课下多多实践。
尽量掌握好这样一种很有用的工具。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验报告北邮 电子线路设计与仿真 实验二 一位8421全加器设计VHDL输入 实验 报告 电子线路 设计 仿真 一位 8421 全加器 VHDL 输入
链接地址:https://www.bdocx.com/doc/19904996.html