【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77

编写乘法器求解算法表达式

描述

编写一个4bit乘法器模块,并例化该乘法器求解c=12*a+5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。

模块的信号接口图如下:

要求使用Verilog HDL语言实现以上功能,并编写testbench验证模块的功能。

输入描述:

clk:系统时钟信号

rst_n:复位信号,低电平有效

a:输入信号,位宽为4bit

b:输入信号,位宽为4bit

输出描述:

c:输出信号

解题思路:

移位运算与乘法的关系如下:

左移n位表示;

右移n位表示;

当直接在一个always语句块中写入代码,如下所示:

cpp 复制代码
`timescale 1ns/1ns

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);
	wire [8:0] a_9, b_9;
	reg [8:0] c_r;

	assign a_9 = {5'b0_0000, a[3:0]};
	assign b_9 = {5'b0_0000, b[3:0]};

	always @(posedge clk or negedge rst_n) begin

		if (!rst_n) c_r <= 9'b0_0000_0000;
		else c_r <= (a_9<<3)+(a_9<<2)+(b_9<<2)+b_9;

	end

	assign c = c_r;

endmodule

可发现其波形如下:

如红色方框所示,最终输出C的值是在第二个时钟上升沿的到来时才正常输出,因此在信号a,b输入时,应该打一拍

正确的代码如下:
cpp 复制代码
`timescale 1ns/1ns

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);
	reg [8:0] a_9, b_9;
	reg [8:0] c_r;

	always @(posedge clk or negedge rst_n) begin

		if (!rst_n) begin
			a_9 <= 9'b0_0000_0000;
			b_9 <= 9'b0_0000_0000;
		end
		else begin
			a_9 <= {5'b0_0000, a[3:0]};
			b_9 <= {5'b0_0000, b[3:0]};
		end
	end

	always @(posedge clk or negedge rst_n) begin

		if (!rst_n) c_r <= 9'b0_0000_0000;
		else c_r <= (a_9<<3)+(a_9<<2)+(b_9<<2)+b_9;

	end

	assign c = c_r;

endmodule
相关推荐
阳光九叶草LXGZXJ18 分钟前
达梦数据库-学习-43-定时备份模式和删除备份(Python+Crontab)
linux·运维·开发语言·数据库·python·学习
从此不归路18 分钟前
FPGA 结构与 CAD 设计(第4章)下
fpga开发
首席拯救HMI官20 分钟前
【拯救HMI】HMI容错设计:如何减少操作失误并快速纠错?
大数据·运维·前端·javascript·网络·学习
乐观主义现代人22 分钟前
gRPC 框架面试题学习
后端·学习·rpc
别在内卷了29 分钟前
三步搞定:双指针归并法求两个有序数组的中位数(Java 实现)
java·开发语言·学习·算法
星期五不见面29 分钟前
机器人学习!(二)ROS-模型优化与加速(TensorRT)(4)2026/01/15
学习
专注VB编程开发20年31 分钟前
MQTT傻瓜化调用组件,零成本学习.NET开发,上位机开发
学习·机器学习·.net
Terasic友晶科技1 小时前
7-DE10-Nano的HDMI方块移动案例的整体实现(含Quartus完整工程免费下载)
fpga开发·i2c·pll·de10-nano·hdmi传输·方块移动案例·quartus prime
丝斯20111 小时前
AI学习笔记整理(48)——大模型中的向量工程RAG系统
人工智能·笔记·学习
YY_pdd1 小时前
全面战争三国-mod开发教程(demo,已实证)
经验分享·笔记·学习