Verilog语言入门

基础#号后面加延迟时间,单位为一个单位时间b表示二进制、d表示十进制、o表示八进制、h表示十六进制十进制可以表示0-9,其他三种除了原有的表示外新增了X->逻辑不定态,Z->高阻态Verilog数值集合由:0代表逻辑0或假状态,1代表逻辑1或真状态,X代表逻辑不定态,Z代表高阻态表示格式:<位宽>’<基数><数值&…

大家好,又见面了,我是你们的朋友全栈君。

基础

  • #号后面加延迟时间,单位为一个单位时间
  • b 表示二进制、d 表示十进制、o 表示八进制、h 表示十六进制
  • 十进制可以表示 0-9,其他三种除了原有的表示外新增了 X->逻辑不定态,Z->高阻态
  • Verilog 数值集合由:0 代表逻辑 0 或假状态,1 代表逻辑 1 或真状态,X 代表逻辑不定态,Z 代表高阻态
  • 表示格式:<位宽>’<基数><数值>
    • 位宽:描述常量所含位数的十进制整数,可选项
    • 基数:可选项,B 为二进制,O 为八进制,H 为十六进制,D 为十进制,默认此项缺省为十进制
    • 数值:对于基数为 D 或者 d 的情况,数值符可以为任何十进制数,但不可以是 X 或 Z
  • 约减运算符:同一个数的低位->高位依次参加位运算,得到的结果为 1 位的二进制数
  • 移位运算符:<<左移运算符,>>右移运算符,补 0

Verilog 内置门级结构:

门声明语句格式:
<门的类型>[<驱动能力><延时>]<门实例 1>[,<门实例 2>,…<门实例 n>];

  1. and 与门
  2. nand 与非门
  3. nor 或非门
  4. or 或门
  5. xor 异或门
  6. xnor 异或非门
  7. buf 缓冲器
  8. not 非门

wire 与 reg 的区别

根据语义进行理解,wire 是连线,表示内部节点或者连线,assign语句中被赋值的信号必须是wire类型;reg 为 register 也就是寄存器,可以用来暂存内容,而且在always块中被赋值的信号必须定义为reg型。

always @()的使用

  • always @ (posedge CLK or negedge RSTn):当 CLK 上升沿或者 RSTn 下降沿触发。(比较符合我们对基础的时序逻辑电路如触发器的一贯触发条件理解)
  • always @ (A):当 A 变化的时候触发,在 A 的前面没有加上 posedge 或者 negedge 的时候,表示 A 变化会触发,无上升下降等条件限制。
  • always @(*):跟正则表达式中 *的理解一致,代表所有,也即是在所有时候都触发了,这时也就可以看做是组合逻辑电路。

推荐的用法模板

always @ ( posedge CLK or negedge RSTn )
    if( !RSTn )
        begin
        i <= 4'd0;
        ....... end
    else
        case( i )
            0:
            ....... 
        endcase

因为在Verilog语言中,程序是并发执行的,如果我们去看一大段并发执行的代码,估计够呛,所以这里我也认真思考了作者提供的“基于仿顺序操作想法”的模板,我们可以清晰的分析出在每个不同的条件下会触发哪些语句的实现并且有条理的将这些语句联想出一个功能。

=赋值以及<=赋值

下面一段是作者原话:

基本上要搞懂这两个赋值操作符号的作用,就必须把“时序”的概念搞懂先。
一般上,参考书只是告诉我们一个是非阻塞,一个是非阻塞 .... 说实话,
当笔者把厚厚的参考书吃完以后,笔者完全还搞不懂究竟参考书都在说什么。
如果从笔者的角度去理解的话,只有在时序的活动中才可以很清楚的看清它们的区别。
宏观上,如同参考书中所说的一样;
微观上,在时序中“=”是引发“即时事件”,“<=”则是引发“时间点事件”。

可是貌似在看完这段话后,我发现还是没有理解透彻。。。因此自己去查阅了其他的资料。

概念理解

  • 阻塞:如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能执行,就像被阻塞了一样,因此称为阻塞赋值方式。
  • 非阻塞:多条非阻塞语句赋值在过程快中同时完成赋值操作,多条语句相当于同时执行。

示例

  • 阻塞示例
module ifblock(clk,a,b,c);
input clk,a;
output b,c;
reg rb = 0,rc = 0;
assign c = rc;
assign b = rb;
always @(posedge clk)
    begin
        rb = a;//阻塞赋值
        rc = rb;
    end
endmodule
  • 阻塞RTL视图
    在这里插入图片描述
  • 非阻塞示例
module ifblock(clk,a,b,c);
input clk,a;
output b,c;
reg rb = 0,rc = 0;
assign c = rc;
assign b = rb;
always @(posedge clk)
    begin
        rb <= a;//非阻塞赋值
        rc <= rb;
    end
endmodule
  • 非阻塞RTL视图
    在这里插入图片描述
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125652.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • flash 外国小游戏教程网站[通俗易懂]

    flash 外国小游戏教程网站[通俗易懂]http://www.tutorialized.com/tutorial/game-tutorial-part-1-character-movement/44240  相关的小游戏制作教程:有兴趣可以看看 http://www.emanueleferonato.com/2007/05/15/create-a-flash-racing-game-tutorial/

    2022年10月29日
  • 分布式锁简单入门以及三种实现方式介绍

    分布式锁简单入门以及三种实现方式介绍很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的东西也是一样的和Java多线程相关的!做好准备,马上开车!学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源的一种线程同步机制。

  • 基础工具之消息队列、线程池、缓冲区抽象、事件循环和日志实现

    正所谓“工欲善其事,必先利其器”,我们在实现通信设计任务的过程中需要一些基础工具来帮助我们搭建部分基础组件,这些基础工具包括消息队列,线程池,缓冲区抽象,事件循环和日志工具。接下来对这部分基础工具进

    2021年12月28日
  • Mysql表分区_oracle表分区优缺点

    Mysql表分区_oracle表分区优缺点一、MySQL分区表介绍分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果。分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM、NDB等都支持分区。但是并不是所有的存储引擎都支持,如CSV、FEDORATED、MERGE等就不支持分区。在

  • 关于Office弹窗+横幅提示“你的许可证不是正版,并且你可能是盗版软件的受害者…”的解决方案——以Office2019为例

    关于Office弹窗+横幅提示“你的许可证不是正版,并且你可能是盗版软件的受害者…”的解决方案——以Office2019为例文章目录遭遇问题未成功解决的错误方法解决方案附录-各个版本Office对应更换密钥Office2019版本Office2016版本Office2013版本遭遇问题        前一段时间,博主电脑的Office2019软件忽然开始在每次打开时弹出“你的许可证不是正版,并且你可能是盗版软件的受害者。使用正版Office,避免干扰并保护你的文件安全。”的弹窗+横幅提示,因为博主要准备答辩暂且搁置了这个问题。直到今天撰写材料

  • Codeforces 12D Ball 树形阵列模拟3排序元素

    Codeforces 12D Ball 树形阵列模拟3排序元素

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号