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视图
    在这里插入图片描述
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gitlab与github区别_gitlab和github账号互通么

    gitlab与github区别_gitlab和github账号互通么最近写项目不用svn也不用github了,而是用gitlab,其实和github使用方法一样,不过操作界面比github更丰富,功能更多……然后我们用的阿里云的代码管理正是gitlab,创建我们公司的私有项目!那么讲讲github和gitlab的区别。GitLab:利用RubyonRail开发的开源应用程序,实现一个自托管的Git项目仓库,可以通过web界面进行访问公开的或者私人项目。RubyonRail是一个使你开发、部署、维护web应用程序变得简单的框架。GitLab拥有与GitHub

    2025年8月18日
    0
  • android 如何打开s3db,Android开发教程:使用已有的SQL数据库

    android 如何打开s3db,Android开发教程:使用已有的SQL数据库极品好儿媳全文阅读,燃料乙醇放量,嘉兴办公家具,应向阳,58会展网,证书挂靠,鱼缸清洗,qq蜡笔小新头像我在sqliteadmin创建好数据库StuDB,里面的表如下:650)this.width=650;”>将创建好的数据库在DDMS中点击650)this.width=650;”>导入到data/data/程序的包名/650)this.width=650;”>SQLit…

    2022年6月4日
    34
  • 通过Windows进程ID获取窗口句柄

    通过Windows进程ID获取窗口句柄通过Windows进程ID获取窗口句柄方法一:使用EnumWindows的方式///&lt;枚举窗口参数typedefstruct{HWNDhwndWindow;//窗口句柄DWORDdwProcessID;//进程ID}EnumWindowsArg;///&lt;枚举窗口回调函数BOOLCALLBACKEnumWindowsProc(…

    2022年7月21日
    15
  • 原生JS 实现页面元素的拖动 拖拽

    原生JS 实现页面元素的拖动 拖拽原生JS实现页面元素的拖拽1.

    2022年6月22日
    86
  • CSS导航条制作心得

    CSS导航条制作心得今天学习了导航条的制作,感觉收获很大!学习了一段时间的css和html。之前都是在慕课网上面看视频学习的,感觉收获不是特别大,有一点慢,效率不高。学东西还是得边做边学变想,学习编程最好能够不断地实践,毕竟实践出真知。学习了这个作者的文章http://www.missyuan.com/thread-438839-1-1.html    1.导航条放于div容器中——-ui和li来写

    2022年7月22日
    17
  • 手写一个简单的mybatis框架

    手写一个简单的mybatis框架

    2021年8月3日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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