基于模型机的Micro cpu设计

第一章    模型机基本结构

由功能分析, 本次组成原理实验中设计的模型机包含下面这些部件:算术逻辑运算部件(ALU)、程序计数器(PC)、指令寄存器(IR)、存储器(RAM)、时序和微程序控制部件。模型机的数据通路为单总线结构,总线宽度为8位。

第二章    设计思想

1、基于状态机的模型机

如图1所示,整体模型机的设计采用了状态机的思想,将cpu的取指令、指令译码、指令执行所对应的操作拆分到各个状态中,并由此设计模型机的微操作。

图1 - 时钟控制信号状态机模型示意图

2、周期、节拍、脉冲制

如图2所示,模型机的控制信号采用周期-节拍-脉冲制,机器周期由七个时钟节拍完成,且每个时钟节拍有两个打入脉冲clk进行驱动。

图2 - 时序、控制信号设计图

时序控制信号设计图中外部输入时钟为clk,本次模型机试验中将其与按键KEY[1]绑定作为模型机的时钟输入,整个设计图中的信号分别由时钟上升沿驱动控制,如clk_ctl、clk_pc、clk_ram、clk_ir、clk_alu,以及电平触发控制,如pc_inc、pc_out、ram_we、ram_rd、ir_in、ir_out、alu_in、alu_out组成。为满足时序电路的最小时序原则,在设计中电平变化时钟比时钟变化提前半个节拍一保证数据的正常传输。

3、模型机逻辑框图

如图3所示,模型机采用单总线的数据通路设计,模型机的整体结构分为:指令寄存器(pc)、程序寄存器(ir)、微程序控制器、算数运算单元(ALU)、时钟发生器、存储器(RAM),将各个部件按照图3所示分别连接到总线(BUS),内部数据通路流动方向如图所示,且部件中加入了寄存器和三态门的设计,因此可直接与总线相连。

图3 - 模型机逻辑框图

4、代码段数据段分离

模型机采用程序存储原理,如图4所示将代码段和数据段分离,在RAM中进行分段存储,便于指令的执行和数据的读取。

图4 – 内存存储示意图

5、指令格式

模型机总线宽度为8位,故模型机指令格式的设计为16位:高8位为指令操作码,分别为HLT、ADD、SUB、MUL、DIV;低8位为操作数在内存中的地址,采用单地址指令格式,下一字节即为双操作数中的第二操作数在内存中的地址。

图5 – 指令格式

6、顶层设计文件

如图6所示,模型机的顶层设计文件由以下几个部件构成:my_pc、my_clk、my_ram、my_ctl、my_ir、my_alu,且内部加入了寄存器和三态门,因此可以直接与总线相连,并通过控制信号控制各个部件之间的数据流动。

图6 - Micro Cpu顶层文件设计图

第三章 部分代码

整个工程代码我已上传至csdn-->基于模型机的Micro cpu设计

下载链接:http://download.csdn.net/detail/karma_w/8235475

1、存储器(RAM)

 1 module my_ram
 2 #(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=8)
 3 (
 4     input clk,we,rd,
 5     input [(DATA_WIDTH-1):0] data,
 6     input [(ADDR_WIDTH-1):0] addr,
 7     output [(DATA_WIDTH-1):0] q
 8 );
 9
10     // Declare the RAM variable
11     reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];
12     reg state;
13
14     // Variable to hold the registered read address
15     reg [ADDR_WIDTH-1:0] addr_reg;
16     initial
17         begin
18             ram[1] <= 8‘b0000_0010;
19             ram[2] <= 8‘b0000_1000;
20             ram[8] <= 8‘b0000_0010;
21             ram[9] <= 8‘b0000_0100;
22         end
23     always @ (posedge clk)
24     begin
25         case (state)
26         1‘b0 : if(we)
27                    begin
28                     addr_reg <= addr;
29                     state <= 1;
30                    end
31                 else
32                     state <= 0;
33         1‘b1 :  begin
34                  addr_reg <= addr_reg + 1;
35                  state <= 0;
36                 end
37
38         default: state <= 0;
39         endcase
40     end
41
42     // Continuous assignment implies read returns NEW data.
43     // This is the natural behavior of the TriMatrix memory
44     // blocks in Single Port mode.
45     assign q = (rd)?ram[addr_reg]:8‘bz;
46
47 endmodule

