题解 | 移位运算与乘法

`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
reg [1:0] cnt;
reg [10:0] d_reg;

always@(posedge clk or negedge rst)
    if (~rst) begin
        cnt <= 2'd0;
    end else begin
        cnt <= cnt + 1'b1;
    end


always@(posedge clk or negedge rst)
    if (~rst) begin
        d_reg <= 8'd0;
    end else if (cnt == 2'd0) begin
        d_reg <= d;
    end

always@(posedge clk or negedge rst)
    if (~rst) begin
        out <= 11'd0;
        input_grant <= 1'b0;
    end else begin
        case (cnt)
            2'b00:begin out <= d; input_grant <= 1'b1; end
            2'b01:begin out <= (d_reg<<2) - d_reg; input_grant <= 1'b0; end
            2'b10:begin out <= (d_reg<<3) - d_reg; input_grant <= 1'b0; end
            2'b11:begin out <= (d_reg<<3); input_grant <= 1'b0; end
            default : begin out <= 11'd0; input_grant <= 1'b0; end
        endcase
    end


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

上下两种方式,在out取值上是不一致的:思考时序逻辑和组合逻辑的差异~

`timescale 1ns/1ns
module multi_sel(
    input [7:0]d ,
    input clk,
    input rst,
    output reg input_grant,
    output reg [10:0]out
);

    // 状态定义
    parameter IDLE = 0, MULT1 = 1, MULT2 = 2, MULT3 = 3, MULT4 = 4 ;

    reg [2:0] state,next;
    reg [7:0] d_reg;
    // 状态更新逻辑
    always @(posedge clk or negedge rst) begin
        if (~rst) begin
            state <= IDLE;
        end else begin
            state <= next;
        end
    end

    always @(posedge clk or negedge rst) begin
        if (~rst) begin
            d_reg <= 0;
        end else if (next==MULT1) begin
            d_reg <= d;
        end
    end
    // 状态转移逻辑
    always @(*) begin
        case (state)
            IDLE : begin next = MULT1;input_grant = 1'b0; out = 0;                    ;end
            MULT1: begin next = MULT2;input_grant = 1'b1; out = d_reg;                ;end
            MULT2: begin next = MULT3;input_grant = 1'b0; out = (d_reg << 1) + d_reg  ;end  //3d
            MULT3: begin next = MULT4;input_grant = 1'b0; out = (d_reg << 3) - d_reg  ;end  //7d
            MULT4: begin next = MULT1 ;input_grant = 1'b0; out = (d_reg << 3)         ;end  //8d
            default: begin
                state = IDLE;
                input_grant = 1'b0;
                out = 0  ;
            end
        endcase
    end



endmodule

全部评论

相关推荐

985柜员:开发还敢还叫,全部让自测就老实了
点赞 评论 收藏
分享
压力很大,面试官全程高压,问的问题不难,但是没有任何反馈,很慌张,也无算法。实习问了20分钟,一直问我你们做的有什么用,总时长一小时1.学校都有什么课程2.spring的ioc原理以及优点3.除了解耦还知道什么?4.springboot与spring区别,二者的源码看过没?Tomcat了解嘛?有没有具体看过5.spring的bean,面试官一直在重复一个思想问我懂不懂,完全没听过6.mybatis是干什么的?ibatis用过没?平常怎么写SQL?完全不写嘛?7.设计一个分布式双十一秒杀系统(前端,网关,缓存,数据库防超卖全设计)8.怎么做限流9.缓存与数据库一致性,你做异步要用户等你嘛?10.负载均衡怎么做11.多数据中心还是单数据中心,如果出现没卖完怎么做(到这完全不会了,面试官直接说换个话题吧)12.平常读书吗?13.上过哲学课嘛?14.兴趣爱好有没有15.对ai的看法16.来深圳有问题嘛?17.为什么不考研18.上大学带给了你什么?你提升在哪里,有没有具体的例子?反问:1.现在手机都有应用市场,应用宝怎么盈利?除了手机应用市场还是有人用,现在在做跨端,微软都有合作,之后会进军mac,主要做游戏,腾讯本身就是游戏大户。2.面试表现?整体评价一下会给到反馈。面完直接变HR面,今天HR面后,已经转为录用评估了,来牛客许个愿,暑期现在还没什么面试,希望能拿个offer之后再考虑要不要留在手子吧。
nunuking:三面压力这么大吗,面试的会议约了多长时间呀
面试问题记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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