硬件描述语言:elaborate和synthesis电路图的区别、latch问题、always组合逻辑默认值写法、Vivado和Quartus的电路图区别

本文主要是介绍硬件描述语言:elaborate和synthesis电路图的区别、latch问题、always组合逻辑默认值写法、Vivado和Quartus的电路图区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目来自:Ringer - HDLBits

Suppose you are designing a circuit to control a cellphone’s ringer and vibration motor. Whenever the phone needs to ring from an incoming call (input ring), your circuit must either turn on the ringer (output ringer = 1) or the motor (output motor = 1), but not both. If the phone is in vibrate mode (input vibrate_mode = 1), turn on the motor. Otherwise, turn on the ringer.

下面使用Vivado来elaborate(详细描述)和synthesis(综合),也是用Quartus来Analysis & Synthesis

一、assign写法

module top_module (input ring,input vibrate_mode,output ringer,       // Make soundoutput motor         // Vibrate
);assign ringer = ring & !vibrate_mode;assign motor  = ring & vibrate_mode;
endmodule

elab电路图

在这里插入图片描述
在这里插入图片描述

黄色的图是Vivado的elaborate步骤出的电路图;
蓝色的图是Quartus的RTL Viewer出来的图;
Vivado和Quartus的电路图区别:Quartus的图看起来会稍微简洁一点点;

synth电路图

在这里插入图片描述

在这里插入图片描述

黄色的图是Vivado的synthesis步骤出的图;
紫色这张图是Quartus的Technology Map Viewer (Post-Mapping)出来的图;

图里的IBUF和OBUF可以忽略掉,这是综合工具自动加上去的。

二、always @(*)组合逻辑写法

module top_module (input ring,input vibrate_mode,output reg ringer,       // Make soundoutput reg motor         // Vibrate
);always @(*) beginringer = 0; motor = 0;if (ring)if (vibrate_mode)motor = 1;elseringer = 1;end
endmodule

elab电路图

在这里插入图片描述
在这里插入图片描述

synth电路图

在这里插入图片描述
在这里插入图片描述

这两个电路图是第一种写法的图是一样的。

小结论:elaborate和synthesis电路图的区别

对比一和二两种写法,可以看到elab阶段的电路图是从RTL代码分析的,所以两个电路图看起来有点不一样(仔细看可以发现功能是一样的),而综合synth阶段的电路图是一样的,因为综合的确是分析了电路的功能,用具体的器件来实现功能了。

三、latch问题

module top_module (input ring,input vibrate_mode,output reg ringer,       // Make soundoutput reg motor         // Vibrate
);always @(*) begin// ringer = 0; motor = 0;if (ring)if (vibrate_mode)motor = 1;elseringer = 1;end
endmodule

elab电路图

在这里插入图片描述

在这里插入图片描述

Quartus出的这个图很简洁,直接给了输出1。两个工具都发现了Latch的存在,报了Warning。

synth电路图

在这里插入图片描述

在这里插入图片描述

小结论:latch问题、always组合逻辑默认值写法

可以看到,如果不把 if else 或 case 写完整的话,会产生latch。

always @(*)组合逻辑写法中,默认值的写法可以学一下。下面再举一个默认值写法的例子:Always nolatches - HDLBits。

module top_module (input [15:0] scancode,output reg left,output reg down,output reg right,output reg up  ); always @(*) beginleft = 0; down = 0; right = 0; up = 0;  // 这里是默认值,节省了很多default写法case (scancode)16'he06b: left = 1;16'he072: down = 1;16'he074: right = 1;16'he075: up = 1;endcaseend
endmodule

注:CSDN博客竟然不支持Verilog的高亮???其他语言,例如C/C++可以

这篇关于硬件描述语言:elaborate和synthesis电路图的区别、latch问题、always组合逻辑默认值写法、Vivado和Quartus的电路图区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471847

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