题解 | #位拆分与运算#

位拆分与运算

https://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752

`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//
    reg [15:0] d_reg;
    reg [4:0] out_tmp;
       reg validout_tmp;
    always@(posedge clk or negedge rst) begin
        if(!rst) begin //这里是异步复位,如果删去negedge rst,则是同步复位
            out_tmp <= 5'b0;
            validout_tmp <= 1'b0;
        end
        else begin
            case(sel) 
                              //每一条cese中,如果有多条语句,都要加 begin/end
                2'b00: begin out_tmp <= 5'b0; validout_tmp <= 1'b0;end
                2'b01: begin out_tmp <= d_reg[3:0] + d_reg[7:4]; validout_tmp <= 1'b1; end
                2'b10: begin out_tmp <= d_reg[3:0] + d_reg[11:8];  validout_tmp <= 1'b1; end
                2'b11: begin out_tmp <= d_reg[3:0] + d_reg[15:12];  validout_tmp <= 1'b1; end
            endcase
        end
    end
 //写成两个always
    always@(posedge clk or negedge rst) begin
        if(!rst) begin
            d_reg <= 5'b0;
        end
        else if (sel == 2'b0) begin
                d_reg <= d;
        end
    end
    
    assign out = out_tmp;
	 assign validout = validout_tmp;
//*************code***********//
endmodule            


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务