题解 | #移位运算与乘法#

移位运算与乘法

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] cnt ;
reg [10:0] din ;

always @(posedge clk or negedge rst) begin
    if(!rst)begin
        cnt <=2'b00;
    end
    else if(cnt==2'b11) begin
        cnt <=0;
    end
    else cnt <= cnt+1'b1;
end

always @(posedge clk or negedge rst) begin
    if(!rst)begin
        input_grant <= 1'b0;
        out <= 11'b0;
        din = 1'b0;
    end else begin
        case (cnt)
            2'b00: begin
                din = d;
                input_grant <= 1'b1;
                out <= din;
            end
            2'b01: begin
                input_grant <=1'b0;
                out <= (din<<2'd2)-din;
            end
            2'b10:begin
                input_grant <=1'b0;
                out <= (din<<2'd3)-din;
            end
            2'b11:begin
                input_grant <= 1'b0;
                out <= din<<2'd3;
            end
        endcase
    end
end

//*************code***********//
endmodule 

本题的核心点是接收到一个输入后,会将本次的输入相应的四个输出按照周期输出结束后才继续接收下一个输入,对于这种类似于线程型的任务,可以用计数器进行计数。

代码中需要注意的点:din 接收赋值需要采用阻塞赋值,否则接收的第一个值将会被错过!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务