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

    文章

    988

    浏览量

    82988
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109298
  • 数字电路
    +关注

    关注

    192

    文章

    1396

    浏览量

    79748
收藏 人收藏

    评论

    相关推荐

    什么是组合逻辑电路和时序逻辑电路?它们之间的区别是什么

    什么是组合逻辑电路和时序逻辑电路?时序逻辑电路和组合
    的头像 发表于 03-26 16:12 359次阅读

    时序逻辑电路有哪些 时序逻辑电路和组合逻辑电路区别

    产生相应的输出信号。本文将详细介绍时序逻辑电路的分类、基本原理、设计方法以及与组合逻辑电路的区别。 一、
    的头像 发表于 02-06 11:18 1005次阅读

    看懂EMC整改知识:原来竟然如此简单!|深圳比创达EMC(

    看懂EMC整改知识:原来竟然如此简单)?相信不少人是有疑问的,今天深圳市比创达电子科技有限公司就跟大家解答一下! EMC领域的三个重要规律和EMC问题三个要素EMC三个重要规律规律
    发表于 09-08 11:01

    soc中的组合逻辑时序逻辑应用说明

    芯片设计是现代电子设备的重要组成部分,其中组合逻辑时序逻辑是芯片设计中非常重要的概念。组合逻辑
    的头像 发表于 08-30 09:32 877次阅读

    时序逻辑组合逻辑的区别和使用

    今天让我跟一起来学习一下两种逻辑的区别以及使用环境。
    的头像 发表于 07-07 14:15 2245次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑</b>和<b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>的区别和使用

    组合逻辑电路的相关知识

    本篇内容主要回顾第三章组合逻辑电路的知识,虽然前面提到过组合逻辑电路是数字电路中很重要的一部分,但是学习起来相对
    的头像 发表于 05-24 14:38 1316次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>电路的相关<b class='flag-5'>知识</b>

    时序逻辑电路的分析方法

      时序逻辑电路分析和设计的基础是组合逻辑电路与触发器,所以想要分析和设计,前提就是必须熟练掌握各种常见的组合
    的头像 发表于 05-22 18:24 2143次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑</b>电路的分析方法

    时序逻辑电路设计之同步计数器

    时序电路的考察主要涉及分析与设计两个部分,上文介绍时序逻辑电路的一些分析方法,重点介绍了同步
    的头像 发表于 05-22 17:01 2026次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑</b>电路设计之同步计数器

    时序逻辑电路寄存器设计

    组合逻辑最大的缺点就是会存在竞争冒险,使用时序逻辑就可以极大地避免这种问题,从而使系统更加稳定。
    的头像 发表于 05-22 15:30 852次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑</b>电路寄存器设计

    【CMOS逻辑IC基础知识】—解密组合逻辑背后的强大用途!(上)

    在前面的芝识课堂中,我们跟大家简单介绍逻辑IC的基本知识和分类,并且特别提到CMOS逻辑IC因为成本、系统复杂度和功耗的平衡性很好,因此得
    的头像 发表于 05-08 10:40 624次阅读
    【CMOS<b class='flag-5'>逻辑</b>IC基础<b class='flag-5'>知识</b>】—解密<b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>背后的强大用途!(上)

    CMOS逻辑IC基础知识:解密组合逻辑背后的强大用途(上)

    在前面的芝识课堂中,我们跟大家简单介绍逻辑IC的基本知识和分类,并且特别提到CMOS逻辑IC因为成本、系统复杂度和功耗的平衡性很好,因此得
    的头像 发表于 05-05 09:17 435次阅读
    CMOS<b class='flag-5'>逻辑</b>IC基础<b class='flag-5'>知识</b>:解密<b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>背后的强大用途(上)

    求分享一下FlexIO时序图吗?

    引脚:FlexIO_D6 来自主控端的 SPI 固定为模式 3(即 CPOL = 1 和 CPHA = 1)。所以 uC FlexIO 将支持模式 3。 可以分享一下 FlexIO 时序图吗? 与标准 LPSPI 相比,FlexIO 有什么限制吗?
    发表于 05-04 08:17

    关于逻辑门的基本知识

    逻辑门(LogicGates)是集成电路设计的基本组件,通过晶体管或MOS管组成的简单逻辑门,可以对输入的电平(高或低)进行一些简单
    的头像 发表于 04-30 09:14 2927次阅读
    关于<b class='flag-5'>逻辑</b>门的基本<b class='flag-5'>知识</b>

    组合逻辑电路的类型

    在前面的芝识课堂中,我们跟大家简单介绍逻辑IC的基本知识和分类,并且特别提到CMOS逻辑IC因为成本、系统复杂度和功耗的平衡性很好,因此得
    的头像 发表于 04-28 09:43 2684次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>电路的类型

    分享一下用AD画PCB过程中的一些基础知识

      今天跟大家分享一下用AD画PCB过程中的一些基础知识。   完成后的PCB   通常原理图设计完成后,就开始PCB设计。有几个地方需要注意:   1.原理图设计完成后定要先评审
    发表于 04-27 16:46