0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单介绍一下时序和组合逻辑的一些知识

OpenFPGA 来源:OpenFPGA 作者:碎碎思 2022-09-16 09:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从这一题开始我们将进行过程块的学习,也就是时序和组合逻辑的一些知识,下面简单介绍一下这方面知识:

由于数字电路是由用导线连接的逻辑门组成的,因此任何电路都可以表示为module和assign语句的某种组合。然而,有时这并不是描述电路的最方便的方式。过程块(比如always块)提供了一种用于替代assign语句描述电路的方法。

对于可综合硬件,有两种类型的 always :

组合逻辑:always@(*)
时序逻辑:always@(posedgeclk)

组合always块相当于assign语句,因此组合电路存在两种表达方法。选择使用哪个主要是哪个语法更方便的问题。程序块内部代码的语法与外部代码不同。程序块具有更丰富的语句集(例如,if-then、case),不能包含连续赋值,但是却引入了许多新的非直观的出错方式。 (程序连续赋值确实存在,但与连续赋值有些不同,并且不可综合。)

例如,assign和组合always块描述相同的电路。两者都创建了相同的组合逻辑块。每当任何输入(右侧)更改值时,两者都会重新计算输出。

assignout1=a&b|c^d;
always@(*)out2=a&b|c^d;

75b60436-3557-11ed-ba43-dac502259ad0.png


对于组合always块,敏感变量列表总是使用(*)。如果把所有的输入都列出来也是可以的,但容易出错的(可能少列出了一个),并且在硬件综合时会忽略您少列了一个,仍按原电路综合。 但仿真器将会按少列一个来仿真,这导致了仿真与硬件不匹配。(在SystemVerilog中,使用always_comb)

关于 wire 与 reg 的注意事项:assign 语句的左侧必须是net类型(例如,wire),而过程赋值(在 always 块中)的左侧必须是变量类型(例如,reg)。这些类型(wire vs. reg)与合成的硬件无关,只是 Verilog 用作硬件模拟语言时留下的语法。

题目说明

使用 assign 语句和组合 always 块构建 AND 门。

75b60436-3557-11ed-ba43-dac502259ad0.png

模块端口声明

//synthesisverilog_input_versionverilog_2001
moduletop_module(
inputa,
inputb,
outputwireout_assign,
outputregout_alwaysblock
);

题目解析

这个题目重点是使用assign和always两种方式描述一个AND门,整体难度不大。

moduletop_module(
inputlogica,
inputlogicb,
outputwirelogicout_assign,
outputvarlogicout_alwaysblock
);

assignout_assign=a&b;

always_comb
begin
out_alwaysblock=a&b;
end

endmodule

always_comb程序有很多好处,其中之一便是能自动推断出完整的敏感列表。该列表是完全完整的,避免了@*推断不完整敏感列表的极端情况。

769a6022-3557-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

76e39b84-3557-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 29-Alwaysblock2

阻塞性赋值和非阻塞性赋值

在Verilog中有以下三种赋值方法:

连续赋值(assign x=y;):不能在过程块内使用;

过程阻塞性赋值(x=y;):只能在过程块中使用;

过程费阻塞性复制(x<=y):只能在过程块内使用。

在组合always块中,使用阻塞性赋值。在时序always块中,使用非阻塞性赋值。具体为什么对设计硬件用处不大,还需要理解Verilog模拟器如何跟踪事件(的确是这样,记住组合用阻塞性,时序用非阻塞性就可以了)。不遵循此规则会导致极难发现非确定性错误,并且在仿真和综合出来的硬件之间存在差异。

题目说明

以三种方式构建异或门,使用assign语句、组合always块和时序always块。请注意,时序always块产生的电路与其他两个不同:有一个触发器,因此输出被延迟。

7727b8b4-3557-11ed-ba43-dac502259ad0.png

模块端口声明

//synthesisverilog_input_versionverilog_2001
moduletop_module(
inputclk,
inputa,
inputb,
outputwireout_assign,
outputregout_always_comb,
outputregout_always_ff);

题目解析

这道题难度不大,主要时区分三种方式。

moduletop_module(
inputlogicclk,
inputlogica,
inputlogicb,
outputwirelogicout_assign,
outputlogicout_always_comb,
outputlogicout_always_ff);

assignout_assign=a^b;

always_combbegin
out_always_comb=a^b;
end

always_ff@(posedgeclk)begin
out_always_ff<= a ^ b;
    end

