Verilog HDL 用户自定义原语

用户自定义原语(UDP)

在 UDP 中不能调用(实例引用)其他模块或者其他原语(类似门级建模)

类型有:

  1. 表示组合逻辑的 UDP。输出仅取决于输入信号的组合逻辑。四选一的多路选择器是典型的表示组合逻辑的 UDP的例子;
  2. 表示时序逻辑的 UDP。下一个输出值不但取决于当前的输入值 , 还取决于当前的内部状态。锁存器和触发器(ff)是两个典利的表示时序逻辑的 UDP的例子。

UDP的定义以primitive为开始,然后指定原语名称、输出端口和输入端口。在端口声明部分将端口声明为output 或input。在表示时序的UDP中输出端口必须被声明为reg类型, 而且还需要有一条可选的initial 语句,用 于初始化时序逻辑UDP 的输出端口。UDP 状态表是 UDP 中最重要的部分, 它以关键字 table 开始,以关键字endtable结束。状态表定义了如何根据输入状态和当前状态得到输出值,该表也是一个查找表,类似于逻辑真值表。原语定义以关键endprimitive结束。
在这里插入图片描述

定义规则

1位的输入和输出。
在这里插入图片描述
状态表不能处理高阻态的情况。

表示组合逻辑的UDP

表示组合逻辑的 UDP 根据 UDP 内部所列出的 表示输入和输出关系的状态表由输 入确定输出。

与门UDP:

在这里插入图片描述
注意table只写数据部分就行。
也能用 ANSIC风格的接口定义。

状态表项

在这里插入图片描述
1.状态表每一行中 input类形的顺序必须与它们在端口列表中的出现顺序相同。设计 UDP 时必须牢记这一点,这一点 非常重要 。 设计者经常搞错输入的顺序 ,因而得到错误的输出值
2. 输人和输出以":"分隔
3. 状态表的每一行以 ; 结束
4. 能够产生确定输出值的所有输入项组合都必须在状态表中列出, 否则,如果在状态表各行中找不到与这组输入对应的项,相应的输出就是 x 商业模型中经常使用默认输出值 x.,
注意 , udp_and的状态表不处理a或b的值为x的情况。但是修改了相应状态表列表项之后可以显示。 不能用z(z用x代替)

表示时序逻辑的UDP

上例中, 当 a 和 b 两个输人的其中一个为1时, 不论另一个输入是什么值, 输出都是 1 不影响输出值的输入项称为无关项。可以用符号 ‘’?" 来表示。符号 “?” 会被自动展开为 0、1 或 x。

UDP的调用

在这里插入图片描述
可以看到原语引用时不需要像实例引用那样给出实例名称。

表示时序逻辑的UDP

表示时序逻辑的 UDP 与表示组合逻辑的UDP 在定义形式和行为功能上有所不同。表示时序逻辑的 UDP的不同之处在于以下几点:
1 表示时序逻辑的UDP 的输出必须声明为reg 类型
2 表示时序逻辑的UDP 的输出可以用initial初始化
3 状态表的格式也稍有不同
在这里插入图片描述

4 表示时序逻辑的UDP 的状态表的每行由三部分组成
5.状态表的输入项可以是电平或者跳变沿的形式
6. 当前状态就是输出寄存器的当前值
7.下一个状态由输入和当前状态计算得出。下一状态的值就成为输出寄存器的新值
8.表示时序逻捐的UDP 必须在状态表各行的输入项中列出所有可能的( 输入)组合。以避免出现不确定的输出值。

如果表示时序逻辑的 UDP 是对输人信号电平敏感的,就称为电平敏感的表示时序逻辑的UDP。如果表示时序逻辑的 UDP 是对输入信号跳变沿敏感的,就称为边沿敏感的表示时序逻辑的 UDP。

电平敏感
在这里插入图片描述
?表示不会影响下一个状态的输出
边沿敏感:
在这里插入图片描述
自定义原语中用两位数来表示边沿跳变。
在这里插入图片描述
这里也能看出在UDP中是没有z状态存在的。
在这里插入图片描述

UDP表中的缩写符号

Verilog 提供了电平和跳变沿的缩写符号 ,以便用简洁的方式描述 UDP 表 。前文已经讨论过符号? 和-
下表总结了所有的缩写符以及它们的含义。
在这里插入图片描述因此可以重写上面的边沿敏感的状态表。

总结

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值