Verilog语言语句介绍

Verilog语言语句介绍

  • 结构语句
    • initial语句
    • always语句
  • 赋值语句
    • 阻塞赋值
    • 非阻塞赋值
    • 使用方法
  • 条件语句
    • if_else语句
    • case语句

结构语句

共有两个重要的结构语句 initialalways

  • initial
    在模块中只执行一次,常用于测试文件的编写,用来产生仿真测试信号(激励信号),或者用于对存储器变量赋初值
  • always
    语句一直在不断地重复活动,但是只有和一定的时间控制结合在一起才有作用

initial语句

Verilog语言语句介绍_第1张图片
initial表示代码只执行一次
begin,end表示initial的开始与结束
上电后同时执行sys_clk , sys_rst_n , touch_key语句
#xx代表延时xx个单位的时钟
在这里插入图片描述
图为Modelsim 仿真截图,由图可见
开始时,因initial有sys_clk , sys_rst_n , touch_key被赋值为0,经过20nm后sys_rst_n为1(1’b1),20+10nm时touch_key为1(1’b1)……
而always作用是每10nm对sys_clk取反。

always语句

  1. 沿触发
    always的时间控制可以是沿触发也可以是电平触发,可以是单个信号也可以是多个信号,多个信号用or连接(由or连接的多个事件名或信号名组成的列表称为敏感列表)Verilog语言语句介绍_第2张图片
    注: posedage上升沿,negedge下降沿,always语句后紧跟的过程块是否执行要看触发条件是否满足,沿触发的always块常用来描述时序逻辑

  2. 电平触发
    电平触发的always块常用来描述组合逻辑
    在这里插入图片描述或者使用*代替条件,代表对后面的语句块中所有输入变量的变化都是敏感的。
    Verilog语言语句介绍_第3张图片

组合逻辑和时序逻辑复习
组合逻辑中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关
时序逻辑中,任意时刻的输出不仅取决于当时的输入信号而且还取决于电路原来的状态,或者说还与以前的输入有关,因此时序逻辑必须具备记忆功能

赋值语句

阻塞赋值

阻塞赋值,如 b=a

  • 阻塞幅值可以认为只有一个操作:计算RHS并更新LHS,在b=a中b就是LHS,a则为RHS。
  • 所谓阻塞的概念是指在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的。

可以理解为赋值语句串行执行。

非阻塞赋值

非阻塞赋值,如b <= a

  • 可以看成两个操作:
    1. 赋值开始时计算RHS;
    2. 赋值结束时更新LHS。
  • 所谓非阻塞赋值的概念是指:在计算非阻塞赋值的RHS以及更新LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS
  • 只能用于对寄存器类型的变量进行赋值,因此只能用于initial块和always块等过程块中

可以理解为赋值语句并行执行。

使用方法

在描述组合逻辑的always块中用阻塞幅值 =,综合成组合逻辑的电路结构,这种电路结构只与输入电平的变化有关系
在描述时序逻辑的always块中用非阻塞赋值 <=,综合成时序逻辑的电路结构,这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值变化
注意:在同一个always块中不要即用非阻塞幅值又用阻塞幅值,不允许在多个块中对一个变量进行赋值

条件语句

条件语句必须在过程块中使用(由initial和always语句引导的块语句)

if_else语句

同C语言相同
但是:

  1. if语句对表达式的值进行判断,若为0、x、z 则按假处理;若为 1 按真处理。
  2. if和else后面的操作语句可以用befin和end包含多个语句。
  3. 允许if语句嵌套

case语句

没有switch

  1. 分支表达式的值需要互不相同
  2. 所有表达式的位宽必须完全相等(不能用’bx代替n’bx )
  3. casez比较时不考虑表达式中的高阻态
  4. casex不考虑高阻态和不定值
    Verilog语言语句介绍_第4张图片
    default表示前面的都不符合则执行default的语句

你可能感兴趣的:(fpga)