独热码one-hot code

本文介绍了独热码的概念及其在通信网络协议栈中的应用,并对比了二进制编码、格雷码与独热码的不同之处。独热码在状态比较时仅需比较一个位,简化了译码逻辑。

      1.独热码概念     

       独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。通常,在通信网络协议栈中,使用八位或者十六位状态的独热码,且系统占用其中一个状态码,余下的可以供用户使用。

       例如,有6个状态的独热码状态编码为:000001,000010,000100,001000,010000,100000。

再如,有十六个状态的独热码状态编码应该是:0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000 ,……,10000000000000000。但是通常我们为了方便书写,将二进制简化为十六进制表示(从右往左每四位二进制位用一位十六进制数表示),那么,以上十六状态的独热码可以表示成0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, ……, 0x8000(其中的0x是十六进制的前缀表示,在诸如PLC等程序中也有其他表示方法)。
2.码制和数制
码制和数制不一样。制,是表示“方法”:码制就是编码方法;数制,就是计数方法。
编码可以表示任何人为赋予的含义,可以是逻辑的,也可以是非逻辑的,编码没有大小之分,也可称作代码。 编码没有位权,或者说每位是平等的,每个位上数字比较大小是没有意义的。数码(编码)就是利用数字或字母来做记号的一串编码或者指其中某位编码数。这里应该注意,编码对应的数字其值也可以是有大小的数或者其他量。
数制,也称计数制度,计数方法(注意这里计数不是记数),数有大小之分,每一位有权重。常见的数制有:二进制,十进制,十六进制,六十进制等。
利用某种特定数制形式来编码,称作某进制编码,但是这个编码并不一定等同于该进制的数(计数)。二进制编码也可称连续编码,也就是码元值的大小是连续变化的,逢二进一。比如000,001,010,011,100,101。
数和码也有联系,通常用在数字逻辑中的码制有,格雷码(就是两个码之间只差1位不同,000,001,011,010,110,100)、BCD码、8421BCD码、余三码、ASCII码等。
3.Binary(二进制编码)、gray-code(格雷码)和one-hot(独热码)编码对比

二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。

Binary(二进制编码)、gray-code(格雷码)编码使用最少的触发器,较多的组合逻辑,而one-hot(独热码)编码反之。one-hot 编码的最大优势在于状态比较时仅仅需要比较一个bit,一定程度上从而简化了比较逻辑,减少了毛刺产生的概率。由于CPLD更多地提供组合逻辑资源,而FPGA更多地提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot编码。另一方面,对于小型设计使用gray-code和binary编码更有效,而大型状态机使用one-hot更高效。


在状态机设计中,One-Hot 编码与 Binary 编码相比,具有以下几个显著优势: One-Hot 编码方式中,每个状态仅由一个触发器表示,且只有一个触发器在任意时刻处于激活状态(即为高电平),其余均为低电平。这种方式使得状态跳转时仅需改变一个触发器的状态,从而减少了组合逻辑的复杂度[^3]。此外,One-Hot 编码简化了状态转移逻辑,因为每个状态都有一个唯一的触发器与其对应,这使得状态之间的跳转逻辑更加直观和简单,减少了实现状态机所需的组合逻辑数量,提高了系统的运行速度,使得更高的工作时钟频率成为可能[^3]。 另一方面,One-Hot 编码方式在增加新状态时也更为简便,因为这通常只需要添加一个新的触发器而不必重新设计整个状态编码方案。这种灵活性对于在设计后期需要修改或扩展状态机的设计来说是一个重要的优势[^3]。 尽管 One-Hot 编码使用更多的触发器资源,但它在减少组合逻辑复杂性和提高系统性能方面的优势使其成为某些设计场景下的首选编码方式,尤其是在状态数目在4到24之间的中等规模状态机设计中[^2]。 相比之下,Binary 编码方式虽然使用的寄存器较少,但在状态变化时可能会涉及多个比特位的反转,这不仅增加了出现毛刺的可能性,同时也增加了逻辑门之间的延迟[^2]。对于需要快速状态转换的应用来说,这种延迟可能是不可接受的。 ### 示例代码 以下是一个简单的 Verilog 示例,展示了如何使用 One-Hot 编码来定义一个具有三个状态的状态机: ```verilog typedef enum logic [2:0] { STATE_IDLE = 3'b001, STATE_RUN = 3'b010, STATE_STOP = 3'b100 } state_t; state_t current_state, next_state; always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) current_state <= STATE_IDLE; else current_state <= next_state; end always_comb begin case (current_state) STATE_IDLE: next_state = STATE_RUN; STATE_RUN: next_state = STATE_STOP; STATE_STOP: next_state = STATE_IDLE; default: next_state = STATE_IDLE; endcase end ``` ### 相关问题 1. 在状态机设计中,使用 One-Hot 编码时如何处理未使用状态? 2. 如何在 Verilog 中实现一个使用 Binary 编码的状态机? 3. 在何种情况下应该选择使用 Gray 编码而不是 One-Hot 或 Binary 编码? 4. 使用 One-Hot 编码的状态机在 FPGA 上实现时有哪些注意事项? 5. 如何评估不同编码方式对状态机功耗的影响?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值