logic - Verilog 中的第一个非零元素编码器

标签 logic verilog encoder

假设我有一个包含二进制数的数组 A,例如[0 0 1 0 1 1]。现在我想构建一个编码器,它可以识别数组 A 中第一个“1”的位置。例如,如果我们将索引 1 赋予该数组中的第一个元素,则逻辑应该为数组 A 输出 3。有什么优雅的方法吗?我想一种方法是使用 ROM,但是如何用 Verilog 编写它呢?使用查找表?

最佳答案

您可以使用generate来自动构建组合逻辑,以实现所需的任何编码。以下示例返回最高设置位的索引,如果没有设置位,则返回 -1。

generate 语句用于展开循环。循环的每个阶段都可以创建循环索引和一些输入向量位的任意函数。由于第一级的输出是下一级的输入,因此它形成了逐渐更复杂的组合逻辑。综合工具用于以最有效的方式最小化、打包和组合多级组合逻辑。

例如,在 Xilinx Vivado 中,以下示例将 16 位输入减少为仅两个 6 输入 LUT 级,而不是 16 个级联 2:1 多路复用器。

module highbit #(
    parameter OUT_WIDTH = 4, // out uses one extra bit for not-found
    parameter IN_WIDTH = 1<<(OUT_WIDTH-1)
) (
    input [IN_WIDTH-1:0]in,
    output [OUT_WIDTH-1:0]out
);

wire [OUT_WIDTH-1:0]out_stage[0:IN_WIDTH];
assign out_stage[0] = ~0; // desired default output if no bits set
generate genvar i;
    for(i=0; i<IN_WIDTH; i=i+1)
        assign out_stage[i+1] = in[i] ? i : out_stage[i]; 
endgenerate
assign out = out_stage[IN_WIDTH];

endmodule

关于logic - Verilog 中的第一个非零元素编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230450/

相关文章:

java - 这段逻辑是怎么回事? Java,括号

algorithm - 对用户输入的数字进行统计

verilog - 在verilog中使用显示

java - 将 int 值转换为字母值

php - 最佳 PHP 编码器

java - 如何使用android中的回收器 View 将事件放入日历中

java - 如何使用 JUnit 测试 Java Web 服务?

始终 block 的灵敏度列表中的 Verilog 多个信号变化

verilog - 有没有办法在 Verilog 中执行嵌套的生成语句?

STM32 HAL Nucleo F446RE 正交编码器