2、逻辑运算器(ALU)

 1 module my_alu
 2 (
 3     input rst,clk,we,rd,
 4     input [2:0] opcode,
 5     input [7:0] alu_a,alu_b,
 6     output [7:0] alu_out
 7 );
 8
 9 reg [7:0] alu_reg,alu_ac,alu_dr;
10 reg [1:0] state;
11
12 assign alu_out = rd?alu_reg:8‘bzzzz_zzzz;
13
14 always @(posedge clk or negedge rst)
15     if(!rst)
16     begin
17         alu_ac <= 0;
18         alu_dr <= 0;
19         alu_reg <= 0;
20         state <= 0;
21     end
22     else if(we)
23             case (state)
24             2‘b00 : begin
25                         alu_ac <= alu_a;
26                         state <= 01;
27                     end
28             2‘b01 : begin
29                         alu_dr <= alu_b;
30                         state <= 10;
31                     end
32             2‘b10 : begin
33                         case (opcode)
34                             3‘b000 : alu_reg<=alu_ac & alu_dr;        //ANDD
35                             3‘b001 : alu_reg<=alu_ac ^ alu_dr;        //XORR
36                             3‘b010 : alu_reg<=alu_ac + alu_dr;        //ADD
37                             3‘b011 : alu_reg<=alu_ac - alu_dr;        //SUB
38                             3‘b100 : alu_reg<=alu_ac * alu_dr;        //MUL
39                             3‘b101 : alu_reg<=alu_ac / alu_dr;        //DIV
40                             default:alu_reg<=8‘b0;
41                         endcase
42                         state <= 00;
43                     end
44             default : state <= 00;
45             endcase
46     else
47         state <= 00;
48 endmodule

3、时序控制部件(CLK)

  1 module my_clk
  2 (
  3     input rst,clk,
  4     output clk_ctl,
  5     output reg clk_pc,clk_ir,clk_ram,clk_alu
  6 );
  7     reg [3:0] state;
  8
  9     assign clk_ctl = ~clk;            //clk_ctl-->clk_flip
 10     always @(posedge clk or negedge rst)
 11         if(!rst)
 12             begin
 13                 clk_pc <= 0;
 14                 clk_ir <= 0;
 15                 clk_ram <= 0;
 16                 clk_alu <= 0;
 17                 state <= 0;
 18             end
 19         else
 20             case (state)
 21             4‘b0000 : begin
 22                     clk_pc <= clk_pc;
 23                     clk_ir <= clk_ir;
 24                     clk_ram <= clk_ram;
 25                     clk_alu <= clk_alu;
 26                     state <= 4‘b0001;
 27                 end
 28             4‘b0001 : begin
 29                     clk_pc <= clk_pc;
 30                     clk_ir <= clk_ir;
 31                     clk_ram <= ~clk_ram;
 32                     clk_alu <= clk_alu;
 33                     state <= 4‘b0010;
 34                 end
 35             4‘b0010 : begin
 36                     clk_pc <= clk_pc;
 37                     clk_ir <= clk_ir;
 38                     clk_ram <= ~clk_ram;
 39                     clk_alu <= clk_alu;
 40                     state <= 4‘b0011;
 41                 end
 42             4‘b0011 : begin
 43                     clk_pc <= clk_pc;
 44                     clk_ir <= ~clk_ir;
 45                     clk_ram <= clk_ram;
 46                     clk_alu <= clk_alu;
 47                     state <= 4‘b0100;
 48                 end
 49             4‘b0100 : begin
 50                     clk_pc <= clk_pc;
 51                     clk_ir <= ~clk_ir;
 52                     clk_ram <= ~clk_ram;
 53                     clk_alu <= clk_alu;
 54                     state <= 4‘b0101;
 55                 end
 56             4‘b0101 : begin
 57                     clk_pc <= clk_pc;
 58                     clk_ir <= ~clk_ir;
 59                     clk_ram <= ~clk_ram;
 60                     clk_alu <= clk_alu;
 61                     state <= 4‘b0110;
 62                 end
 63             4‘b0110 : begin
 64                     clk_pc <= clk_pc;
 65                     clk_ir <= ~clk_ir;
 66                     clk_ram <= clk_ram;
 67                     clk_alu <= clk_alu;
 68                     state <= 4‘b0111;
 69                 end
 70             4‘b0111 : begin
 71                     clk_pc <= ~clk_pc;
 72                     clk_ir <= clk_ir;
 73                     clk_ram <= ~clk_ram;
 74                     clk_alu <= clk_alu;
 75                     state <= 4‘b1000;
 76                 end
 77             4‘b1000 : begin
 78                     clk_pc <= ~clk_pc;
 79                     clk_ir <= clk_ir;
 80                     clk_ram <= ~clk_ram;
 81                     clk_alu <= clk_alu;
 82                     state <= 4‘b1001;
 83                 end
 84             4‘b1001 : begin
 85                     clk_pc <= clk_pc;
 86                     clk_ir <= clk_ir;
 87                     clk_ram <= clk_ram;
 88                     clk_alu <= ~clk_alu;
 89                     state <= 4‘b1010;
 90                 end
 91             4‘b1010 : begin
 92                     clk_pc <= clk_pc;
 93                     clk_ir <= clk_ir;
 94                     clk_ram <= ~clk_ram;
 95                     clk_alu <= ~clk_alu;
 96                     state <= 4‘b1011;
 97                 end
 98             4‘b1011 : begin
 99                     clk_pc <= clk_pc;
