zoukankan      html  css  js  c++  java
  • 基于模型机的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

     

  • 相关阅读:
    ckeditor添加自定义按钮整合swfupload实现批量上传图片
    H5移动端适配之px转vw(附工具)
    原生js实现复制文本到粘贴板
    快速删除项目中的输出日志console.log
    toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算
    __defineGetter__和__defineSetter__在日期中的应用
    观察者模式(订阅-发布者模式)
    原生js扫雷代码
    身份证验证思路及代码
    IMEI校验思路及代码
  • 原文地址:https://www.cnblogs.com/Karma-wjc/p/4150959.html
Copyright © 2011-2022 走看看