返回介绍

15.14 同步的驱动

发布于 2020-09-09 22:55:53 字数 1463 浏览 1067 评论 0 收藏 0

时钟控制块的输出(output或inout)被用来在一个指定的时间上将值驱动到它们对应的信号。换句话说,对应的信号在指定的时钟控制事件上通过输出时滞来修改它的值。

说明一个同步驱动的语法类似于一个赋值:

statement ::= [block_identifier :] {attribute_instance} statement_item
                                                              // 引用自附录A.6.4

statement_item ::=
    ...
    | clocking_drive;

clocking_drive ::=                 // 引用自附录A.6.11
    clockvar_expression <= [cycle_delay] expression
  | cycle_delay clockvar_expression <= expression

cycle_delay ::= ## expression

clockvar ::= hierarchical_identifier

clockvar_expression ::= clockvar select

语法15-4 — 同步的驱动语法(摘录自附录A)

clockvar_expression或者是一个位选择、分片、或者是对应的信号被驱动的整个时钟控制块的输出(不允许使用串联):

dom.sig       // 整个clockvar
dom.sig[2]    // 位选择
dom.sig[8:2]  // 分片

clocking_drive生成式中的表达式可以是与对应信号类型赋值兼容的任何有效的表达式。

event_count在cycle_delay生成式中的##之后引用expression,并且是一个integral表达式,它可选地说明了在语句执行之前必须经过的时钟控制事件的数目(也就是周期)。指定一个非零的event_count会阻塞当前的进程直到经过指定数目的时钟控制事件,否则语句在当前的时间执行。event_count使用类似于周期延时操作符(参见15.10节)的语法,然而,同步的驱动使用正在被驱动的信号的时钟控制块,并且不是缺省的时钟控制。

第二种形式的同步驱动使用内部赋值语法。一个内部赋值event_count说明也会延迟赋值的执行。在这种情况下,进程不会阻塞并且在语句执行的时候计算右侧表达式。

例子:

bus.data[3:0] <= 4'h5; // 在当前周期的NBA区域驱动data
##1 bus.data <= 8'hz;  // 等待一个bus周期然后驱动data
##2; bus.data <= 2;    // 等待两个缺省时钟控制周期然后驱动data
bus.data <= ##2 r;     // 记下r的值然后再两个bus周期之后驱动data

不管驱动语句何时执行(由于event_count延时),被驱动的值仅在输出时滞指定的时间上被赋值到对应的信号。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文