RISC-CPU设计(二):RISC-CPU的结构及时钟发生器的设计

1.RISC-CPU的结构

        简化的RISC-CPU由8个模块组成:

                (1)时钟发生器;

                (2)指令寄存器;

                (3)累加器;

                (4)算术逻辑运算单元;

                (5)数据控制器;

                (6)状态控制器;

                (7)程序计数器;

                (8)地址多路器。

2.时钟发生器的设计

        (1)作用:时钟发生器利用外来时钟信号clk生成一系列时钟信号:clk、fetch、alu_ena,并送往CPU的其他模块中。

        (2)模块结构图

                                

         (3)端口信号描述

                CLK、RESET为时钟信号和复位信号。CLK信号用作指令寄存器、累加器、状态控制器的时钟信号;

                FETCH为控制信号,是CLK的8分频信号。当FETCH为高电平时,使CLK能触发CPU控制器开始执行一条指令;同时FETCH信号还将控制地址多路器输出指令地址和数据地址

                 ALU_CLK则用于控制算术逻辑运算单元的操作

        (4)Verilog代码(状态机实现):

module clk_gen (
    clk     ,
    rst     ,
    fetch   ,
    alu_ena     
);
    
    parameter IDLE      =   3'b001  ;
    parameter ALU_ENA   =   3'b010  ;
    parameter FETCH     =   3'b100  ;

    input           clk, rst    ;
    output  reg     fetch       ;
    output  reg     alu_ena     ;

    reg [2: 0] state, next_state    ;
    reg [2: 0] cnt                  ;
    
    // always block 1: cnt control
    always @( posedge clk ) begin
        if ( rst ) begin
            cnt     <=  0;
            fetch   <=  0;
            alu_ena <=  0;
        end
        else begin
            if ( cnt == 3'd7 )
                cnt <= 0;
            else
                cnt <= cnt + 1;
        end
    end

    // always block 2: state jump
    always @( posedge clk ) begin
        if ( rst )
            state <= IDLE;
        else
            state <= next_state ;
    end

    // always block 3: state change condition
    always @( * ) begin
        case ( state )
            IDLE:
                next_state = ( cnt == 2 )? FETCH: 
                             ( cnt == 0 )? ALU_ENA: IDLE;
            ALU_ENA:
                next_state = IDLE;
            FETCH:
                next_state = ( cnt == 6 )? IDLE: FETCH;
            default:
                next_state = IDLE;
        endcase
    end

    // always block 4: output logic
    always @( * ) begin
        alu_ena = ( state == ALU_ENA );
        fetch   = ( state == FETCH   );
    end

endmodule

        (5)testbench

`timescale 1ns / 1ps

module clk_gen_mod_tb();

reg      clk, rst    ;
wire     fetch       ;
wire     alu_ena     ;


clk_gen u1_m(
    .clk        ( clk       )   ,
    .rst        ( rst       )   ,
    .fetch      ( fetch     )   ,
    .alu_ena    ( alu_ena   ) 
);

initial clk = 0;
always #10 clk = ~clk;

initial begin
    rst = 1;
    #201 rst = 0;
    #400;
    rst = 1;
    #200;
    rst = 0;
    #10000;
end

endmodule

        (6)仿真图

 复位后:

 fetck是clk的八分频,占空比为50%;alu_ena在fetch上升沿到来前的第二个周期拉高,功能正确。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值