题解 | #移位运算与乘法#

移位运算与乘法

http://www.nowcoder.com/practice/1dd22852bcac42ce8f781737f84a3272

`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
//保证移位的乘法是基于第一个时钟周期,加一个寄存器,对输入寄存
//input_grant在每次第一次相乘时,被赋值1    
    //写在一个always里
   reg [1:0] count;//状态机计数;FSM
    reg [10:0] d_reg;
    always@(posedge clk&nbs***bsp;negedge rst)
        if(!rst) begin
            count<=2'b0;
            input_grant<=1'b0;
            out<=1'b0;
            d_reg<=11'b0;
        end
        else begin
            count<=count+1'b1;
            case(count)
                2'b00:begin
                    d_reg<=d;
                    input_grant<=1'b1;
                    out<=d;
                end
                2'b01:begin
                    input_grant<=1'b0;
                    out<=(d_reg<<2)-d_reg;
                end
                2'b10:begin
                    input_grant<=1'b0;
                    out<=(d_reg<<3)-d_reg;
                end
                2'b11:begin
                    input_grant<=1'b0;
                    out<=d_reg<<3;
                end    
                default : begin
                    out <= d;
                    input_grant <= 1'b0;
                end   
            endcase
        end
    //写在两个always块中
  /*      reg [1:0] count;    // 0 1 2 3
       always @ (posedge clk&nbs***bsp;negedge rst)
        begin
            if(~rst) begin
                count <= 2'b0;
            end
            else begin
                count <= count + 1'b1;
            end
        end

    // FSM
    reg [10:0] d_reg;
        always @ (posedge clk&nbs***bsp;negedge rst)
        begin
            if(~rst) begin
                out <= 11'b0;
                input_grant <= 1'b0;
                d_reg <= 11'b0;
            end
            else begin
                case( count )
                    2'b00 : begin
                        out <= d;
                        d_reg <= d;
                        input_grant <= 1'b1;
                    end
                    2'b01 : begin
                        //out <= d_reg + {d_reg, 1'b0};    // *1 + *2
                        out <= (d_reg<<2)-d_reg;    // *1 + *2
                        input_grant <= 1'b0;
                    end
                    2'b10 : begin
                        //out <= d_reg + {d_reg, 1'b0} + {d_reg, 2'b0};
                        out <= (d_reg<<3)-d_reg;    // *1 + *2
                        input_grant <= 1'b0;
                    end
                    2'b11 : begin
                        //out <= {d_reg, 3'b0};
                        out <= d_reg<<3;
                        input_grant <= 1'b0;
                    end
                    default : begin
                        out <= d;
                        input_grant <= 1'b0;
                    end
                endcase
            end
        end */

//*************code***********//
endmodule

全部评论

相关推荐

运营你豪哥:1.模板换一个,现在的模板基础信息加个照片已经占了30%的空间。 2.实习经历的描述,按时间倒序标注清楚,选2-3段和你求职意向契合的经历填写。 3.自我评价再改改,要不就删了;怎么感觉自我评价是在介绍你专业的培养体系,看不出重点要突出什么。
听劝,这个简历怎么改
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务