Verilog 优先级编码器17 Mar 2025 | 6 分钟阅读 编码器是一个组合电路。它有2^n个输入线和n个输出线。它获取这2^n个输入数据,并将它们编码为n位数据。它产生与高电平激活的输入线等效的二进制代码。 但是,普通的编码器有一个问题。如果有多条输入线具有逻辑值1,它将编码错误的输出。它只在其中一个输入为高电平时有效。在多个高电平输入的情况下,它会发生故障。 因此,为了解决上述缺点,我们“优先考虑”每个输入的级别。因此,如果选择了多个输入线,则输出代码将对应于具有最高指定优先级的输入。这种类型的编码器称为 优先级编码器。 示例 硬件原理图 ![]() 测试平台 测试平台是一个HDL模块,用于测试另一个模块,称为 被测设备(DUT)。 测试平台包含将输入应用于 DUT 并检查是否产生正确输出的语句。 输入和期望的输出模式称为 测试向量。 以下是优先级编码器的测试平台 现在,我们将看到如何在 Verilog 中使用不同的建模风格设计 4:2 优先级编码器。 1. 门级建模这实际上是设计人员用于实现最低级别模块的最低抽象层,因为开关级别建模不是很常见。顾名思义,门级建模利用 Verilog 中可用的门原语。 下面我们使用门级建模描述一个优先级编码器 ![]() 从电路中,我们可以观察到设计需要一个AND门,两个OR门和一个NOT门。 让我们开始编码。 4:2 优先级编码器的门级建模 与任何Verilog代码一样,我们首先声明模块和终端端口。 请注意,我们首先声明输出,然后是输入,因为内置门也遵循相同的模式。 让我们声明输入和输出端口。 现在,我们可以声明中间信号。 这些是不属于终端端口的信号。 从上面的电路来看,来自NOT门和AND门的信号被视为中间信号。 现在我们定义逻辑门。 我们使用gate(<outputs>,<inputs>)语法来使用 Verilog 中的内置门。 所以,我们的最终代码看起来像 2. 数据流建模在这种建模技术中,我们使用逻辑方程来描述从输入到输出的数据流。 我们无需担心构成电路的门。 因此,由于无需了解实际的物理布局,因此使用此抽象级别构造复杂的电路要容易得多。 它使用assign关键字,通过使用逻辑方程来描述电路。 优先级编码器的逻辑方程是 4:2优先级编码器的数据流建模 和往常一样,我们从模块和端口声明开始 现在,我们必须使用 assign 来描述数据流向输出。 因此,我们的最终代码 3. 行为级建模行为级建模是 Verilog HDL 中最高的抽象级别。 我们只需知道电路的工作方式即可描述电路。 我们不需要知道逻辑电路或逻辑方程。 下面给出一个真值表,例如
使用此真值表,我们可以使用 Verilog 设计我们的优先级编码器。 4:2优先级编码器的行为级建模 让我们从模块和端口声明开始。 我们必须在行为级建模中将输出声明为 reg。 由于我们在此建模样式中使用 过程赋值,因此我们必须确保输出保持其值,直到将下一个值赋予它们。 我们在括号中声明的是敏感列表。 在这里,取决于 Y 的值。 always 关键字将确保每次触发敏感列表时,语句都会被执行。 在 begin 和 end 之间,我们编写系统如何工作的过程 case 将表达式与一系列 case 进行比较,并执行与第一个匹配的 case 关联的语句或语句组。 我们使用了 casex,它是 case 的特殊版本。 这会将 x 和 z 值视为无关项。 4. 结构化建模结构化建模描述了数字系统的硬件结构。 它在某种程度上类似于门级建模。 唯一的区别是它不包含任何内置门。 我们为每个门创建单独的模块,然后集成以形成整个电路。 逻辑电路 在 4:2 优先级编码器的情况下,我们需要两个 OR 门,一个 AND 门和一个 NOT 门。 ![]() 4:2 优先级编码器的结构化建模 为了开始编写代码,我们将首先构建 OR 门。 我们将 module 声明为 or_gate。 然后,我们声明输入和输出端口 然后,我们使用 assign 语句来编写 OR 的逻辑表达式。 因此,我们的OR门模块将是 类似地,我们对AND门进行操作 和NOT门 注意:我们将变量保持在一个模块中分配输入和输出,这与其他模块不同。 它可以确保在模拟期间不会发生信号混合。现在,我们可以继续将优先级编码器描述为顶级模块。 与往常一样,从模块和端口声明开始。 现在,将这些逻辑门的各个模块组合到一个顶级模块中。 这是借助模块实例化概念完成的,在该概念中,使用较低的模块构建顶级模块。 使用逻辑电路,我们将通过 按端口名称实例化 在此顶部中实例化较低的模块。 因此,结构样式中优先级编码器的 Verilog 代码是 下一个主题Verilog 多路复用器 |
我们请求您订阅我们的新闻通讯以获取最新更新。