描述
题目描述:
现在输入了一个压缩的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/1nsmodule 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)beginif(~rst)beginvalidout <= 0;out <= 0;dreg <= 0;endelsebegincase(sel)'d0:begindreg <= d; out <= 0; validout <= 0; end'd1:beginout <= dreg[7:4] + dreg[3:0]; validout <= 1; end'd2:beginout <= dreg[11:8] + dreg[3:0]; validout <= 1; end'd3:beginout <= dreg[15:12] + dreg[3:0]; validout <= 1; endendcaseendend//*************code***********//
endmodule
波形图: