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

移位运算与乘法

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

    localparam Idel = 2'b01;

    localparam First = 2'b10;

    reg [1:0] CNT;

    reg [1:0] CurrentState;

    reg [1:0] NextState;

    reg [7:0] d_store;

 

    always @(posedge clk or negedge rst) begin

        if(!rst) begin

            CurrentState <= Idel;

        end else begin

            CurrentState <= NextState;

        end

    end

    always @( * ) begin

        case (CurrentState)

            Idel : begin

                if(d != 8'h0000begin

                    NextState = First;

                end else begin

                    NextState = Idel;

                end

            end

            First : begin

                if(CNT == 2'h2begin

                    NextState = Idel;

                end else begin

                    NextState = First;

                end

            end

            default : begin

                NextState = Idel;

            end

        endcase

    end

    always @(posedge clk or negedge rst) begin

        if(!rst) begin

            input_grant <= 1'b0;

            out <= 11'h000;

            CNT <= 2'h0;

            d_store <= 8'h0000;

        end else begin

            case (CurrentState) 

                Idel : begin

                    if(d != 8'h0000begin

                        input_grant <= 1'b1;

                        out <= d;

                        d_store <= d;

                    end else begin

                        input_grant <= 1'b0;

                        out <= 11'h000;

                    end

                end

                First : begin

                    input_grant <= 1'b0;

                    if(CNT == 2'h2begin

                        out <= {d_store, 3'h0};

                        CNT <= 2'h0;

                    end else begin

                        case(CNT)

                            2'h0 : begin

                                out <= {2'h0, d_store, 1'h0} + d_store;

                            end

                            2'h1 : begin

                                out <= {d_store, 3'h0} - d_store;

                            end

                            default : begin

                            end

                        endcase

                        CNT <= CNT + 1;

                    end

                end

                default : begin

  

                end

            endcase

        end

    end

//*************code***********//

endmodule

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-10 15:24
高考前一晚在OPPO手机上设置了早上5:30的闹钟,然而闹钟并未按时响起。直到妈妈做好早餐后,在6:27打开手机才发现闹钟未触发,“气得早上饭都没吃”。资本家你赢了
永不遗忘:我来解释一下 :Oppo 手机晚上两点会自动进行系统更新,这个系统更新会重置掉所有设置好的闹钟,而且他也不会告诉你,而且只有 Oppo 会这样,华为苹果小米三星都不会
点赞 评论 收藏
分享
04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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