基本思路:
- 通过移位进行乘法运算,右移n位即为*(2^n)
- 使用cnt记录d有效后进行了几次运算
- 使用d_temp锁存有效d进行运算
- 以cnt的数值为标志进行out、input_grant运算,在一个always里完成
注意事项:
- 使用时序电路时,表达式右边的变量均为上一拍的取值
`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 [10:0] d_temp; reg [2:0] cnt = 0; always @(posedge clk or negedge rst) begin if (!rst) begin cnt <= 0; d_temp <= 0; out <= 0; input_grant <= 0; end else begin case(cnt) // for shown diagram, at beat 3, start case 3'd0: begin cnt <= cnt +1; d_temp <= d; out <= d; input_grant <=1;end //for shown diagram, at beat 3, d_temp gets d's value at beat 2 3'd1: begin cnt <= cnt +1; out <= (d_temp << 2) -d_temp; input_grant <=0; end 3'd2: begin cnt <= cnt +1; out <= (d_temp << 3) -d_temp; end 3'd3: begin cnt <= 0; out <= d_temp << 3; end endcase end end //*************code***********// endmodule