endmodule



775f175a-3557-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

778b72be-3557-11ed-ba43-dac502259ad0.png

从仿真的波形图可以看出,out_always_ff比其他两个输出延迟了一个时钟周期,这就是非阻塞性赋值带来的。

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 30-Always if

if语句通常创建一个2 对 1 多路复用器,如果条件为真则选择一个输入,如果条件为假则选择另一个输入。

下面给出了一个基本的if语句和其综合出来的电路。

always@(*)begin
if(condition)begin
out=x;
end
elsebegin
out=y;
end
end

这与下面使用条件运算符连续赋值的语句是等价的:

assignout=(condition)?x:y;

但是,过程if语句使用不当可能会引入新的错误,只有out在所有的条件下都被赋值才会生成正确的组合电路。

题目说明

构建一个在a和b之间进行选择的 2 对 1 多路复用器。如果sel_b1和sel_b2都为真,则选择b 。其他情况输出a。请使用两种方法作答,一次使用assign赋值,一次使用if语句。

79ce78aa-3557-11ed-ba43-dac502259ad0.png

模块端口声明

moduletop_module(
inputa,
inputb,
inputsel_b1,
inputsel_b2,
outputwireout_assign,
outputregout_always);

题目解析

本题考查的是if语句的简单用法,使用条件运算符作为对比,入门练习题。

moduletop_module(
inputlogica,b,
inputsel_b1,sel_b2,
outputwirelogicout_assign,
outputlogicout_always);

assignout_assign=(sel_b1&sel_b2)?b:a;

always_comb
begin
if(sel_b1&sel_b2)
out_always=b;
else
out_always=a;
end

endmodule

7a00b9fa-3557-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

7a81dcf6-3557-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 31-Always_if2

常见的错误来源:如何避免引入锁存器

在设计电路时,必须首先具体考虑电路:

1、我想实现一个逻辑门;

2、我想实现一个具有输入并产生输出的组合逻辑块;

3、我想实现一组组合逻辑,紧接着一组触发器。

不要上来就写代码,这样往往与你想象的电路相差很远。

7aea6636-3557-11ed-ba43-dac502259ad0.png

if(cpu_overheated)thenshut_off_computer=1;
if(~arrived)thenkeep_driving=~gas_tank_empty;

除了你指定的情况以外,会发生些什么,答案是什么也不会发生,输出保持不变。而这往往就导致了电路的错误,所以说语法正确的代码不一定能产生合理的电路(组合逻辑+触发器)。

输出保持不变,这就意味着电路需要记住当前状态,从而产生锁存器。组合逻辑(比如逻辑门)不能记住任何状态。

题目说明

以下代码包含创建锁存器的不正确行为。修复错误~

always@(*)begin
if(cpu_overheated)
shut_off_computer=1;
end

always@(*)begin
if(~arrived)
keep_driving=~gas_tank_empty;
end
7aea6636-3557-11ed-ba43-dac502259ad0.png 

模块端口声明

moduletop_module(
inputcpu_overheated,
outputregshut_off_computer,
inputarrived,
inputgas_tank_empty,
outputregkeep_driving);

题目解析

这个题目的核心是修复由于各种原因在组合电路中引入的锁存器代码,理解了前面说的产生锁存器的原因,看这个代码还是比较好找出问题的,尽量补全if语句的条件。

moduletop_module(
inputlogiccpu_overheated,
outputlogicshut_off_computer,
inputlogicarrived,
inputlogicgas_tank_empty,
outputlogickeep_driving
);

always_combbegin
if(cpu_overheated)
shut_off_computer=1;
else
shut_off_computer=0;
end

always_combbegin
if(~arrived)
keep_driving=~gas_tank_empty;
else
keep_driving=0;
end

endmodule


7b597b98-3557-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

7b8f3aa8-3557-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

总结

