硬件描述语言: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

相关文章

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy