8位微型计算机的逻辑设计

一、概述
本次设计描述、设计九个寄存器,一个运算器ALU及其逻辑功能,8选1多路选择器,指挥数据通路、存储器、输入设备和输出设备中的各个部件按照一定的顺序工作的控制器;译码器实现了输入设备和输出设备的片选,8个拨位开关的输入设备和8个LED指示灯的输出设备。
二、系统功能描述和需求分析
1、数据通路部分:需要九个寄存器、一个运算器ALU、一个8选1多路选择器;寄存器功能描述: Clk:时钟信号,时钟上升沿进行数据锁存、递增、递减等操作。
Reset_n:异步复位信号,低电平有效的复位输入,当低电平时清零寄存器;
LD:寄存器的写同步控制信号,在时钟沿时,如果LD=1,将DIN的数据存入寄存器并输出到DOUT;
INC:寄存器的递增同步控制信号,在时钟上升沿时,如果INC=1,将寄存器存放的数据+1;
DEC:寄存器的递减同步控制信号,在时钟上升沿时,如果DEC=1,将寄存器存放的数据-1;
DIN:寄存器的输入数据,只有当时钟上升沿时LD=1才能写入该寄存器;
DOUT:寄存器的输出端,将寄存器存放的数据输出;
运算器ALU功能描述:输入8位数据的A和B,进行两个数加、减、A加减一、与或、异或、输出B运算;
8选1多路选择器功能描述:当MDRBus的值为1时输出为MDR,否则当PCbus的值为1时输出为PC,否则当SPbus的值为1时输出为SP,否则当ACbus的值为1时输出为AC,否则当BRbus的值为1时输出为BR,否则当CRbus的值为1时输出为CR,否则当IO_M的值为0并且Read的值为1时输出为MEME2CPU,否则当Read和IO_M的值都为1时输出为KEY2CPU,否则当IO_M的值为任意值并且其他值都为0时输出为8位二进制的0;
2、控制器部分:功能描述:控制器的作用是在时钟的驱动下产生计算机工作所需要的控制信号,指挥数据通路、存储器、输入设备和输出设备中的各个部件按照一定的顺序工作,完成取指令、执行指令的循环,实现指令系统每条指令的功能。控制器本质上是一个有限状态自动机FSM,即一个时序逻辑电路,可以按照摩尔型状态机的设计方法进行设计。我设计的是按照文档六共有95个状态,33个指令码字段,25个输出。其中ALUsel有四个从ALUsel[0]到ALUsel[3],分别实现不同的运算。
3、译码器、存储器和输入输出部分:译码器的功能是完成输入和输出的片选,译码器上的CS0接输出设备,CS1接输入设备;当读信号有效并且接CS1时输入KEY[7:0]送到KEY2CPU[7:0],当写信号有效并且接CS0时DBout[7:0]送到LED[7:0]。
三、相关器件介绍,
本设计需要用到寄存器、运算器ALU、8选1多路选择器组成数据通路、控制器、存储器、译码器、输入设备和输出设备、主实验箱。
下面对这些硬件和组进行简单介绍:
1、寄存器: 在这里插入图片描述 寄存器的设计和描述可以采用参数化的模块,如上图所示。
输入有6个:Clk、Reset_n、LD、INC、DEC、DIN。
输出有1个:DOUT。
2、运算器ALU:
在这里插入图片描述
ALU的输入是参与运算的8位数据的A和B,
输出是8位的运算结果result和4个标志位CF(进位)、OF(溢出)、SF(符号位)、ZF(是否为零)。
3、8选1多路选择器:
在这里插入图片描述
该8选1多路选择器有8个8位的数据输入端,分别是
KEY2CPU、MEM2CPU、MDR、PC、SP、AC、BR、CR
该多路选择器有1个8位的数据输出端:OUT
该多路选择器有8个选择控制信号输入端,分别是:
MDRBus、PCBus、SPBus、ACBus、BRBus、CRBus、IO_M、Read

4、数据通路:
在这里插入图片描述
数据通路内包含9个寄存器、1个ALU和1个八选一多路开关

5、控制器:控制器本质上是一个有限状态自动机FSM,即一个时序逻辑电路,可以按照摩尔型状态机的设计方法进行设计。其状态图可以简画如下:
在这里插入图片描述
在这里插入图片描述

控制器包括:所有状态的状态编码、指令码字段常量、状态寄存器定义和描述、次态定义和生成描述、控制信号输出逻辑。
6、存储器、译码器、输入输出:
module Memory(input clk, reset_n,read,wirte,cs_n,
input [7:0] Addr,
input [7:0] din,
output [7:0] MEM2CPU);
reg [7:0] RAM[255:0];
assign MEM2CPU = ((~cs_n)&read )? RAM[Addr] : 8’b0000_0000; // byte aligned
always @(posedge clk,negedge reset_n)
if (~reset_n) begin
……
end
else if(wirte &(~cs_n))
RAM[Addr] <= din;
endmodule

module Decoder( input IO_M,
input [7:0] Addr,
output cs0,cs1);
assign cs0=IO_M & (Addr == 8’b0000_0000);
assign cs1=IO_M & (Addr == 8’b0000_0001);
endmodule
module keyinput(input clock,
input reset_n,
input Read,
input cs,
input [7:0] key,
output reg [7:0] Key2cpu
);
always @(posedge clock,negedge reset_n)
if( ~reset_n) Key2cpu <=0;
else if(cs&Read) Key2cpu <=key;
endmodule
module ledoutput(input clock,
input reset_n,
input Write,
input cs,
input [7:0] DBout,
output reg [7:0] LED);
always @(posedge clock,negedge reset_n)
if( ~reset_n) LED<=0;
else if(cs&Write) LED <=DBout;
endmodule
译码器完成输入和输出的片选,译码器上的CS0接输出设备,CS1接输入设备。
7、主实验箱:主实验箱上,输入设备采用8个拨位开关,输出设备采用8个 LED 指示灯。

