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语句和组合块的功能总是相同的,因此无法强制要求您同时使用这两种方法。但您是来练习的,对吗?…)

答案

输出波形
