0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

比特对编码的原理设计

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-14 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

比特对编码与比特对编码乘法器的设计

今天一起看看比特对编码(有的也把它称为基4booth编码,名字不重要,主要是思想),可以解决上文中提到的问题

比特对编码原理

booth重编码的主要问题在于不能过滤掉010这样序列。故考虑将通过连续相邻两位进行编码,每次从低位向高位移动1位的方式(即booth比编码),变成连续相邻3位进行编码,每次从低位向高位移动2位的方式(比特对编码)。先讨论其原理。

一个数我们考虑从低位向高位对其进行编码,使其变成4进制(基4)的表示形式,每两位二进制表示一位的四进制数。

3(2'b11)比4少1,2(2'b10)比4少2。在4进制数中,2需要向前进位则需要减去2再向前进位;3需要向前进位则需要减去1再向前进位。

我们的比特对编码就是基于上述原理来的。

下面给出比特对编码规律,如下表和图所示,图为一个实例,是对1011_1111的编码,其表示-65。比特对编码结果为 -1 00-1,故其表示的十进制d为:

d=-4^3 -4^0= -65

cd70b9ce-0310-11ed-ba43-dac502259ad0.png

cd85bd24-0310-11ed-ba43-dac502259ad0.png

再举个例子,比如对0001_1001进行比特对编码,得到编码为:

+2-2+1

故其表示的十进制计算如下:

d=2*(4^2) -2*(4^1) +4^0

=32+8+1=41

其中的乘2与乘4都可以通过移位操作来实现,这就是为什么需要这么编码的原因。

可以看到,每相邻三位进行编码,其中的最低位mi-1 其实表示来自前面的进位。故当其为 001时,得到的编码为 +1(表示4),011时最低位1表示进位,故编码为1+1=+2。

从中可以得出,对于8位二进制数0101_0101,经过比特对编码后,得到的是 +1 +1 +1 +1,其表示的数为:

4^3 + 4^2 + 4^1 + 4^0 =

64+16+4+1=85

此时只需要进行3次加法运算,不会存在booth编码所存在的问题。

同时发现对于数据位宽非偶数的数,我们需要将其在最高位补填一位符号位,再进行比特对编码。

比特对编码(对乘数进行编码)乘法器,需要进行的加法次数为乘数位宽的一半。

比特对编码乘法器设计

设计思想概叙:定义位宽为DW_A+DW_B+2的product寄存器(DW_A为被乘数a的位宽,DW_B为乘数b的位宽)。当in_valid与in_ready同时为高时,将乘数b(位宽为b)加载到product的低DW_B位。然后在计算状态下(executing),将每次加法器的输出放到product的高位,并每个时钟周期将product右移2位。每个时钟周期,通过对

m={product[1:0],prd_r[1]}

(其中prd_r[1]为上一个时钟product的第二位)进行编码,得出本次操作是加1、加2,减1,减2,还是不用做加减法(编码为0)(代码中上述五种操作对应的标志信号分别为add_1,add_2,sub_1,sub_2,noneed_add)。并将加法结果每次存到product寄存器的高位。

这里有个巧妙的思想就是,每个时钟周期通过对product右移2位,再将其高DW_A位与a或者a*2进行相加或者相减操作,正好相当于每次product不动,把a或者a*2左移2位(乘以4)。这个思想源于《Verilog HDL 高级数字设计》中的精简寄存器时序乘法器设计。

注意,这里是有符号数乘法器,每次左移需要在高位补符号位,故左移不能简单的用 >> 描述(>>左移默认高位填0),具体描述见代码。

其中减法采用加上这个数的补码的方式;通过一个计数器(cnt)来指示什么时候结束运算;其中运算控制状态机采用《状态机的第四种描述方式》编写;条件选择多采用与或方式实现。

设计Verilog如下(dff_with_en为寄存器):

module radix4_mul #(  parameter  DW_A = 16,  parameter  DW_B = 8)(   input  clk,   input  rst_n,
   input  in_valid,   output in_ready,   input  flush,
   output o_valid,   input o_ready,
   input [DW_A-1:0] a,   input [DW_B-1:0] b,
   output [DW_A+DW_B-1:0] mul_res);
