题解 | 位拆分与运算

`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;
    wire[3:0]d0;
    wire[3:0]d1;
    wire[3:0]d2;
    wire[3:0]d3; 

    assign d0 = d_reg[3:0];
    assign d1 = d_reg[7:4];
    assign d2 = d_reg[11:8];
    assign d3 = d_reg[15:12];
    reg [4:0] out_reg;
    reg validout_reg;

always @(posedge clk or negedge rst)begin
       if(!rst)begin
            out_reg <= 5'b0;
            validout_reg <= 1'b0;
            d_reg <= 16'b0;
       end 
       else begin 
            case(sel)
            2'b00 :begin 
                 d_reg <= d;
                 out_reg <=  5'b0; 
                 validout_reg <= 1'b0;   
            end 
            2'b01 :begin
                 d_reg <= d_reg;
                 out_reg <= d_reg[3:0] + d_reg[7:4];   
                 validout_reg <= 1'b1;   
            end        
            2'b10 :begin
                 d_reg <= d_reg;
                 out_reg <= d0 + d2;  
                 validout_reg <= 1'b1;   
            end
            2'b11 :begin
                 d_reg <= d_reg;
                 out_reg <= d0 + d3;  
                 validout_reg <= 1'b1;   
            end
            default : begin
                  out_reg <= 5'b0;
                  validout_reg <= 1'b0;  
            end
            endcase
       end
end
    assign out = out_reg;
    assign validout = validout_reg;

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

FPGA数字IC牛客网Verilog刷题05-位拆分与运算

这题题干给的有点小问题,题干两个输出给的都不是寄存器reg类型的数据。因此中间要加两个中间的寄存器类型out_reg 和 validout_reg。在宏定义中直接加入d0 , d1 ,d2 , d3 。方便下边程序调用。如刷题04 case设置一个简单的状态机,依次调用不同的sel。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务