四、系统结构设计
本节给出8位微型计算机的系统结构和总体设计思路:本课程设计要求完成一款字长是8位的微型计算机的设计,该微型计算机的中央处理器CPU寄存器中,开放给程序员使用的寄存器有累加器AC、基址寄存器BR、计数寄存器CR和堆栈指针寄存器SP。该CPU的指令集采用变长指令字结构,分为单字节指令和双字节指令两类。该微型计算机的外设和存储器采用独立编址的方法进行设计,存储器总容量是256字节,地址是0255;外设地址范围0255,CPU 访问的是存储器还是IO_M,设备由IO_M决定,当IO_M=0时访问的是存储器,当IO_M=1时访问外部设备。本课程设计要求设计一个输入设备和一个输出设备,地址分别是1和0,地址译码器1和地址译码器;完成输出设备和输入设备的片选。主实验箱上,输入设备采用8个拨位开关,输出设备采用8个LED指示灯。

五、系统详细设计
在前一节系统结构设计的基础上,本节重点描述数据通路、控制器等几个模块的设计和实现的细节。
数据通路:
module datapath(input clk,input reset_n,
input MARLD,
input [7:0] MEM2CPU,
……
……
output [7:0] DBout,
);
wire [7:0] IB,MDRdata,PCdata,SPdata,ACdata,BRdata,CRdata,
aluresult;
wire[3:0] aluresult2; //4位
//九个寄存器
flipflop_with_reset_en_inc#(8)PC(clk,reset_n,PCLD,PCINC,1’b0,IB,PCdat);
flipflop_with_reset_en_inc#(8)SP(clk,reset_n,SPLD,SPINC ,SPDEC,IB,SPd);
……
……
//1个ALU
ALU ALU1(ACdata,IB[7:0],ALUsel[3:0],aluresult,aluresult2[3],
aluresult2[2],aluresult2[1],aluresult2[0]);

//1个八选一多路开关
MUX8_1 MUX1(MEM2CPU,Key2CPU,MDRdata,PCdata,SPdata,ACdata,
BRdata,CRdata,MDRbus,PCbus,SPbus,ACbus,BRbus,CRbus,IO_M,Read,IB;
assign DBout = Write ? IB : 8’b0000_0000;
endmodule

//寄存器实现
module flipflop_with_reset_en_inc #(parameter WIDTH = 8)(
input clk,reset_n,
input LD, INC, DEC,
input [WIDTH-1:0] DIN,
output reg [WIDTH-1:0] DOUT);
always @(posedge clk,negedge reset_n)
if(~reset_n) DOUT<=0;
else if(LD) DOUT<=DIN;
else if(INC) DOUT<=DOUT+1’b1;
else if(DEC) DOUT<=DOUT-1’b1;
endmodule

//ALU实现
module ALU(
input [7:0]A,B,
input [3:0] ALUsel,
output reg [7:0] result,
output reg CF,
……
……
assign SF = result[7];
assign ZF = (result == 0);
endmodule

//八选一多路开关实现
module MUX8_1(input[7:0] MEM2CPU,KEY2CPU,MDR,PC,SP,AC,BR,
CR,
input MDRbus,PCbus,SPbus,ACbus,BRbus,CRbus,IO_M,Read,
output [7:0] OUT);
assign OUT=MDRbus?MDR:(PCbus?PC:(SPbus?SP:(ACbus?AC:(BRbus?BR
:(CRbus?CR:(Read?(IO_M?KEY2CPU:MEM2CPU):8’b0000_0000))))));
endmodule

控制器:
module controller(input clk, input reset_n, //时钟和复位输入信号
input [3:0] PSWwire,
input [7:0] IRwire,
output MARLD, //输出以下信号
output MDRLD,
……
……
output IO_M);

//所有状态的状态编码,使用状态常量便于阅读和代码编写
parameter S0_Reset = 8’d0;
parameter S1_Fetch1 = 8’d1;
……
……
//指令码字段常量
parameter IR_LD = 8’h00;
parameter IR_ST = 8’h01;
parameter IR_PUSH_AC = 8’h02;
//状态寄存器定义和描述
reg [7:0] state;
reg [7:0] nextstate; //次态
//状态寄存器和状态更新
always @(posedge clk,negedge reset_n)
if (~reset_n) state <= S0_Reset;
else state <= nextstate;
//次态生成组合逻辑电路
always @(*)
case (state)
S0_Reset: nextstate = S1_Fetch1;
S1_Fetch1: nextstate = S2_Fetch2;
S2_Fetch2: nextstate = S3_Fetch3;
S3_Fetch3:
begin
if (IRwire[7:0]==IR_LD ) nextstate = S4_LD1;
else if(IRwire[7:0]IR_ST ) nextstate = S9_ST1;
……
……
else nextstate = S0_Reset;
end
S4_LD1: nextstate = S5_LD2;
S5_LD2: nextstate = S6_LD3;
S6_LD3:nextstate=S7_LD4;
……
……
//输出组合逻辑电路
assign MARLD =(state
S1_Fetch1)……
assign MDRLD=……
……
……

六、功能测试
本节测试本文设计的8位的微型计算机验证输出设备,验证输入输出设备,验证运算指令。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值