【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL5

位拆分与运算

题目描述

现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12],

现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低)

0:   不输出且只有此时的输入有效 

1:输出[3:0]+[7:4]

2:输出[3:0]+[11:8]

3:输出[3:0]+[15:12]

输入描述

输入信号   d, clk, rst
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位

输出描述

输出信号 validout    out
类型  reg

解题思路

当我们看到题目中有sel信号,首先在语句块中想到使用case语句块,其分支分别表示各个sel信号的情况;

`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 validout_t;
reg [4:0] out_t;
reg [15:0] d_t;

always @(posedge clk or  negedge rst)
    if (!rst) begin
        validout_t <= 1'b0;
        out_t <= 5'b00000;
    end
    else begin
       case (sel)
        2'b00: begin
            d_t = d; //注意此处阻塞赋值和非阻塞赋值的区别,进行锁存
            out_t <= 5'b00000;
            validout_t <=  1'b0;
       end
       2'b01: begin
            out_t <= d_t[3:0] + d_t[7:4];
            validout_t <= 1'b1;
       end
       2'b10: begin
            out_t <= d_t[3:0] + d_t[11:8];
            validout_t <= 1'b1;
       end
       2'b11: begin
            out_t <= d_t[3:0] + d_t[15:12];
            validout_t <= 1'b1;
       end
       endcase 
    end
assign validout = validout_t;
assign out = out_t;

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

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值