100                     clk_ir <= clk_ir;
101                     clk_ram <= ~clk_ram;
102                     clk_alu <= ~clk_alu;
103                     state <= 4‘b1100;
104                 end
105             4‘b1100 : begin
106                     clk_pc <= clk_pc;
107                     clk_ir <= clk_ir;
108                     clk_ram <= clk_ram;
109                     clk_alu <= ~clk_alu;
110                     state <= 4‘b1101;
111                 end
112             4‘b1101 : begin
113                     clk_pc <= clk_pc;
114                     clk_ir <= clk_ir;
115                     clk_ram <= clk_ram;
116                     clk_alu <= ~clk_alu;
117                     state <= 4‘b1110;
118                 end
119             4‘b1110 : begin
120                     clk_pc <= clk_pc;
121                     clk_ir <= clk_ir;
122                     clk_ram <= clk_ram;
123                     clk_alu <= ~clk_alu;
124                     state <= 4‘b0000;
125                 end
126             default : state <= 0;
127             endcase
128 endmodule
时间: 2024-10-14 14:00:40

基于模型机的Micro cpu设计的相关文章

基于状态机的简易RISC CPU设计

目录 一.什么是CPU? 二.RISC CPU结构 1.时钟发生器 2.指令寄存器 3.累加器 4.RISC CPU算术逻辑运算单元 5.数据控制器 6.状态控制器 7.程序计数器 8.地址多路器 9.外围模块 10.地址译码器 a.RAM b.ROM 三.RISC CPU中各部件的相互连接关系 四.RISC CPU和它的外围电路 五.RISC CPU的寻址方式和指令系统 六.RISC CPU的操作和时序 正文 一.什么是CPU? CPU 即中央处理单元的英文缩写,它是计算机的核心部件.计算机进

简单CPU设计实践

目录 开始前的话. 3 总体组成. 3 运算器. 3 补码... 3 算术单元... 4 逻辑单元... 5 算术逻辑单元... 6 移位器... 7 运算器综合... 8 溢出判断... 9 运算器设计的总结和补充... 11 寄存器组. 11 注意事项... 11 使能端... 12 构建寄存器组... 12 控制器. 13 程序计数器... 14 指令寄存器... 14 数据通路设计... 14 控制字... 15 指令译码器... 16 状态寄存器... 18 控制器综合... 18 C

