Verilog语言入门

基础

  • #号后面加延迟时间,单位为一个单位时间
  • 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视图
    Verilog语言入门_第1张图片
  • 非阻塞示例
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视图
    Verilog语言入门_第2张图片

你可能感兴趣的:(EDA,Verilog,入门,FPGA)