【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
相关推荐
青山是哪个青山3 小时前
LangChain 学习笔记(四):Message 与提示词模板
笔记·学习·langchain
hsjiasb4 小时前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
崇子嵘5 小时前
基于zynqMP15eg的linux驱动学习
学习
知识分享小能手7 小时前
线性代数学习教程,从入门到精通,向量组的线性相关性 — 完整知识点梳理(7)
学习·线性代数·机器学习
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
动词ing8 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
小O的算法实验室9 小时前
IEEE TII,学习为多目标深度学习生成偏好
人工智能·深度学习·学习
zlinear数据采集卡10 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
吃好睡好便好10 小时前
说说高温对情绪的影响
学习·生活·情绪·高温
for_ever_love__11 小时前
python基础语法学习: 文件操作
python·学习