//state machine for mulwire state;wire [$clog2((DW_B+1)/2):0] cnt;
wire exe_cnt_final = (cnt == (DW_B+1)/2);
wire execute_en = in_valid&in_ready;
localparam GET_DATA = 1'b0;localparam EXECUTING = 1'b1;
wire curr_get_data = (state == GET_DATA);wire curr_executing = (state == EXECUTING);
wire is_executing = curr_executing & (~exe_cnt_final);
wire nxt_get_data_en = (curr_executing & exe_cnt_final & o_ready) | flush;wire nxt_executing = curr_get_data & execute_en;
wire nxt_state = (nxt_get_data_en & GET_DATA) |            (nxt_executing & EXECUTING);
wire tran_en = nxt_get_data_en | nxt_executing;
dff_with_en #(   .DW(1))dff_state(   .clk (clk),   .rst_n (rst_n),   .enable (tran_en),   .d_in (nxt_state),   .q_out (state));
//cnt//wire [$clog2((DW_B+1)/2):0] cnt_nxt = curr_executing ? cnt+1 : 'h0;
dff_with_en #(   .DW($clog2((DW_B+1)/2)+1))dff_cnt(   .clk (clk),   .rst_n (rst_n),   .enable (1'b1),   .d_in (cnt_nxt),   .q_out (cnt));
//get the awire [DW_A-1:0] a_d;wire [DW_A-1:0] nxt_a_d = nxt_executing ? a : a_d;
dff_with_en #(   .DW(DW_A))dff_a(   .clk (clk),   .rst_n (rst_n),   .enable (1'b1),   .d_in (nxt_a_d),   .q_out (a_d));//radix 4 codingwire prd_r;wire [DW_A+DW_B+1:0] product;//wire [DW_B-1:0] b_shift;wire [2:0] m = is_executing ? {product[1:0],prd_r} : 3'b000;
wire add_1 = (m == 3'b001) | (m == 3'b010);wire add_2 = (m == 3'b011);wire sub_1 = (m == 3'b110) | (m == 3'b101);wire sub_2 = (m == 3'b100);
//wire [DW_A+DW_B+1:0] product;
wire [DW_A+1:0] adder_op1 = ( {DW_A+2{add_1}}& { {2{a_d[DW_A-1]}},a_d} )       |                      ( {DW_A+2{add_2}}& { {1{a_d[DW_A-1]}},a_d,1'b0} )  |          ( {DW_A+2{sub_1}}& (~{ {2{a_d[DW_A-1]}},a_d}) )    |          ( {DW_A+2{sub_2}}& (~{ {1{a_d[DW_A-1]}},a_d,1'b0}));
wire add_en = (add_1 | add_2 | sub_1 | sub_2)& is_executing;       wire noneed_add = is_executing & (~(add_1 | add_2 | sub_1 | sub_2));
wire [DW_A+1:0] adder_op2 = product[DW_A+DW_B+1:DW_B];
wire adder_cin = sub_1|sub_2;
wire [DW_A+1:0] adder_res = adder_op1 + adder_op2 + adder_cin;
wire [DW_A+DW_B+1:0] nxt_product = ({DW_A+DW_B+2{add_en}} &{{2{adder_res[DW_A+1]}},adder_res,product[DW_B-1:2]})|                              ({DW_A+DW_B+2{noneed_add}} & {{2{product[DW_A+DW_B+1]}},product[DW_A+DW_B+1:2]}) |           ({DW_A+DW_B+2{o_valid}} & product) |           ({DW_A+DW_B+2{nxt_executing}} & {{DW_A+2{1'b0}},b});
dff_with_en #(   .DW(DW_A+DW_B+2))dff_product(   .clk (clk),   .rst_n (rst_n),   .enable (1'b1),   .d_in (nxt_product),   .q_out (product));
wire prd_nxt = curr_get_data ? 1'b0 : product[1];
dff_with_en #(   .DW(1))dff_prd(   .clk (clk),   .rst_n (rst_n),   .enable (1'b1),   .d_in (prd_nxt),   .q_out (prd_r));assign in_ready = curr_get_data;assign o_valid = exe_cnt_final;assign mul_res = product[DW_A+DW_B-1:0];
endmodule

如果乘数b位宽为奇数,请补一位符号位,变成偶数位宽,再输入。

原文标题:比特对编码与比特对编码乘法器的设计

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    1040

    浏览量

    57132
  • 比特
    +关注

    关注

    0

    文章

    16

    浏览量

    10806
  • 乘法器
    +关注

    关注

    9

    文章

    221

    浏览量

    38942
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    磁铁在编码器中的作用与应用

    编码器中,磁铁的作用不可小觑,常用的磁性材料主要是钕铁硼和铁氧体,今天这篇文章主要介绍下磁铁用于哪些编码器类型,以及其具体作用。磁铁在编码器中的作用(功能)是什么?在编码器中,磁铁主
    的头像 发表于 03-19 14:42 376次阅读
    磁铁在<b class='flag-5'>编码</b>器中的作用与应用

    风华贴片电阻料号编码的详细解析

    风华贴片电阻的料号编码通常遵循一套系统化的命名规则,涵盖了产品类型、封装尺寸、温度系数、阻值、精度、额定功率及包装方式等关键参数。以下是对风华贴片电阻料号编码的详细解析: 一、编码结构 风华贴片电阻
    的头像 发表于 03-04 16:23 385次阅读
    风华贴片电阻料号<b class='flag-5'>编码</b>的详细解析

    hcs301 编码跳变编码器应用手册

    电子发烧友网站提供《hcs301 编码跳变编码器应用手册.pdf》资料免费下载
    发表于 02-09 16:35 0次下载

    Vishay USB编码器接口技术解析与应用指南

    Vishay/MCB Industrie RAMK/RAME USB编码器接口是一款设计用于Vishay MCB编码器(AMK和RAME系列,包括霍尔效应)的电子板。该接口板只需使用随附的USB
    的头像 发表于 11-12 11:51 1138次阅读

    如何选择适合的SSI编码器?

    如何选择适合的SSI编码器?选择适合的SSI编码器需要综合考虑应用场景、技术参数、环境适应性以及性价比等因素。以下是根据工业自动化领域专业技术人员需求整理的选型指南:
    的头像 发表于 11-03 14:53 857次阅读
    如何选择适合的SSI<b class='flag-5'>编码</b>器?

    舵机伺服编码

    舵机伺服编码器是用于实时检测舵机输出轴位置、速度或角度的核心反馈元件,它能将机械运动转化为电信号,让控制系统实现对舵机的精准闭环控制。 这个问题切得很准,它直接指向了舵机 “精准控制” 的关键所在
    的头像 发表于 10-30 10:05 480次阅读

    编码器为何能取代光电编码器?

    在复杂工业场景下,磁编码器凭借其不怕油污粉尘、抗冲击振动、安装便捷及高速响应等优势,正有效解决光电编码器怕脏、怕震、难安装、怕高速的痛点,逐渐成为提升机器人性能的新选择。
    的头像 发表于 10-15 09:55 931次阅读
    磁<b class='flag-5'>编码</b>器为何能取代光电<b class='flag-5'>编码</b>器?

    国产编码器在人形机器人领域的进展

    电子发烧友网综合报道 编码器是测量旋转角度、位移及速度的传感器,作为伺服系统的核心部件,在人形机器人领域,其数据反馈对实现机器人运动的精密控制与定位至关重要。   编码器种类丰富,按技术原理可分为磁
    的头像 发表于 09-24 09:41 1700次阅读

    Bourns发布全新增量式微型编码

    Bourns 推出 PEC04 系列 4 mm 增量式微型编码器、PEC05 PEC05 系列 5 mm 增量式微型编码器,以及 PEC06 型号 6 mm 增量式微型编码器。Bourns 全新微型
    的头像 发表于 09-22 16:05 1450次阅读

    《精准量子比特控制和读取》白皮书

    在上篇客户案例中,我们分享了德国马普高分子研究所团队如何利用NV色心构建高灵敏度的磁力计,案例展示了量子比特相干稳定性在实验中的关键作用。要进一步加深理解量子比特的基本与控制方法,我们推荐您阅读
    的头像 发表于 08-21 17:23 719次阅读
    《精准量子<b class='flag-5'>比特</b>控制和读取》白皮书

    绝对值编码器与增量式编码器相比有哪些优势?

    绝对值编码器与增量式编码器相比有哪些优势?核心功能:断电后位置信息不丢失,绝对值编码器:通过机械结构或电子存储(如电池备份),能实时输出当前位置的唯一绝对值编码(如二进制、格雷码)。无
    的头像 发表于 08-11 13:57 2047次阅读
    绝对值<b class='flag-5'>编码</b>器与增量式<b class='flag-5'>编码</b>器相比有哪些优势?

    增量型编码器与绝对值型编码器怎么选择?

    在选择增量型编码器与绝对值型编码器时,需要考虑多个因素,包括应用需求、成本、精度、可靠性以及环境适应性等。以下是对两种编码器的详细比较及选择建议: 一、增量型编码器 1. 优点:  
    的头像 发表于 07-10 10:34 1812次阅读

    全球首个!低温下可精准控制“百万量级量子比特”芯片问世

    发表于《自然》期刊,为实用化量子计算机的构建开辟了新路径。   研究团队研制的新型芯片基于自旋量子比特技术,通过操控单个电子的磁方向编码信息。这一技术路线具有两大核心优势:一是自旋量子比特与主流CMOS半导体工艺兼容,易于
    的头像 发表于 07-07 05:58 3713次阅读

    Transformer架构中编码器的工作流程

    编码器是Transformer体系结构的基本组件。编码器的主要功能是将输入标记转换为上下文表示。与早期独立处理token的模型不同,Transformer编码器根据整个序列捕获每个token的上下文。
    的头像 发表于 06-10 14:27 1204次阅读
    Transformer架构中<b class='flag-5'>编码</b>器的工作流程

    一文读懂什么是磁性编码

    磁性编码器是一种用于测量角度和线性位置的传感器。它使用磁性信号来监测旋转或线性位置的变化,并把这些变化转换成数字信号。磁性编码器可用于各种应用中,比如机器人、汽车、数控机床等领域
    的头像 发表于 04-27 17:18 1251次阅读