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

移位运算与乘法

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
);
reg  [1:0] cnt;
wire  [10:0] out1;
wire  [13:0] out3;
wire  [13:0] out7;
wire  [13:0] out8;
//*************code***********//
always@(posedge clk or negedge rst)begin
    if(!rst) begin
        cnt <= 2'b0;
    end
    else begin
        cnt <= cnt + 1'b1;
    end
end

/* */
always@(posedge clk or negedge rst)begin
    if(!rst) begin
        input_grant <= 1'b0;
    end
    else begin
        if(cnt==0) input_grant <= 1'b1;
        else input_grant <= 1'b0;
    end
end
//
assign out1 = (cnt==0 && rst==1) ? {{3{1'b0}},d} : out1;
assign out3 = (rst==1) ? ((out1 << 1) + out1) : 14'd0;
assign out7 = (rst==1) ? ((out1 << 3) - out1) : 14'd0;
assign out8 = (rst==1) ? (out1 << 3) : 14'd0;
/*用下面时序逻辑的写法是很常见的思维,但是有个问题就是题目要求每个时钟输出一个数据,所以如果采用时序逻辑的话,需要两个clk才能输出。直接使用组合逻辑,算出四个值,在时钟计数下依次输出四个值,注意的是每隔四个时钟采样一次输入数据;左移需要考虑位扩展*/
// always@(posedge clk or negedge rst)begin
//     if (!rst)
//         out1 <= 11'd0;
//     else
//         out1 <= (cnt==0) ? {{3{1'b0}},d} : out1;
// end

// always@(posedge clk or negedge rst)begin
//     if(!rst) begin
//         out3 <= 14'd0;
//         out7 <= 14'd0;
//         out8 <= 14'd0;
//     end
//     else begin
//         out3 <= (out1 << 2) + out1;
//         out7 <= (out1 << 3) - out1;
//         out8 <= out1 << 3;
//     end
// end

always@(posedge clk or negedge rst)begin
    if (!rst)
        out <= 11'd0;
    else begin
        case(cnt)
        2'd0 : out <= out1;
        2'd1 : out <= out3[10:0];
        2'd2 : out <= out7[10:0];
        2'd3 : out <= out8[10:0];
        endcase
    end
end
//*************code***********//
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务