基于JAVA的邮件客户端的设计和实现

获取项目源文件,技术交流与指导联系Q:1225467431 摘  要 Java是Sun Microsystem公司推出的新一代面向对象和面向网络的程序设计语言,特别适合于Internet/Intranet上的应用软件开发,因此也把Java语言称为新一代网络程序设计语言.Java语言将面向对象.多线程.安全和网络等特征集于一身,为软件开发人员提供了很好的程序设计环境,当今企业级计算和应用中相当成熟和稳定的平台,在这个领域中不可否认地占据着领导地位.JBuilder是Borland公司推出的Java

基于Linux的智能家居的设计(2)

1  系统整体设计方案 智能家居系统的是一个实时查询家庭的温湿度.照明控制.自己主动控制的设定.集家庭娱乐.智能安防为一体,大量数据快处理.可靠的系统,因此在硬件和软件上都有非常大的要求,因此在这里进行了多方面的考虑有下面两个实现方案: 方案一:利用STM32单片机作为手持终端的控制器,使用按键和12864液晶屏作为人机交互的接口.利用51单片机作为房子内部的电灯.空调.门禁等家电的控制器,利用串口实现STM32单片机和51单片机作为传输数据的通道.这个能够实现.可是.机械按键和12864在智能

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器

基于Linux的智能家居的设计(1)

写在前面:做了半年的毕业设计,找到的工作与这个完全无关,发现自己现在有写不甘心,但是我还是在关注这方面的发展,自己的摸索和前人的帮助我完成了智能家居的一部分,希望这个能够给一些初学者 能够一些便利,毕竟技术是一个开放的,不属于某一个人的. 摘要 本课题主要目的是设计和实现一个基于Linux开发平台的智能家居系统.本系统主要使用PVC板做成的家居模型.本系统硬件使用基于ARM架构的samsung S3C6410芯片做成的OK6410开发板为手持终端,利用Zigbee实现网络通讯,并结合各种电子元器

cpu设计--&gt;cpu指令设计与全程逻辑分析

CPU指令设计,除了命名之外,更重要的是分析出指令如何才能够实现.对于图 3 1的CPU结构,如果指令是预先放到irom里的,那么,指令执行时要一条一条地从irom取出来,放到ir指令寄存器中,提供给control进行分析执行.每一条指令如何转变成机器动作,CPU的设计者必须认真地进行分析和规划.这一过程叫指令全程动作分析,简称指令全程分析. 我们针对图 3-1的结构,可以尝试设计一些用符号表示的汇编指令,然后对这些汇编指令如何实现,进行细致地分析.汇编指令的二进制数表示就是机器指令.汇编指令和

基于Linux的智能家居的设计(3)

2  硬件设计 本课题的硬件设计包括主控制器.数据传输设计.数据采集设计.控制驱动设计.显示设计,门禁设计. 2.1  主控制器 根据方案三选择S3C6410主控芯片,S3C6410是由Samsung公司推出的一款低功耗.高性价比的RSIC处理器 ,基于ARM11内核,内置强大的硬件加速,显示处理和缩放,运动视频处理,音频处理[9].这个作为智能家居的处理器是不二之选,硬件性能上完全可以实现.本设计选用的基于S3C6410的OK6410开发板.开发板上拥有如下特征[10]: (1)  12MHz

基于ZigBee的家居控制系统的设计与应用

基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通信技术等将家居中的各种电子电气设备连接起来,统一管理.远程监控和资源共享,实现了高效.便利的生活环境.近些年互联网的迅猛发展,网络的稳定性.安全性和网络带宽都有了长足的发展,由互联网提供的各种服务已经深入到人们生活的方方面面,因此将智能家居系统同互联网结合起来,为用户提供远程控制服务,延伸智能家居系