码迷,mamicode.com
首页 > 其他好文 > 详细

Verilog MIPS32 CPU(六)-- MDU

时间:2017-10-01 11:11:55      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:page   pos   sig   signed   gen   list   blog   nbsp   file   

 

 

module MDU(
        input clk,rst,
        input [2:0] mdu,
        input [31:0] rdata1,rdata2,
        output [63:0] mul_out,
        output reg pc_ena,
        output reg [31:0] hi,lo);
    
    wire div_start,divu_start,div_busy,divu_busy,div_over,divu_over;
    wire [63:0] mult_out,multu_out,div_out,divu_out;
    
    assign    mul_out    =    mult_out;
    /*
        1    mult
        2    multu
        3    div    
        4    divu
        5    mthi
        6    mtlo
    */
    //assign pc_ena=1‘b1;
    
    always@(*)begin
        case(mdu)
            3h3:    pc_ena    =    div_over ||mdu!=3h3;
            3h4:    pc_ena    =    divu_over||mdu!=3h4;
            default:pc_ena    =    1b1;
        endcase
    end
    
    assign    div_start    =    mdu==3h3&&!div_busy;
    assign    divu_start    =    mdu==3h4&&!divu_busy;
    
    always@(posedge clk or posedge rst)begin
        if(rst) begin
            hi<=32b0;
            lo<=32b0;
        end
        else begin
            case(mdu)
                3h1:    {hi,lo}    <=    mult_out;
                3h2:    {hi,lo}    <=    multu_out;
                3h3:    {lo,hi}    <=    div_out;
                3h4:    {lo,hi}    <=    divu_out;
                3h5:    hi         <=    rdata1;
                3h6:    lo        <=    rdata1;
            endcase
        end 
    end
    mult_gen_0 multiplier(
        .A(rdata1),
        .B(rdata2),
        .P(mult_out));
    
    mult_gen_1 multiplier_unsigned(
        .A(rdata1),
        .B(rdata2),
        .P(multu_out));
    
    DIV DIV(
        .dividend(rdata1),
        .divisor(rdata2),
        .clock(clk),
        .reset(mdu!=3h3),
        .start(div_start),
        .q(div_out[63:32]),
        .r(div_out[31:0]),
        .over(div_over),
        .busy(div_busy));
    
    DIVU DIVU(
        .dividend(rdata1),
        .divisor(rdata2),
        .clock(clk),
        .reset(mdu!=3h4),
        .start(divu_start),
        .q(divu_out[63:32]),
        .r(divu_out[31:0]),
        .over(divu_over),
        .busy(divu_busy));
endmodule

 

Verilog MIPS32 CPU(六)-- MDU

标签:page   pos   sig   signed   gen   list   blog   nbsp   file   

原文地址:http://www.cnblogs.com/liutianchen/p/7616757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!