欢迎光临散文网 会员登陆 & 注册

HDLBits (97) — 边缘触发信号捕获寄存器

2022-04-06 17:58 作者:僚机Wingplane  | 我要投稿

本题链接:

https://hdlbits.01xz.net/wiki/Edgecapture

对于32位向量中的每一位,边缘触发信号捕获意为在输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”这词意味着输出将保持为1,直到寄存器复位(同步复位)。
每个输出位的行为就像一个 SR 触发器: 在发生1到0转换后,输出位应该在(1)周期后被设置(set)。当复位为高时,输出位应该在上升沿的时候复位(reset)(为0)。如果上述两个事件同时发生,则优先进行复位操作。在下面举例的波形最后4个周期中,‘ reset’事件会比‘ set’事件提前一个周期发生,所以这里没有冲突。

在下面的示例波形中,为了清晰起见,再次分别显示了复reset, in[1] 和 out[1]


题目

答案

输出波形

过程结构语句有 2 种,initial 与 always 语句。它们是行为级建模的 2 种基本语句。

一个模块中可以包含多个 initial 和 always 语句,但 2 种语句不能嵌套使用。

这些语句在模块间并行执行,与其在模块的前后顺序没有关系。

但是 initial 语句或 always 语句内部可以理解为是顺序执行的(非阻塞赋值除外)。

每个 initial 语句或 always 语句都会产生一个独立的控制流,执行时间都是从 0 时刻开始。

always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。

由于循环执行的特点,always 语句多用于仿真时钟的产生,信号行为的检测等。

在 Verilog 中,事件是指某一个 reg 或 wire 型变量发生了值的变化。

基于事件触发的时序控制又主要分为以下几种。

一般事件控制

事件控制用符号 @ 表示。

语句执行的条件是信号的值发生特定的变化。

关键字 posedge 指信号发生边沿正向跳变,negedge 指信号发生负向边沿跳变,未指明跳变方向时,则 2 种情况的边沿变化都会触发相关事件。例如:

命名事件控制

用户可以声明 event(事件)类型的变量,并触发该变量来识别该事件是否发生。命名事件用关键字 event 来声明,触发信号用 -> 表示。例如:

敏感列表

当多个信号或事件中任意一个发生变化都能够触发语句的执行时,Verilog 中使用"或"表达式来描述这种情况,用关键字 or 连接多个事件或信号。这些事件或信号组成的列表称为"敏感列表"。当然,or 也可以用逗号 , 来代替。例如:

当组合逻辑输入变量很多时,那么编写敏感列表会很繁琐。此时,更为简洁的写法是 @* 或 @(*),表示对语句块中的所有输入变量的变化都是敏感的。例如:

参考内容:

4.1 Verilog 过程结构 | 菜鸟教程:

https://www.runoob.com/w3cnote/verilog-process-structure.html

4.3 Verilog 时序控制 | 菜鸟教程:

https://www.runoob.com/w3cnote/verilog-timing-control.html

HDLBits (97) — 边缘触发信号捕获寄存器的评论 (共 条)

分享到微博请遵守国家法律