单周期CPU设计(二)取指模块(minisys)(verilog)(vivado)

复制代码
`timescale 1ns / 1ps
//
module Ifetc32 (
	input			reset,				// 复位信号(高电平有效)
    input			clock,				// 时钟(23MHz)
	output	[31:0]	Instruction,		// 输出指令到其他模块
    output	[31:0]	PC_plus_4_out,		// (pc+4)送执行单元
    input	[31:0]	Add_result,			// 来自执行单元,算出的跳转地址
    input	[31:0]	Read_data_1,		// 来自译码单元,jr指令用的地址
    input			Branch,				// 来自控制单元
    input			nBranch,			// 来自控制单元
    input			Jmp,				// 来自控制单元
    input			Jal,				// 来自控制单元
    input			Jrn,				// 来自控制单元
    input			Zero,				// 来自执行单元
    output	[31:0]	opcplus4,			// JAL指令专用的PC+4
    // ROM Pinouts
	output	[13:0]	rom_adr_o,			// 给程序ROM单元的取指地址
	input	[31:0]	Jpadr				// 从程序ROM单元中获取的指令
);
    
    wire [31:0] PC_plus_4;
    reg [31:0] PC;
    reg [31:0] next_PC;		// 下条指令的PC(不一定是PC+4)
    reg [31:0] opcplus4;
    
	// ROM Pinouts
	assign rom_adr_o = PC[15:2];
	assign Instruction = Jpadr;
    

assign PC_plus_4[31:2] = PC[31:2] + 4;
assign PC_plus_4[1:0] = 2'b00;
assign PC_plus_4_out = PC_plus_4[31:0];
 

    always @* begin  // beq $n ,$m if $n=$m branch   bne if $n /=$m branch jr
    

        if (Branch && Zero) begin
            next_PC = PC + Add_result;
        end else if (nBranch && !Zero) begin
            next_PC = PC + Add_result;
        end else if (Jrn) begin
            next_PC = Read_data_1;
        end else begin
            next_PC = PC_plus_4;
        end
    end
  // 请考虑以上三条指令的判断条件,
                                // 以及三条指令的执行该给next_PC赋什么值

    
   always @(negedge clock) begin
                                    if (reset) begin
                                        PC <= 32'h00000000;
                                        opcplus4 <= 32'h00000000;
                                    end else begin
                                        PC <= next_PC;
                                        if (Jal) begin
                                            opcplus4 <= PC + 4;
                                        end else begin
                                            opcplus4 <= 32'h00000000;
                                        end
                                    end
                                end

endmodule

仿真代码如下

复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:  
// Design Name: 
// Module Name: ifetc32_sim
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ifetc32_sim ();
    // input
    reg[31:0]  Add_result = 32'h00000000;
    reg[31:0]  Read_data_1 = 32'h00000000;
    reg        Branch = 1'b0;
    reg        nBranch = 1'b0;
    reg        Jmp = 1'b0;
    reg        Jal = 1'b0;
    reg        Jrn = 1'b0;
    reg        Zero = 1'b0;
    reg        clock = 1'b0,reset = 1'b1;

    // output
    wire [31:0] Instruction;            // 输出指令
    wire [31:0] PC_plus_4_out;
    wire [31:0] opcplus4;
	wire [13:0] rom_adr;
	wire [31:0] Jpadr;
	
	Ifetc32 Uif (
		.reset			(reset),			// 复位(高电平有效)
		.clock			(clock),			// CPU时钟
		.Instruction	(Instruction),		// 输出指令到其他模块
		.PC_plus_4_out	(PC_plus_4_out),	// (pc+4)送执行单元
		.Add_result		(Add_result),		// 来自执行单元,算出的跳转地址
		.Read_data_1	(Read_data_1),		// 来自译码单元,jr指令用的地址
		.Branch			(Branch),			// 来自控制单元
		.nBranch		(nBranch),			// 来自控制单元
		.Jmp			(Jmp),				// 来自控制单元
		.Jal			(Jal),				// 来自控制单元
		.Jrn			(Jrn),				// 来自控制单元
		.Zero			(Zero),				// 来自执行单元
		.opcplus4		(opcplus4),			// JAL指令专用的PC+4
		// ROM Pinouts
		.rom_adr_o		(rom_adr),			// 给程序ROM单元的取指地址
		.Jpadr			(Jpadr)				// 从程序ROM单元中获取的指令
	);

	// 分配64KB ROM, 编译器实际只用 64KB ROM
    prgrom instmem (
        .clka	(clock),
		.wea	(0),
        .addra	(rom_adr),
		.dina	(0),
        .douta	(Jpadr)
    );
	
    initial begin
        #100   reset = 1'b0;
        #100   Jal = 1;
        #100   begin Jrn = 1;Jal = 0; Read_data_1 = 32'h0000019c;end;
        #100   begin Jrn = 0;Branch = 1'b1; Zero = 1'b1; Add_result = 32'h00000020;end;        
        #100   begin Branch = 1'b0; Zero = 1'b0; end;        
    end
    always #50 clock = ~clock;
endmodule

仿真波形图如下

相关推荐
西安景驰电子18 小时前
PCIe 授时卡原理及应用
运维·服务器·windows·单片机·嵌入式硬件·fpga开发
落chen20 小时前
基于Vivado的FIFO-IP核-强化篇
fpga开发
公众号:fuwuqiBMC1 天前
(转自“服务器BMC”)服务器BMC芯片——AST1840
运维·服务器·fpga开发
国科安芯1 天前
还是4位?ASC8T245S 与 ASC4T245S 的双向电平转换选型实战
单片机·嵌入式硬件·物联网·fpga开发·机器人·云计算
Rambo.xia2 天前
接口协议避坑 · 第5篇:多器件级联时序踩坑实录
fpga开发
紫霄芯语2 天前
观察者模式在FPGA中断系统的实战重构
观察者模式·fpga开发·重构
ARM+FPGA+AI工业主板定制专家3 天前
国产化RK3576+FPGA架构|晶圆传输机器人高速定位+AI瑕疵检测一体化方案
fpga开发·架构·机器人·嵌入式·fpga·工控·机器人运控
Eloudy4 天前
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
fpga开发
szxinmai主板定制专家4 天前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
ARM|X86+FPGA工业主板厂家5 天前
RK3588+FPGA+EtherCAT异构架构解析|工业场景如何同时保住AI算力与微秒级运动实时性
人工智能·fpga开发·架构