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

移位运算与乘法

https://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***********//

reg [3:0] state;
reg [3:0] next_state;
reg [11:0] d_latch;

parameter IDEL = 3'b000;
parameter x1 = 3'b001;
parameter x3 = 3'b010;
parameter x7 = 3'b011;
parameter x8 = 3'b100;

always@(posedge clk or negedge rst) begin
    if(!rst) begin
        {input_grant, out} <= {1'b0, 11'b0};
        state <= 0;
    end
    else begin
        state <= next_state;
    end
end

always@(*) begin
        case(state)
            IDEL: next_state = x1;
            x1: next_state = x3;
            x3: next_state = x7;
            x7: next_state = x8;
            x8: next_state = x1;
            default: next_state = IDEL;
        endcase

end

/* 在当前状态为IDLE或x8(即下一个状态为S1)时采集新的d值,这个地方十分重要!!卡了我很久!!!这才是题干的意思*/
always@(posedge clk or negedge rst) begin
    if(!rst) begin 
        d_latch <= 0;
    end
    else begin
        case(state)
            IDEL: begin d_latch <= d; end
            x1: begin d_latch <= d_latch; end
            x3: begin d_latch <= d_latch; end
            x7: begin d_latch <= d_latch; end
            x8: begin d_latch <= d; end
            default: begin d_latch<= 0; end
        endcase
    end
end

always@(*) begin
        case(state)
            IDEL: begin input_grant = 1'b0; out = 0;  end
            x1: begin input_grant = 1'b1; out = d_latch; end
            x3: begin input_grant = 1'b0; out = (d_latch << 2) - d_latch; end
            x7: begin input_grant = 1'b0; out = (d_latch << 3) - d_latch; end
            x8: begin input_grant = 1'b0; out = (d_latch << 3); end
            default: begin input_grant = 1'b0; out = 0; end
        endcase
    end



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

全部评论

相关推荐

06-07 00:00
已编辑
腾讯_后端开发
点赞 评论 收藏
分享
07-17 11:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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