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

HDLBits (29) — Always模块(组合)

2022-02-04 16:53 作者:僚机Wingplane  | 我要投稿

本题链接:

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

由于数字电路由与导线相连的逻辑门组成,任何电路都可以表示为模块和赋值语句的组合。然而,有时这不是描述电路最方便的方式。过程(始终以块为例)为描述电路提供了另一种语法。

对于合成硬件,两种类型的always块是相关的:

  • 组合: always @(*)

  • 时钟: always @(posedge clk)

组合always块相当于assign语句,因此总是有一种方法可以同时表示组合电路。选择使用哪种语法主要是哪种语法更方便。过程块内部代码的语法与外部代码的语法不同。程序块具有更丰富的语句集(例如if-then、case),不能包含连续赋值*,但也引入了许多新的非直观的出错方式。(*程序性连续作业确实存在,但与连续作业有所不同,且不可合成。)

例如,assign和组合always块描述相同的电路。两者都创建了相同的组合逻辑块。无论何时任何输入(右侧)发生变化,两者都将重新计算输出。

assign out1 = a & b | c ^ d;

always @(*) out2 = a & b | c ^ d;

对于组合始终块,始终使用(*)的灵敏度列表。明确列出信号是错误的(如果您错过了一个),并且忽略了硬件合成。如果显式指定灵敏度列表并遗漏信号,则合成的硬件仍将表现为指定了(*) ,但模拟将不会也不匹配硬件的行为。(在 SystemVerilog 中,使用 always _ comb.)

题目

使用assign语句和组合always块构建AND门。(由于assign语句和组合块的功能总是相同的,因此无法强制要求您同时使用这两种方法。但您是来练习的,对吗?…)

答案

输出波形


HDLBits (29) — Always模块(组合)的评论 (共 条)

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