Verilog语法学习——LV5_位拆分与运算

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值