目录

代码

使用了状态机。

`timescale 1ns/1ns
module multi_sel(
    input [7:0]d ,
    input clk,
    input rst,
    output reg input_grant,
    output reg [10:0]out
);
//*************code***********//
    parameter TIMES1=0, TIMES3=1, TIMES7=2, TIMES8=3;
    reg [1:0] state;
    reg [7:0] d_r;
    
    always @(posedge clk or negedge rst) begin
        if(~rst) begin
            input_grant <= 1'b0;
            out         <= 11'b0;
            state       <= TIMES1;
        end
        else begin
            case(state)
                TIMES1: begin
                    input_grant <= 1'b1;
                    out         <= d;
                    state       <= TIMES3;
                    d_r         <= d;
                end
                TIMES3: begin
                    input_grant <= 1'b0;
                    out         <= (d_r<<1) + d_r;
                    state       <= TIMES7;
                    d_r         <= d_r;
                end
                TIMES7: begin
                    input_grant <= 1'b0;
                    out         <= (d_r<<3) - d_r;
                    state       <= TIMES8;
                    d_r         <= d_r;
                end
                TIMES8: begin
                    input_grant <= 1'b0;
                    out         <= d_r<<3;
                    state       <= TIMES1;
                    d_r         <= d_r;
                end
                default: begin
                    input_grant <= 1'b0;
                    out         <= 11'b0;
                    state       <= TIMES1;
                    d_r         <= 8'b0;
                end
            endcase
        end
    end
//*************code***********//
endmodule

简析

题目给出的波形图中,输入d==128被忽略,也就是上一个输入的8倍输出之后,新的输入才是有效的。所以本状态机只在state=TIMES1时更新d_rinput_grant只与当前的状态有关,而outstate==TIMES1时,与输入也有关,所以这个状态机严格上是Mealy状态机。