今天的几道题就结束了,整体难度不大,逐渐的在学习新知识~




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    1048

    浏览量

    86752
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114113
  • 数字电路
    +关注

    关注

    193

    文章

    1648

    浏览量

    83024
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    贴片电容精度J±5%的一些详细知识

    贴片电容精度J±5%表示电容的实际值与标称值之间的偏差范围在±5%以内 ,以下是关于贴片电容精度J±5%的一些详细知识、精度等级含义 J±5% :字母“J”在贴片电容的标识中通常表示标称精度
    的头像 发表于 11-20 14:38 120次阅读
    贴片电容精度J±5%的<b class='flag-5'>一些</b>详细<b class='flag-5'>知识</b>

    vivado时序分析相关经验

    vivado综合后时序为例主要是有两种原因导致: 1,太多的逻辑级 2,太高的扇出 分析时序违例的具体位置以及原因可以使用一些tcl命令方便快速得到路径信息
    发表于 10-30 06:58

    蜂鸟E203的浮点指令集F的一些实现细节

    降低功耗,因此如果多个IP核运算周期设计的不致,如乘法两个周期,加法个周期时,注意需要让乘法模块的clken多延时个周期。而为了节省片上面积且改善时序,我们参考了
    发表于 10-24 08:57

    Vivado浮点数IP核的一些设置注意点

    : 总结 本文介绍的内容是为了完成基础功能:对蜂鸟E203 RISC-V内核的微架构实现进行定优化,在添加F拓展的过程中的一些记录。
    发表于 10-24 06:25

    上电时GPIO控制的LED偶尔诡异地亮了一下

    快速上下电时,主控1.8V的GPIO控制的LED会亮一下。放久点再上电则不会异常亮。仔细排查发现1.8V比0.9V先上电,再深入排查发现快速上下电时1.8V电源的RC延时使能失效,上电时序异常,主控工作异常。
    的头像 发表于 06-18 14:16 614次阅读
    上电时GPIO控制的LED偶尔诡异地亮了<b class='flag-5'>一下</b>

    数字IC设计:方法、技巧与实践

    了如何在RTL设计中考虑综合和后端设计的问题;然后,给出了一些最常见的设计实例和代码;最后,介绍了仿真的相关知识。第5章为逻辑综合和相关技术。主要
    发表于 05-28 16:06

    极海APM32F407 uc/os3学习笔记之任务管理介绍

    最近了解了uc/os3这个操作系统,上篇介绍了uc/os3如何正确移植到APM32F407开发板上,根据我最近学到的一些知识,这篇文章主要介绍一下
    的头像 发表于 05-24 14:37 796次阅读
    极海APM32F407 uc/os3学习笔记之任务管理<b class='flag-5'>介绍</b>

    Debian和Ubuntu哪个好一些

    兼容性对比Debian和Ubuntu哪个好一些,并为您揭示如何通过RAKsmart服务器释放Linux系统的最大潜能。
    的头像 发表于 05-07 10:58 848次阅读

    介绍一下三相组合式过电压保护器的特点

    介绍一下三相组合式过电压保护器的特点 1、三相组合式过电压保护器采用氧化锌非线性电阻和放电间隙相组合的结构,使二者互为保护。放电间隙使氧化锌
    的头像 发表于 04-07 11:24 528次阅读

    树莓派在自动化控制项目中的一些潜在应用

    自动化控制项目中的一些潜在应用。之前,我们已经为Arduino平台探讨了相同的话题。我们确定Arduino是个出色的教育工具,但由于一些限制,它无法在工业环境中完全
    的头像 发表于 03-25 09:45 473次阅读
    树莓派在自动化控制项目中的<b class='flag-5'>一些</b>潜在应用

    收藏的一些库存,直流无刷技术+源码+论文(建议打包)

    这也是我网络上淘过来收藏的一些资料,免费跟大家起分享一下,建议下载哦,收藏不易
    发表于 03-17 20:17

    map指令简单介绍

    当然这里写的都是官方文档是已经写过的,我简单一下哈。
    的头像 发表于 02-13 09:54 673次阅读

    为什么你的串口总是丢一些特殊字符?

    导读在嵌入式开发和物联网应用中,Linux系统的串口通信至关重要。本文将简单介绍Linux串口设备的命名规则和termios结构体,并解析终端的三种工作模式,帮助开发者更好地掌握Linux串口编程
    的头像 发表于 02-06 13:26 617次阅读
    为什么你的串口总是丢<b class='flag-5'>一些</b>特殊字符?

    谁能详细介绍一下track-and-hold

    在运放和ADC芯片的数据手册中经常看到track-and-hold,谁能详细介绍一下track-and-hold?
    发表于 01-20 09:10

    “碰一下”支付背后的4G技术

    不知道你是否有留意,近期,在线下支付场景中,多了个支付宝“碰一下”支付的设备,只需要“解锁手机—碰一下—确认”即可完成支付,对比打开付款码支付,步骤确实更加简洁。
    的头像 发表于 01-03 16:27 4993次阅读