logo资料库

十进制运算器设计及仿真课程设计报告.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
数字逻辑课程设计报告 题 目 十进制运算器设计及仿真 姓 名 学 号 班 级 计算机科学与技术 指导老师 成 绩 2017 年 6 月
1. 设计内容 键盘上有“0-9”及“+-=”按键,实现输入的 2 个一位十进制数的加、减运算 2. 系统总体设计 给出系统逻辑框图(系统包含的各子功能模块及连接框图 给出各子功能模块的功能 按键处理:输入数字和运算符。 控制器 :负责全机的控制工作,把数字指令逐条从存储器中取出,经译码分析后向全机 发出取数、执行、存数等控制命令,以正确完成程序所要求的功能。 寄存器 :用来存放输入的数字和最后算出来的结果。 D 触发器:在时钟脉冲 cp 的前沿发生翻转,触发器的次态取决于 cp 的脉冲上升沿之前 D 端的状态,即次态=D。因此,它具有置 0、置 1 两种功能。 运算器 :用来进行算数逻辑运算。 3. 寄存器的设计、实现及仿真 (1) 元件图及输入输出描述 输入信号:clk、din[4..0]; 输出信号:qout[4..0]。 功能描述 (2 ) 用来存放输入的数字、运算符和最后算出来的结果 (3) VHDL 源代码 LIBRARY ieee;
USE ieee. std_logic_1164.ALL; USE ieee. std_logic_unsigned.ALL; USE ieee.std_logic_arith.ALL; ENTITY mxpreg IS PORT (clk: IN STD_LOGIC; range 0 to 20; din:IN integer qout: OUT integer END ENTITY mxpreg; ARCHITECTURE arc1 OF mxpreg IS range 0 to 20); BEGIN PROCESS (clk) BEGIN IF(clk'event and clk='1') THEN Qout<=din; END IF; END PROCESS; END ARCHITECTURE arc1; (4) 测试及分析 当输入的 d 为 1 时,时钟处于上升沿,输出的 qout 等于 0,符合结果。 4.运算器的设计、实现及仿真 (1)元件图 (1) 功能描述 用来进行对键盘上输入的数字及符号算数逻辑运算 (2) VHDL 源代码
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; USE ieee.std_logic_arith.ALL; ENTITY mxpalu IS PORT (ain,bin: IN integer range 0 to 20; op:IN std_logic; result: OUT integer range 0 to 20); END ENTITY ARCHITECTURE mxpalu; arcl OF mxpalu IS BEGIN PROCESS (ain,bin,op) VARIABLE data:integer range 0 to 20; BEGIN CASE op IS WHEN '0'=> data:=ain+bin; IF data> 9 THEN result<=data+6; END IF; WHEN '1'=> data:=ain-bin; END CASE; result<=data; END PROCESS; END ARCHITECTURE arcl; (3) 测试及分析 根据源代码中,如果(op='0'),则输入信号无效,若输入信号 op=1,即为有效,此时 b 等于 1, 不对其进行运算,符合实验结果。 5.按键处理的设计、实现及仿真 (1)元件图及输入输出描述
功能描述 输入:key-0、key-1、key-2、key-3、key-4、key-5、key-6、key-7、key-8、key-9、add、sub、 equ; 输出:keyout[4..0]、opout、press-num 、press-op、press-equ; (2 ) 接受从键盘上输入的数字和运算符信号。 (3) LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; USE ieee.std_logic_arith.ALL; ENTITY mxpkeypad IS VHDL 源代码 PORT (key_0,key_1,key_2,key_3,key_4,key_5,key_6,key_7,key_8,key_9: IN STD_LOGIC; key_add,key_sub,key_equ: IN STD_LOGIC; numout: OUT integer RANGE 0 TO 20; press_num:OUT STD_LOGIC; opout:OUT STD_LOGIC; press_op:OUT STD_LOGIC; press_equ:OUT STD_LOGIC ); END ENTITY mxpkeypad; ARCHITECTURE one OF mxpkeypad IS BEGIN PROCESS (key_0,key_1,key_2,key_3,key_4,key_5,key_6,key_7,key_8,key_9,key_add,key_sub,key_e qu) VARIABLE key:STD_LOGIC_VECTOR (9 DOWNTO 0); BEGIN
key:=key_9 & key_8 & key_7 & key_6 & key_5 & key_4 & key_3 & key_2 & key_1 & key_0; CASE key IS WHEN "1111111110"=> numout<=0;press_num<='1'; WHEN "1111111101"=> numout<=1;press_num<='1'; WHEN "1111111011"=> numout<=2;press_num<='1'; WHEN "1111110111"=> numout<=3;press_num<='1'; WHEN "1111101111"=> numout<=4;press_num<='1'; WHEN "1111011111"=> numout<=5;press_num<='1'; WHEN "1110111111"=> numout<=6;press_num<='1'; WHEN "1101111111"=> numout<=7;press_num<='1'; WHEN "1011111110"=> numout<=8;press_num<='1'; WHEN "0111111111"=> numout<=9;press_num<='1'; WHEN OTHERS=> numout<=0;press_num<='0'; END CASE; IF key_add='0' THEN opout<='0';press_op<='1'; ELSIF key_sub='0' THEN opout<='1';press_op<='1'; ELSE opout<='Z';press_op<='0'; END IF; IF key_equ='0' THEN press_equ<='1'; ELSE press_equ<='0'; END IF; END PROCESS; END ARCHITECTURE one; (4) 测试及分析
仿真时从键盘上输入数字 1、2、+、=,仿真结果能够正确表示,符合实验结果。 6、 控制器的设计、实现及仿真 (1) 元件图及输入输出描述 (2)功能描述 控制器共有五个状态,负责全机的控制工作,把数字指令逐条从存储器中取出,经译码分 析后向全机发出取数、执行、存数等控制命令。 (3)VHDL 源代码 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY mxpcontrol IS PORT ( reset,clk,press_num,press_op,press_equ : IN STD_LOGIC; enreg1,enreg2,enop,enreg3: OUT STD_LOGIC );
END mxpcontrol; ARCHITECTURE one OF mxpcontrol IS state_type is (wait_num1,wait_op, wait_num2,wait_equ,outresult); type signal state: state_type; BEGIN process(reset,clk) begin if reset ='1' then state <= wait_num1; elsif clk'event and clk ='1' then case state is when wait_num1 => if press_num ='1' then state <= wait_op; end if; when wait_op => if press_op='1' then state <= wait_num2; end if; when wait_num2 => if press_num='1' then state <= wait_equ; end if; when wait_equ => if press_equ='1' then state <= outresult; end if; when outresult => state <= wait_num1; when others => state <= wait_num1; end case; end if; end process; process (state) begin case state is when wait_num1=> enreg1<='0';enreg2<='0';enop<='0';enreg3<='0'; when wait_op=> enreg1<='1';enreg2<='0';enop<='0';enreg3<='0';
分享到:
收藏