【Verilog】--初学语法2

assign

在Verilog中,assgin 语句用于连续赋值,其语法不包括 begin 和 end 块。assgin 语句是用来将一个逻辑表达式赋值给一个网线(wire)。

assgin 用于连续赋值,不需要 begin 和 end ,而过程块(如 always)需要使用 begin 和 end 来标识代码块的起始和结束。

每个 assign 语句是独立的,用来描述一个信号的赋值关系。如果在 assign 语句中使用了begin 和 end,Verilog解析器会认为这是一个语法错误,因为 assign 不需要这种结构。

assign 语句不能对同一个输出端口多次赋值,这会导致语法错误。

wire

到目前为止,电路已经足够简单,输出只是输入的简单功能。随着电路变得越来越复杂,需要使用电线(wire)将内部组件连接在一起。声明电线时,应该在模块主体内部进行,并确保在首次使用之前进行正确的定义和连接。

reg

reg [7:0] mem1 [255:0];   : mem1 包含了 256 个 8 位宽的寄存器向量。

reg mem2 [28:0];   : mem2 包含了 29 个 1 位宽的寄存器。

或运算

位或运算:使用 | 操作符对 a 和 b 进行位或运算,assign out_or_bitwise = a | b 。

逻辑或运算:使用 || 操作符对 a 和 b 进行逻辑或运算,assign out_or_logical = a || b 。

按位异或(XOR):使用 ^ 操作符对 a 和 b 进行按位异或运算,assign out_xor_bitwise = a ^ b 。

实例化

实例化就是如果是输入,()里面的数据就输入到端口;如果是输出,()里面的就储存代码运行所输出的数据。

减法操作

减法操作相当于对输入 b 进行按位取反(XOR操作)然后加1,这是因为计算机使用的是二进制补码。为了计算 a - b,可以将其转换为 a +(-b)。而 -b 就是 b 的二进制补码表示。

(1)先对 b 进行按位取反,得到 ~b 。

(2)然后对 ~b 加 1,即 ~b + 1 。

assign & always块

assign 赋值语句左侧必须是 wire 类型,always 块左侧必须是 reg 类型。

当按位与操作符仅用于一个位向量时,它会对该位向量的所有位进行与操作,然后返回一个单个位。

& a [3:0]     // AND: a[3] & a[2] & a[1] & a[0] . Equivalent to ( a[3:0] == 4'hf )

对位向量 a [3:0] 中的所有位进行按位与操作,然后返回结果。

 | b [3:0]     // OR: b[3] | b[2] | b[1] | b[0] . Equivalent to ( b[3:0] != 4'h0 )

对位向量 b [3:0] 中的所有位进行按位或操作,然后返回结果。

 ^ c [3:0]     // XOR: c[3] ^ c[2] ^ c[1] ^ c[0] 

对位向量 c [3:0] 中的所有位进行按位异或操作,然后返回结果。

parameter 和 integer

parameter 用于定义常量,其值在编译时确定,不能在仿真运行时改变。

可以用于定义数字、字符串或其他常量类型。

通常用于定义模块中的常量参数,如数据宽度、时钟周期等,以增加代码的灵活性和重用性。

integer 用于声明整数类型的变量,变量的值可以在仿真运行时修改。

可以使用 integer 定义单个整数变量或整数数组。

integer count;  // 声明一个整数变量
integer data[7:0];  // 声明一个8位宽的整数数组

parameter 用于声明编译时确定的常量,而 integer 用于声明运行时可变的整数变量。

每个寄存器(或者说每个变量)应当只能被一个 always @(posedge clk)  块(或者 always @(negedge clk) 块)进行赋值操作。

多个 always @(posedge clk) 块同时对 q 进行赋值操作,这会导致冲突和意外的行为。Verilog 中每个时钟边沿只能有一个 always @(posedge clk) 块来操作同一个寄存器,否则会导致仿真或综合时的不确定行为。

$ time 系统任务返回当前的仿真时间。

使用电平作为敏感信号来控制时序,即后面语句的执行需要等待某个条件为真。Verilog 中使用关键字 wait 来表示这种电平敏感情况。例如:

wait (start_enable) ;      //等待 start 信号

有限状态机

Moore有限状态机:输出仅与当前状态相关,与输入无关。输出会在一个完整的时钟周期内保持稳定,即使此时输入信号有变化,输出也不会变化。输入对输出的影响要到下一个时钟周期才能反映出来。这也是 Moore 型状态机的一个重要特点:输入与输出是隔离开来的。

Mealy有限状态机:输出不仅取决于当前状态,还取决于输入信号。Mealy 型状态机的输出是在输入信号变化以后立刻发生变化,且输入变化可能出现在任何状态的时钟周期内。因此,同种逻辑下,Mealy 型状态机输出对输入的响应会比 Moore 型状态机早一个时钟周期。

三段式状态机

        首先,根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值,代码可读性更好.

(1)状态机第一段,时序逻辑,非阻塞赋值,传递寄存器的状态。

(2)状态机第二段,组合逻辑,阻塞赋值,根据当前状态和当前输入,确定下一个状态机的状态。

(3)状态机第三代,时序逻辑,非阻塞赋值,因为是 Mealy 型状态机,根据当前状态和当前输入,确定输出信号。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值