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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker 常用命令大全

    docker 常用命令大全Docker常用命令大全

    2022年5月13日
    52
  • windows的定时任务设置

    windows的定时任务设置

    2021年11月15日
    54
  • CentOS6.5安装Python 2.7.10「建议收藏」

    CentOS6.5安装Python 2.7.10「建议收藏」HowtoinstallpythoninterpreteronCentOS6.5

    2022年6月23日
    30
  • gcc命令的常用选项_curl常用命令及参数

    gcc命令的常用选项_curl常用命令及参数gcc是GUNC和C++编译器,我们通常使用GCC时,编译器会依次做如下工作:preprocess(预处理),compilation(编译),assembly(汇编),link(链接)。gcc提供了一些选项参数能够让编译器停在某个过程(如编译过程)。

    2022年10月13日
    3
  • 手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]

    手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]修改手机ntp服务器ip地址内容精选换一换本文介绍使用云手机服务时需要了解的基本概念。云手机是一台包含原生安卓操作系统,具有虚拟手机功能的云服务器,简单来说,云手机=云服务器+AndroidOS。您可以远程实时控制云手机,实现安卓APP的云端运行;也可以基于云手机的基础算力,高效搭建应用,如云游戏、移动办公、直播互娱等场景。服务器是用来提供云手机的物理服务器。云手机目前以服务器您可以直接修改虚…

    2022年5月24日
    64
  • 编程题:分苹果_同学分苹果的小学题

    编程题:分苹果_同学分苹果的小学题题目描述n只奶牛坐在一排,每个奶牛拥有ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出-1。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1&lt;=n&lt;=100),接下来的一行包含n个整数ai(1&l…

    2022年10月12日
    3

发表回复

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

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