数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (五)位拆分与运算

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (五)位拆分与运算


声明:
博主主页:王_嘻嘻的CSDN博客
未经作者允许,禁止转载
系列专栏:牛客Verilog习题集
推荐一个IC、FPGA新手入门的好网站:快 点 击 进 入 学 习 吧


  继续整理牛客网经典Verilog习题讲解,牛客网里除了最新的Verilog题库还有其它领域的经典笔试、面试题,大家快和我一起刷起来吧 点 击 跳 转



题目


描述

题目描述:

现在输入了一个压缩的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]


数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (五)位拆分与运算_第1张图片


分析:

  本题其实就是第一题的扩展版,根据sel信号对输入进行不同的操作并输出。唯一需要注意的是,题目要求sel为‘0’时不输出结果,且仅当时的输入有效。
  这就需要我们在sel为‘0’时,对d采样,并记录。而validout信号在sel非‘0’常为‘1’。

  • 所以整个代码分为三个部分:d的采样逻辑、validout随sel变化的逻辑、out根据sel完成不同操作



题解:

  本题比较简单,在代码层面没有需要特别注意的问题,不过新手朋友可能不清楚out信号5-bits的由来,或者说是计算结果的位宽该如何确定

  • 通常来说n bits+n bits = n+1 bits;
  • n bits*n bits = 2n bits;
  • 但其实有一个最简单的办法,将等号左边所有变量以最大值计算,就可以知道等号右侧最大需要多少位宽了

`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_tmp;  //输入采样
reg     [4:0]   out;

always @(posedge clk or negedge rst)begin
    if(!rst)
        d_tmp[15:0] <= 16'b0;
    else if(sel[1:0]==2'b0)
        d_tmp[15:0] <= d[15:0];
end

assign validout = (sel[1:0]!=2'b0);

always @(*)begin
    case(sel[1:0])
        2'b00: out[4:0] = 5'b0;
        2'b01: out[4:0] = d_tmp[3:0] + d_tmp[7:4];
        2'b10: out[4:0] = d_tmp[3:0] + d_tmp[11:8];
        2'b11: out[4:0] = d_tmp[3:0] + d_tmp[15:12];
    endcase
end

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


你可能感兴趣的:(牛客Verilog习题集,fpga开发,面试,硬件工程)