实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx

上传人:小飞机 文档编号:3436774 上传时间:2023-03-13 格式:DOCX 页数:11 大小:40.12KB
返回 下载 相关 举报
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx_第1页
第1页 / 共11页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx_第2页
第2页 / 共11页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx_第3页
第3页 / 共11页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx_第4页
第4页 / 共11页
实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx》由会员分享,可在线阅读,更多相关《实验报告北邮电子线路设计与仿真实验二一位8421全加器设计.docx(11页珍藏版)》请在三一办公上搜索。

1、实验报告北邮 电子线路设计与仿真 实验二 一位8421全加器设计实验名称:一位8421全加器设计 一、实验目的 学习用VHDL语言对计数器设计、仿真和硬件测试,进一步熟悉VHDL设计技术。设计程序独立完成全加器的仿真。全加器由两个半加器组合而成,原理类似。半加器不考虑低位进位,但有高位进位;全加器要考虑低位的进位且该进位和求和的二进制相加,可能获得更高的进位。 VHDL编程输入的设计步骤,设计方法等。 二、实验内容和原理 1、系统构成 八段数码管显示模块 八段数码管扫描模块 BCD转换及加法计算模块 键盘输入数据读取模块 时钟分频模块 2、矩阵键盘工作原理 按键设置在行列线交叉点,行列线分别连

2、接到按键开关的两端。列线通过上拉电阻接5V电压,即列线的输出被钳位到高电平状态。 判断键盘中有无按键按下是通过行线送入扫描信号然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线全是高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下 无按键按下时,col0col3输出分别为“1111” 当输入扫描时,扫描第一行,即IN1=0,当按下Button 1,那么输出col输出信号将发生变化,Out1变为0,则col0col3输出分别为“1110”。 可通过行扫描码和列输出码来获得分时扫描的键盘按压信

3、号。只要扫描时间适当,就可得到按键的按压情况。 3、键盘输入 一个完整的键盘控制程序应解决以下任务: 检测有无按键按下 有键按下,在无硬件去抖得情况下,应有软件延时除去抖动影响 键扫描程序 将键编码转换成相应键值 整个设计程序包括三个模块:时钟分频、键盘扫描和键译码转换。为了显示,还必须在顶层添加显示部分。 由于使用的外部时钟频率为50MHz,这个频率对扫描来说太高,所以这里需要一个分频器来分得适合键盘扫描使用的频率。 三、程序框图 四、源程序&仿真波形 该系统主要由以下几个模块组成: 1.时钟分频模块 由于主芯片提供的频率赫兹与实际应用的频率不一样,所以必须将实验箱提供的时钟信号分频达到利用

4、目的。 代码如下: entityclk_devider is Port ( clkin : in STD_LOGIC; clkout : out STD_LOGIC); endclk_devider; architecture Behavioral of clk_devider is signal Counter: Integer RANGE 1 TO 5000; SIGNAL Clk:std_logic; begin PROCESS(clkin) BEGIN IF (clkinevent AND clkin =1) THEN IF Counter= 5000 THEN Counter = 1

5、; Clk=NOT Clk; ELSE Counter=Counter +1; END IF; END IF; END PROCESS; clkout=Clk; end Behavioral; 仿真波形: 由于分频频率过低,仿真波形不太明显,所以将修改counter=5000改为counter=5. 2.键盘扫描模块 由于需要键盘输入数值,所以需要扫描键盘数值。键盘模型如图: 键盘扫描原理:按键设置在行列线交叉点,行列线分别连接到按键开关的两端。列线通过上拉电阻接5V电压,即列线的输出被钳位到高电平状态。判断键盘中有无按键按下是通过行线送入扫描信号然后从列线读取状态得到的。其方法是依次给行线送

