声明:
博主主页:王_嘻嘻的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]
本题其实就是第一题的扩展版,根据sel信号对输入进行不同的操作并输出。唯一需要注意的是,题目要求sel为‘0’时不输出结果,且仅当时的输入有效。
这就需要我们在sel为‘0’时,对d采样,并记录。而validout信号在sel非‘0’常为‘1’。
本题比较简单,在代码层面没有需要特别注意的问题,不过新手朋友可能不清楚out信号5-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