LV5_位拆分与运算
题目来源于牛客网
[牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1&tab=Verilog篇&topicId=301)
题目
题目描述:
现在输入了一个压缩的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
代码
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output reg [4:0]out,
output reg validout
);
//*************code***********//
/*代码思路:先将d分为4个单独的变量;
根据sel的值来选择不同的输出,case语句
*/
reg [15:0] enable_in; //定义一个寄存器变量来存储有效输入时d的值
reg [3:0] data1,data2,data3,data4 ;
always @(*) begin
if(sel == 0) begin //sel=0,只有此时的输入有效 ,将此时的d的值存起来
enable_in <= d;
data1 <= enable_in[3:0];
data2 <= enable_in[7:4];
data3 <= enable_in[11:8];
data4 <= enable_in[15:12];
end
end
//case循环,根据sel的值来执行不同的输出
always @(posedge clk or negedge rst) begin
if(!rst) begin
validout <= 0;
out <= 0;
end
else begin
case (sel)
2'd0 : begin
out <= 0;
validout <= 0;
enable_in <= d;
end
2'd1 : begin
out <= data1 + data2;
validout <= 1;
enable_in <= 0;
end
2'd2 : begin
out <= data1 + data3;
validout <= 1;
enable_in <= 0;
end
2'd3 : begin
out <= data1 + data4;
validout <= 1;
enable_in <= 0;
end
default : begin
out <= 0;
validout <= 0;
enable_in <= 0;
end
endcase
end
end
//*************code***********//
endmodule