Verilog语法学习——LV9_使用子模块实现三输入数的大小比较

LV9_使用子模块实现三输入数的大小比较

题目来源于牛客网

[牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1&tab=Verilog篇&topicId=301)

题目

描述

在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。

请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。

子模块的信号接口图如下:

主模块的信号接口图如下:

输入描述:

clk:系统时钟

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

a,b,c:8bit位宽的无符号数

输出描述:

d:8bit位宽的无符号数,表示a,b,c中的最小值

编写子模块

在Verilog中,可以使用module关键字编写子模块。子模块是一种将较大的电路拆分为模块化部分的方法,使代码更易于维护和重复使用。

以下是一个简单的示例,展示了如何编写一个加法器子模块:

verilog 复制代码
module Adder(
    input [3:0] A, 
    input [3:0] B, 
    output [4:0] Sum
);
    assign Sum = A + B;
endmodule

通过将子模块实例化到另一个模块中,可以在主模块中使用子模块。

下面是一个示例,展示了如何实例化并使用上述的加法器子模块:

verilog 复制代码
module Top;
    // 输入和输出端口声明
    reg [3:0] A;
    reg [3:0] B;
    wire [4:0] Sum;
    
    // 子模块实例化
    Adder adder_inst(.A(A), .B(B), .Sum(Sum));
    
    // 在这里可以使用子模块的输出Sum
    
    // ...
    
endmodule

代码思路

例化一个模块,该模块比较两个输入的大小,并输出较小的数。

例化两次该模块,实现三个数的比较。

注:

采用时序逻辑例化两次子模块时,第一个例化的最小值经过一个时钟周期才能得到,
此时若再拿去与第三个数比较大小进行第二次例化时,第三个数已经不是上个周期的数了,
解决办法就是将第三个数缓存一个周期,再进行第二次例化子模块,结果可以通过测试。

代码

verilog 复制代码
`timescale 1ns/1ns
module main_mod(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,
	input [7:0]c,
	
	output  [7:0]d	//由图可知,a,b,c,d全为wire型
	
);
	wire [7:0] min_ab;
    //第一次例化,比较a,b的大小
	compare u_compare(
		.clk(clk),
		.rst_n(rst_n),
		.data_a(a),
		.data_b(b),
		.data_c(min_ab)
	);
/*采用时序逻辑例化两次子模块时,第一个例化的最小值经过一个时钟周期才能得到,
此时若再拿去与第三个数比较大小进行第二次例化时,第三个数已经不是上个周期的数了,
解决办法就是将第三个数缓存一个周期,再进行第二次例化子模块,结果可以通过测试。
*/
    reg [7:0] c_r;	//将c的值存储起来
	always @(posedge clk or negedge rst_n) begin
		if(!rst_n)
			c_r <= 0;
		else 
			c_r <= c;
	end
	 //第二次例化,比较a,b,c的大小
	compare u_compare_2(
		.clk(clk),
		.rst_n(rst_n),
		.data_a(min_ab),
		.data_b(c_r),
		.data_c(d)
	);	
endmodule

//子模块:比较data_a,data_b的大小,并且输出较小的数
module compare(
	input clk,
	input rst_n,
	input [7:0]data_a,
	input [7:0]data_b,
	output [7:0]data_c		
);	
	reg [7:0] result;	//定义一个reg型,将比较结果存起来
	always @(posedge clk or negedge rst_n) begin
		if(!rst_n)
			result <=0;
		else begin
			if(data_a > data_b)
				result <= data_b;
			else if(data_a <= data_b)
				result <= data_a;
		end	
	end
	assign data_c = result;
endmodule
相关推荐
.小墨迹7 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
ZH15455891317 小时前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
Gain_chance7 小时前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
hqyjzsb7 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
承渊政道8 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
野犬寒鸦9 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
陈桴浮海9 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
xhbaitxl10 小时前
算法学习day39-动态规划
学习·算法·动态规划
ZH154558913110 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
试着11 小时前
【huawei】机考整理
学习·华为·面试·机试