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

移位运算与乘法

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

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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