题解 | #移位运算与乘法#
移位运算与乘法
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'h0000) begin
NextState = First;
end else begin
NextState = Idel;
end
end
First : begin
if(CNT == 2'h2) begin
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'h0000) begin
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'h2) begin
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