位拆分与运算

描述

题目描述:           

现在输入了一个压缩的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为0的时候进行锁存,只有此时的写入才是有效的(validout的下降沿写入有效),同时存在多种情况且没有优先级问题,建议使用case语句

代码如下:

`timescale 1ns/1ns

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

output [4:0]out,
output validout
);
reg [4:0]out;
reg validout;
reg [15:0] dreg;
//*************code***********//
always @(posedge clk or negedge rst)
    begin
        if(~rst)
            begin
                validout <= 0;
                out <= 0;
                dreg <= 0;
            end
        else
            begin
                case(sel)
                    'd0:begin
                        dreg <= d; 
                        out <= 0;  
                        validout <= 0; 
                    end
                    'd1:begin
                        out <= dreg[7:4] + dreg[3:0];  
                        validout <= 1;      
                    end

                    'd2:
                        begin
                            out <= dreg[11:8] + dreg[3:0];  
                            validout <= 1; 
                        end

                    'd3:
                        begin
                            out <= dreg[15:12] + dreg[3:0];  
                            validout <= 1; 
                        end

                endcase
            end

    end

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

波形图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值