Verilog HDL语言实现的单周期CPU设计(全部代码及其注释)

本文详细介绍了使用Verilog HDL语言设计的单周期CPU,包括移位器、指令存储器、数据存储器、控制器译码模块等关键部分的工作原理和代码实现。同时,讲解了如何通过各种选择器、寄存器和运算逻辑单元来完成数据的读写和运算操作。
摘要由CSDN通过智能技术生成

 写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!

本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/9289857.html

 

 

(1)shift:

module shift (d,sa,right,arith,sh);
input  [31:0]  d;
input  [4:0]     sa;
input  right,arith;
output [31:0] sh;
reg  [31:0] sh;
always  @*  begin
    if   (!right)  begin                        //shift left
        sh = d << sa;
    end else  if   (!arith)  begin              //shift right logical
        sh =  d  >>  sa;
    end else begin                              //shift right arithmetic
        sh =  $signed(d)  >>>  sa;
    end
end
endmodule

移位器,<<表示向左移,>>表示向右移,>>>表示无符号向右移,sa表示向右移的位数。因为做多移动32位,所以sa用5位寄存器表示。

 

图一

 

(2)scinstmem(图一左边蓝圈):

module scinstmem (a,inst); 
    input [31:0] a; 
    output [31:0] inst; 
    wire [31:0] rom [0:31];
    assign    rom[5'h00] = 32'h3c010000;    //    (00)    main: lui r1,0
    assign    rom[5'h01] = 32'h34240050;    //    (04)        ori r4,r1,80
    assign    rom[5'h02] = 32'h20050004;    //    (08)        addi r5,r0, 4
    assign    rom[5'h03] = 32'h0c000018;    //    (0c)    call: jal sum
    assign    rom[5'h04] = 32'hac820000;    //    (10)        sw r2,0(r4)
    assign    rom[5'h05] = 32'h8c890000;    //    (14)        lw    r9,    0(r4)
    assign    rom[5'h06] = 32'h01244022;    //    (18)        sub    r8,    r9.    r4
    assign    rom[5'h07] = 32'h20050003;    //    (lc)        addi    r5,    r0.    3
    assign    rom[5'h08] = 32'h20a5ffff;    //    (20)    loop2:    addi    r5,    r5,    -1
    assign    rom[5'h09] = 32'h34a8ffff;    //    (24)        ori    r8,    r5,    0xffff
    assign    rom[5'h0A] = 32'h39085555;    //    (28)        xori    r8.    r8,    0x5555
    assign    rom[5'h0B] = 32'h2009ffff;    //    (2c)        addi    r9,    rO,    -1
    assign    rom[5'h0C] = 32'h312affff;    //    (30)        andi    rlO,    r9,    0xffff
    assign    rom[5'h0D] = 32'h01493025;    //    (34)        or    r6.    rlO,    r9
    assign    rom[5'h0E] = 32'h01494026;    //    (38)        xor    r8,    rlO,    r9
    assign    rom[5'h0F] = 32'h01463824;    //    (3c)        and    r7,    rlO,    r6
    assign    rom[5'h10] = 32'h10a00001;    //    (40)        beq    r5,    r0,    shift
    assign    rom[5'h11] = 32'h08000008;    //    (44)        j    loop2    
    assign    rom[5'h12] = 32'h2005ffff;    //    (48)    shift:    addi    r5.    r0,    -1
    assign    rom[5'h13] = 32'h000543c0;    //    (4c)        sll    r8.    r5.    15
    assign    rom[5'h14] = 32'h00084400;    //    (50)        sll    r8,    r8,    16
    assign    rom[5'h15] = 32'h00084403;    //    (54)        sra    r8,    r8,    16
    assign    rom[5'h16] = 32'h000843c2;    //    (58)        srl    r8.    r8.    15
    assign    rom[5'h17] = 32'h08000017;    //    (5c)    finish:    j    finish    
    assign    rom[5'h18] = 32'h00004020;    //    (60)    sum:    add    r8,    r0,    r0
    assign    rom[5'h19] = 32'h8c890000;    //    (64)    loop:    lw    r9,    (r4)
    assign    rom[5'h1A] = 32'h20840004;    //    (68)        addi    r4,    r4,    4
    a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值