CPU 寄存器组的设计建议用文本输入方式设计。
寄存器组中包括 4 个 8 位通用寄存器(R0~R3) 和 1 个 8 位专用寄存器 PC。8 位通用寄存器只有读/写功能。8 位专用寄存器 PC 具有预置、加一、减一和清零功能。通用寄存器组和 PC 的控制信号是独立的,这样便于实现并行处理。 程序计数器 PC 的清零操作由复位信号 RST 单独控制。
4 个通用寄存器 R0~R3 的选择通过信号 RA1 和 RA0 控制,由 Wt 和 Rd 分别控制寄存器的读写操作。 PC 寄存器的清零、预置、加一、减一计数均采用同步方式。清零(reset)信号为低电平有 效,计数脉冲(clk)为下降沿有效。M 控制 PC 置数、加一计数、减一计数等不同操作。8 位 PC 寄存器的输出在两个个七段数码管显示,4 个通用寄存器组的输出在另外两个七段数码管显示示。
八位通用寄存器组操作控制方式图
寄存器组结构框图
一、实验分析与设计
CPU寄存器组包括通用寄存器组R0~R3和专用寄存器PC。
通用寄存器由信号RA1、RA0控制选择,由信号Wt、Rd控制读写。当Wr = 0 且 Rd = 1时,写入输入值 D 到某个寄存器中。当Wr = 1 且 Rd = 0时,输出某个寄存器的值到R中,显示在数码管上。
专用寄存器由信号M控制置数、加一计数等,由信号reset控制清零。由于需要控制PC加一、减一的速度,此处将高频时钟信号clk分频为低频时钟信号clk1控制PC加减。
通过SEL控制,动态扫描,将PC的值和R的值译码后显示在四个七段数码管上。
二、程序代码
module sy5(clk,D,M,RESET,RA,Wr,Rd,SEL,code);
input clk;
input [7:0]D;
input [1:0]M;
input RESET;
input [1:0]RA;
input Wr,Rd;
output reg[7:0]code = 8'h00;
output reg[2:0]SEL = 3'b000;
reg [7:0] R = 8'd0,R0,R1,R2,R3;
reg [7:0] PC = 8'd0;
//通用寄存器组写入读出
always@(RA,Wr,Rd)
begin
if(!Wr & Rd) //写入
begin
case(RA)
2'b00 : R0 = D;
2'b01 : R1 = D;
2'b10 : R2 = D;
2'b11 : R3 = D;
endcase
end
else if(Wr & !Rd) //读出
begin
case(RA)
2'b00 : R = R0;
2'b01 : R = R1;
2'b10 : R = R2;
2'b11 : R = R3;
endcase
end
end
//分频器,控制PC加一、减一速度
reg clk1 = 0;
integer k = 0;
always@(posedge clk)
begin
if(k < 1000) k = k + 1;
else
begin
k = 0;
clk1 = ~clk1;
end
end
//PC部分
always@(negedge clk1)
begin
if(!RESET) PC = 8'd0;
else
begin
case(M)
2'b00 : PC = PC; //维持不变
2'b01 : PC = PC + 1'b1; //加一计数
2'b10 : PC = PC - 1'b1; //减一计数
2'b11 : PC = D; //PC置数
endcase
end
end
//显示部分
reg[3:0] Data;
always@(posedge clk)
begin
if(SEL < 3'b011) SEL = SEL + 1;
else SEL = 3'b000;
end
//SEL动态扫描
always@(SEL)
begin
case(SEL)
3'b000 : Data = PC[7:4];
3'b001 : Data = PC[3:0];
3'b010 : Data = R[7:4];
3'b011 : Data = R[3:0];
endcase
end
//译码
always @(Data)
begin
case(Data)
4'd0 : code = 8'h3f;
4'd1 : code = 8'h06;
4'd2 : code = 8'h5b;
4'd3 : code = 8'h4f;
4'd4 : code = 8'h66;
4'd5 : code = 8'h6d;
4'd6 : code = 8'h7d;
4'd7 : code = 8'h07;
4'd8 : code = 8'h7f;
4'd9 : code = 8'h6f;
4'd10: code = 8'h77;
4'd11: code = 8'h7c;
4'd12: code = 8'h39;
4'd13: code = 8'h5e;
4'd14: code = 8'h79;
4'd15: code = 8'h71;
default : code = 8'h00;
endcase
end
endmodule
三、ModelSim仿真
Test Bench
`timescale 1 ps/ 1 ps
module sy5_vlg_tst();
reg [7:0] D;
reg [1:0] M;
reg [1:0] RA;
reg RESET;
reg Rd;
reg Wr;
reg clk;
// wires
wire [2:0] SEL;
wire [7:0] code;
sy5 i1 (
.D(D),
.M(M),
.RA(RA),
.RESET(RESET),
.Rd(Rd),
.SEL(SEL),
.Wr(Wr),
.clk(clk),
.code(code)
);
initial
begin
clk = 0;
RESET = 1;
M = 2'b00;
Wr = 0;
Rd = 1;
//写入
D = 8'b00000001;
RA = 2'b00;
#10
D = 8'b00000010;
RA = 2'b01;
#10
D = 8'b00000100;
RA = 2'b10;
#10
D = 8'b00001000;
RA = 2'b11;
//读出
#20
Wr = 1;
Rd = 0;
RA = 2'b00;
#80
RA = 2'b01;
#80
RA = 2'b10;
#80
RA = 2'b11;
//PC
#30000
M = 2'b01;
#20000
M = 2'b00;
#20000
M = 2'b10;
#20000
M = 2'b00;
#20000
M = 2'b11;
#20000
RESET = 0;
$display("Running testbench");
end
always #10 clk = ~clk;
endmodule
波形图
通用寄存器的写入读出:R0 = 00000001; R1 = 00000010; R2 = 00000100; R3 = 00001000;
PC寄存器的加一(00000001)、减一(00000000)、置数(00001000)、清零(00000000)