题解 | #移位运算与乘法#
移位运算与乘法
http://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***********//
//保证移位的乘法是基于第一个时钟周期,加一个寄存器,对输入寄存
//input_grant在每次第一次相乘时,被赋值1
//写在一个always里
reg [1:0] count;//状态机计数;FSM
reg [10:0] d_reg;
always@(posedge clk&nbs***bsp;negedge rst)
if(!rst) begin
count<=2'b0;
input_grant<=1'b0;
out<=1'b0;
d_reg<=11'b0;
end
else begin
count<=count+1'b1;
case(count)
2'b00:begin
d_reg<=d;
input_grant<=1'b1;
out<=d;
end
2'b01:begin
input_grant<=1'b0;
out<=(d_reg<<2)-d_reg;
end
2'b10:begin
input_grant<=1'b0;
out<=(d_reg<<3)-d_reg;
end
2'b11:begin
input_grant<=1'b0;
out<=d_reg<<3;
end
default : begin
out <= d;
input_grant <= 1'b0;
end
endcase
end
//写在两个always块中
/* reg [1:0] count; // 0 1 2 3
always @ (posedge clk&nbs***bsp;negedge rst)
begin
if(~rst) begin
count <= 2'b0;
end
else begin
count <= count + 1'b1;
end
end
// FSM
reg [10:0] d_reg;
always @ (posedge clk&nbs***bsp;negedge rst)
begin
if(~rst) begin
out <= 11'b0;
input_grant <= 1'b0;
d_reg <= 11'b0;
end
else begin
case( count )
2'b00 : begin
out <= d;
d_reg <= d;
input_grant <= 1'b1;
end
2'b01 : begin
//out <= d_reg + {d_reg, 1'b0}; // *1 + *2
out <= (d_reg<<2)-d_reg; // *1 + *2
input_grant <= 1'b0;
end
2'b10 : begin
//out <= d_reg + {d_reg, 1'b0} + {d_reg, 2'b0};
out <= (d_reg<<3)-d_reg; // *1 + *2
input_grant <= 1'b0;
end
2'b11 : begin
//out <= {d_reg, 3'b0};
out <= d_reg<<3;
input_grant <= 1'b0;
end
default : begin
out <= d;
input_grant <= 1'b0;
end
endcase
end
end */
//*************code***********//
endmodule
查看14道真题和解析