6、低电平,检查列线的输入。如果列线全是高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下。同时定义两个key_value存储键盘先后输入的两个数值,并且相加输出。 键盘扫描代码: entitykey_scan is Port ( clk : in STD_LOGIC; t_out:out STD_LOGIC_VECTOR (1 downto 0); key_in : in STD_LOGIC_VECTOR (5 downto 0); key_out : out STD_LOGIC_VECTOR (3 downto 0)

7、; key_value_tmp : out STD_LOGIC_VECTOR (4 downto 0); key_value : out STD_LOGIC_VECTOR (4 downto 0); endkey_scan; architecture Behavioral of key_scan is signal scan ,scan_tp:STD_LOGIC_VECTOR(3 downto 0); signalflag:integer range 1 to 4; signalen_tp,en_old,en:STD_LOGIC; signal key_value_lock,key_value

8、_lock1,key_value_lock_tp,key_value_lock_tp1:STD_LOGIC_VECTOR (9 downto 0); signal light_out,light_out1 :STD_LOGIC_VECTOR(3 downto 0); signalcnt_low:STD_LOGIC_VECTOR (9 downto 0):=0000000000; signalcnt_high:STD_LOGIC_VECTOR (9 downto 0):=0000000000; begin key_out=scan; key_value=0&light_out;-key_in&s

9、can; if(key_in(0) and key_in(1) and key_in(2) and key_in(3) and key_in(4) and scan_tp=scan; key_in(5)=0 )then key_value_tmp=0&light_out1; t_out(0)=en; t_out(1)=en; begin if (clkevent and clk=1)then if(flag=1)then process(clk) begin if (clkevent and clk=0)then scan=1110; flag=2; scan=1101; flag=3; sc

10、an=1011; flag=4; scan=0111; flag=1; end if; elsif(flag=2)then process(clk) elsif(flag=3)then elsif(flag=4)then end if; end process; en_tp=1; -key_value_lock1=key_value_lock; key_value_lock_tp=key_in&scan; end if; if(key_in(0) and key_in(1) and key_in(2) and key_in(3) and key_in(4) and en_tp=0; key_i

11、n(5)=1 and scan_tp=scan )then end if; end if; end process; process(clk) begin if (clkevent and clk=1)then if(en_tp=0 )then if(cnt_low100)then cnt_low=cnt_low+1; end if; cnt_high0); if(cnt_high100)then cnt_high=cnt_high+1; end if; cnt_low0); else end if; end if; end process; process(clk) begin if (cl

12、kevent and clk=0)then en_old 50 )then en=1; end if; en 50 )then end if; end if; end process; process(clk) begin if (clkevent and clk=1)then if(en_old=0 and en=1 )then key_value_lock_tp1=key_value_lock_tp; end if; if(en_old=1 and en=0 )then key_value_lock1=key_value_lock; key_value_locklight_outlight

13、_outlight_outlight_outlight_outlight_outlight_outlight_outlight_outlight_outlight_outNULL; end case; case(key_value_lock1) is when 1111101011=light_out1light_out1light_out1light_out1light_out1light_out1light_out1light_out1light_out1light_out1light_outNULL; end case; end if; end process; end Behavior

14、al; 键盘扫描仿真波形: 仿真图表示键盘输入数字1. 3.加法模块 键盘输入两个值后,将之转换成8421码制,并且相加,同时需要判断是否进位点亮十位的数码管。 加法模块代码: entity add is Port ( clk : in STD_LOGIC; anum : in STD_LOGIC_VECTOR (4 downto 0); bnum : in STD_LOGIC_VECTOR (4 downto 0); sum : out STD_LOGIC_VECTOR (3 downto 0); cout : out STD_LOGIC); end add; architecture Be

15、havioral of add is signalresult_tmp: std_logic_vector(4 downto 0); begin end if; sum=result_tmp(3 downto 0); process(clk) begin if (clkevent and clk=1)then result_tmpa=01010)then result_tmp=result_tmpa-01010; cout=1; begin else result_tmp=result_tmpa; coutlight_outlight_outlight_outlight_outlight_ou

16、tlight_outlight_outlight_outlight_outlight_outlight_outNULL; end case; end if; end process; end Behavioral; 仿真波形: 七、实验中遇到的问题和解决方法 VHDL语言与我们所了解的C、C+很不一样,他的所有进程都是并行的,当然还有其他很多不一样的地方,所有可能接受起来有些吃力,导致我们做了好几次都没有弄出来,在老师给了重点地方的代码之后还是没弄出来,直到老师给了完整的程序之后才算是可以运行。仿真的时候由于不会设置I/O口的状态,而用相对简单的Quartus实现的。这次试验不尽如人意。 在实验中也遇到了很多问题,感觉自己解决问题的能力很弱,就像找不着对应的I/O口,其实可以通过自己的能力解决的,但是因为有老师在,就觉得有指望,所以造成了自己的这种惰性,以后一定要努力克服自己的这种性格。 据我了解到,VHDL是现在很有用的一门语言,很多专业都在学习,但是以我个人观点来看,这门课应该至少设置六学分,且设置为必修课。结束了这门课以后我们也应当在课下多多实践。尽量掌握好这样一种很有用的工具。

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号