题解 | #移位运算与乘法#
移位运算与乘法
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 [1:0] cur_st; reg [1:0] nxt_st; reg [7:0] d_vld; parameter ONE_MUL = 3'd0, THR_MUL = 3'd1, SEV_MUL = 3'd2, EGH_MUL = 3'd3; always @(posedge clk or negedge rst) begin if(rst == 1'b0) cur_st <= 3'd0; else cur_st <= nxt_st; end always @(*)(1444584) begin case(cur_st) ONE_MUL: nxt_st <= THR_MUL; THR_MUL: nxt_st <= SEV_MUL; SEV_MUL: nxt_st <= EGH_MUL; EGH_MUL: nxt_st <= ONE_MUL; default: nxt_st <= ONE_MUL; endcase end always @(posedge clk or negedge rst) begin if(rst == 1'b0)begin out <= 11'd0; input_grant <= 1'd0; end else begin case(cur_st) ONE_MUL: begin out <= d; input_grant <= 1'd1; end THR_MUL: begin out <= (d_vld<<2)-d_vld; input_grant <= 1'd0; end SEV_MUL: begin out <= (d_vld<<3)-d_vld; input_grant <= 1'd0; end EGH_MUL: begin out <= (d_vld<<3); input_grant <= 1'd0; end default: begin out<= 11'd0; input_grant <= 1'd0; end endcase end end always @(*)(1444584) begin case(cur_st) ONE_MUL: d_vld <= d; THR_MUL: d_vld <= d_vld; SEV_MUL: d_vld <= d_vld; EGH_MUL: d_vld <= d_vld; default: d_vld <= d; endcase end //*************code***********// endmodule
代码可能写的不太好,但是修改bug的思路重要。最开始给out输出的输入全部是d,后来想 状态机的每个状态d输入不一定都有效,因此需要瞄准one_mul阶段的输入,让其在状态机整个过程保持不变。