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

这篇具有很好参考价值的文章主要介绍了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输入信号的最小值的功能。

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

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

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

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

输入描述:

clk:系统时钟

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

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

输出描述:

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

编写子模块

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

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

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

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

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

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

代码思路

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

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

注:

采用时序逻辑例化两次子模块时,第一个例化的最小值经过一个时钟周期才能得到,
此时若再拿去与第三个数比较大小进行第二次例化时,第三个数已经不是上个周期的数了,
解决办法就是将第三个数缓存一个周期,再进行第二次例化子模块,结果可以通过测试。文章来源地址https://www.toymoban.com/news/detail-617441.html

代码

`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

到了这里,关于Verilog语法学习——LV9_使用子模块实现三输入数的大小比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Verilog语法学习——LV6_多功能数据处理器

    Verilog语法学习——LV6_多功能数据处理器

    题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1tab=Verilog篇topicId=301) 描述 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号

    2024年02月15日
    浏览(10)
  • lv9 嵌入式开发 数据库sqlite

    lv9 嵌入式开发 数据库sqlite

    数据(Data)               能够输入计算机并能被计算机程序识别和处理的信息集合 数据库 (Database)             数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合 大型数据库 Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广

    2024年02月05日
    浏览(9)
  • Verilog语法-模块module[Day2学习笔记]

    Verilog语法-模块module[Day2学习笔记]

    1概述 Verilog HDL是一种用于数字逻辑电路设计的硬件描述语言,可用来进行数字电路的仿真验证、时序分析、逻辑综合。 用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。 Verilog HDL既是一种 行为 描述语言,也是一种 结构 描述语言。 既可以用电路的功能描述,也可以用

    2024年02月15日
    浏览(12)
  • 1、verilog语法——模块的结构

    1、verilog语法——模块的结构

    目录 前言 一、什么是模块 二、模块的内容 1.I/O声明的格式 2.内部信号的声明 3.功能定义 三、模块的调用(例化) 要点注意 本次的学习内容是verilog的基本设计单元:模块(module) 模块(module)是verilog设计基本单元。一共由两部分组成:一部分是描述接口,另一部分描述逻辑

    2024年02月08日
    浏览(3)
  • verilog 模块输入输出描述

    表格 端口 从模块内部看 从模块外部看 input 输入端口 必须为线网类型 额可以线网类型或寄存器类型 output 输出端口 可以是线网类型或寄存器类型 必须为线网类型 inout 输入输出端口 必须为线网类型 必须为线网类型 说明 端口连接规则 将一个端口看成由相互链接的两个部分组

    2024年02月14日
    浏览(8)
  • Verilog语法——2.模块例化、运算符

    Verilog语法——2.模块例化、运算符

    参考资料 【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】 2.1.1 什么是模块例化 例化,即将项目不断拆分成次级功能模块,然后从最简单的模块开始实现,进而完成整个复杂项目 2.1.2 模块例化的方法 针对已经抽象好的模块,需要

    2024年01月16日
    浏览(27)
  • Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog进行FPGA/IC设计值,通常划分为各个子模块,木模块之间可能相互例化,并在顶层统一例化,并连接成一个顶层模块文件。 基本的模块模板: 如果模块内的变量位宽参数化,则模块模板为: 例化带参数的模块: 端口类型/端口描述 input 设计模块只能使用其input端口从外部

    2024年02月13日
    浏览(9)
  • 【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

    【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

    今天的实验是计数器实验的升级,设计让8个LED灯以每个0.5s的速率循环闪烁 1 移位法实现 1.1 移位方法1 每个LED灯代表一位,共8位,亮为1,灭为0 如何实现这样的逻辑呢? 移位操作即可! 怎么样才能移位呢? 第一个状态需满足最低位为1,然后每次左移1个 源代码 仿真代码 功

    2024年01月16日
    浏览(7)
  • 【Verilog】期末复习——设计带进位输入和输出的8位全加器,包括测试模块

    数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分为哪两类?它们各自的特点是什么? 期末复习——VerilogHDL描述数字逻辑电

    2024年01月23日
    浏览(27)
  • Verilog语法学习——边沿检测

    Verilog语法学习——边沿检测

    若为下降沿检测,则为: TB文件 注意,若TB文件中输入信号signal_in的上升下降沿和sys_clk同步,则检测不出边沿。所以我将输入信号的持续时间都设定为随机数字,来和sys_clk产生区别 仿真波形 若出现不定值x或高阻值z,则检测不准确。 可以改进为: 解释: == 和 !== 称为逻辑

    2024年02月11日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包