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上升沿到来前的第二个周期拉高,功能正确。