数字逻辑课程设计报告
题 目 十进制运算器设计及仿真
姓 名
学 号
班 级 计算机科学与技术
指导老师
成 绩
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';