版本: 0.0.1
NthOne 用于查找输入向量中第 n 个置位的位置,并输出命中标志、位索引和独热码。该模块具有以下特性:
从输入向量的 bit 0 向高位扫描,选择从 0 开始编号的第 n 个置位。n=0 表示第一个 1,n=1 表示第二个 1。输入中不足 n+1 个 1 时,io_found、io_idx、io_onehot 全部为零。必须使用 io_found 判断是否命中;io_idx=0 本身不能区分未命中与命中 bit 0。
若要从 MSB 向 LSB 查找,可将输入向量按位逆序后接入模块,再将
io_onehot按位逆序,映射回原向量。命中时,原向量中的位索引为inputWidth - 1 - io_idx;未命中时仍将索引输出置零。
以下示例固定 inputWidth=8、n=2,即选择从低位向高位的第三个 1。输入和独热码使用十六进制,索引使用十进制。
{
"signal": [
{
"name": "io_input[7:0]",
"wave": "========",
"data": [
"0x00",
"0x01",
"0x05",
"0x15",
"0xB4",
"0x07",
"0xFF",
"0x00"
]
},
{
"name": "io_found",
"wave": "0..1...0"
},
{
"name": "io_idx[2:0]",
"wave": "=..===.=",
"data": [
"0",
"4",
"5",
"2",
"0"
]
},
{
"name": "io_onehot[7:0]",
"wave": "=..===.=",
"data": [
"0x00",
"0x10",
"0x20",
"0x04",
"0x00"
]
}
],
"head": {
"text": "inputWidth=8, n=2 (LSB first)",
"tock": 0
},
"foot": {
"text": "Samples 0-7 = t0-t7; stable values, no clock or physical delay"
},
"config": {
"hscale": 3
}
}
| 稳定采样点 | io_input | io_found | io_idx | io_onehot | 说明 |
|---|---|---|---|---|---|
| t0 | 0x00 | 0 | 0 | 0x00 | 没有置位 |
| t1 | 0x01 | 0 | 0 | 0x00 | 只有一个 1,不足三个 |
| t2 | 0x05 | 0 | 0 | 0x00 | 只有两个 1,不足三个 |
| t3 | 0x15 | 1 | 4 | 0x10 | 置位位于 bit 0、2、4,第三个位于 bit 4 |
| t4 | 0xB4 | 1 | 5 | 0x20 | 置位位于 bit 2、4、5、7,第三个位于 bit 5 |
| t5 | 0x07 | 1 | 2 | 0x04 | 置位位于 bit 0、1、2,第三个位于 bit 2 |
| t6 | 0xFF | 1 | 2 | 0x04 | 全部置位,第三个位于 bit 2 |
| t7 | 0x00 | 0 | 0 | 0x00 | 输入清零后输出也清零 |
本模块是纯组合逻辑,没有时钟、复位或内部寄存器。图中 t0~t7 表示输入变化后、组合逻辑稳定时的采样顺序;横向间距不代表时钟周期或实际传播延时,也不表示输出具有寄存器延迟。具体延时以目标器件的时序分析为准。
| 参数 | 类型 | 默认值 | 范围与关系 |
|---|---|---|---|
| inputWidth | 整数 | 8 | 必须大于 2 且不超过 32,即 3~32 bit |
| n | 整数 | 0 | 必须满足 0 ≤ n < ceil(inputWidth/2),全局范围为 0~15 |
ceil 表示向上取整。例如,inputWidth=3 时,n 可取 0、1;inputWidth=8 时可取 0~3;inputWidth=9 时可取 0~4;inputWidth=32 时可取 0~15。等于上界也不合法,例如 (8,4)、(9,5) 和 (32,16) 均被拒绝。
二者均为生成时参数,n 不是运行时输入端口。只改变 n 不改变端口位宽,但会改变生成的逻辑。这些限制由本上架适配器实施,不表示底层库模块具有相同的参数范围。
以下为实际生成 RTL 的顶层端口名称,无时钟或复位端口。
| RTL 端口 | 方向 | 位宽 | 含义 |
|---|---|---|---|
| io_input | 输入 | inputWidth | 待查找的位向量,bit 0 优先 |
| io_found | 输出 | 1 | 输入中至少有 n+1 个置位时为 1 |
| io_onehot | 输出 | inputWidth | 命中位置唯一置位;未命中时为 0 |
| io_idx | 输出 | ceil(log2(inputWidth)) | 命中的二进制位索引;未命中时为 0 |
在本版本的合法宽度范围内,索引至少为 2 bit。inputWidth=3 时索引为 2 bit;inputWidth=8 时为 3 bit;inputWidth=32 时为 5 bit。
以下为随附数据记录的测试环境,用于比较两组配置的资源和估算频率:
xc7k325tffg900-1;时钟约束为 5.000 ns(200 MHz),OOC 时钟参考位置为 BUFGCTRL_X0Y0。1000 / (5.000 - setup_WNS_ns) 计算,单位为 MHz;这是该测试环境下的估算值,不是跨器件或跨配置的频率保证。两组配置如下:
inputWidth=16,评估 n=0~7 时的资源和估算频率。n=2,比较 inputWidth=4、8、16、32、64 时底层模块的表现。第二组中的 (inputWidth=4,n=2) 不满足新的序号约束,inputWidth=64 超出 32 bit 上限。这两个点保留用于底层模块对比;第二组中符合本版本限制的点为 (8,2)、(16,2) 和 (32,2)。
图中橙色虚线为综合结果,蓝色实线为布局布线(PR)结果。16 bit 的 LUT 用量和估算频率随 n 不呈严格单调变化。64 bit、n=2 的 PR setup WNS 为 -0.296 ns,未满足 200 MHz setup 约束;随附数据中的其余配置满足该 setup 约束。
inputWidth 横轴按 log2 等距显示,n 横轴为线性坐标。
本 IP 生成、交付的全部代码(包括顶层 RTL 和内联子模块 RTL)采用 MIT 协议,允许使用、修改、分发及商用。版权仍归原权利人所有;复制或分发代码的全部或实质部分时,须保留版权声明和 MIT 许可声明。代码按原样提供,不附带担保。完整条款见交付包中的 LICENSE.NthOne.txt,交付声明见 NOTICE.NthOne.txt。