行业资讯

行业资讯

通过我们的最新动态了解我们

mcu除法器(除法器vhdl)

发布时间:2023-05-14
阅读量:168

本文目录一览:

9. 除法器的实现与优化

首先来看32-bit除法器的工作流程图,如下图所示,

我们以4-bit除法器的硬件实尘芹现作为例子学习,如下图所示,其中8-bit的ALU既要支持加法又要支持减法,

1 被除数与余数共用一个8-bit寄存器,称为余数寄存器,除数寄存器也是8-bit,将除数放在除数寄存器的高4位,4-bit商寄存器初始化为4'b0000

2 执行减法运算,余数寄存器 - 除数寄存器,并将结果再次放入余数寄存器,下一个时钟上升沿到来时,减法结果就会存入余数寄存器,在这个例子中,减法运算结果是8'b1110_0111

3 这一步检查余数寄存器的内容是否大于等于0,只需看余数寄存器的最高位,1代表这个数小于0,因此要回退刚才的减法操作。此时8-bit ALU的输入端分别是余数寄存器当前的数据8'b1110_0111和除数寄存器的数据,控制逻辑发出add操作,ALU将余数寄存器和除数寄存器相加,相加的结果在下一个时钟上升沿写入余数寄存器(控制寄存器会给出写入的控制信号),这就实现了回退的效果。

4 商寄存器左移1为,新的最右位填0

5 除数寄存器右移1-bit,新的数据是8'b0001_0000

6 检查是否是最后一轮循环

7 重复2 - 6的工作,直到5轮计算完成,派闭毕注意第5轮的除数寄存器的右移没有实际意义了,但是计算机不知道。

和4-bit除法器的原理是一样的,如下图所示,

目前的除法器存在如下浪费,

1 除数寄存器态者实际只使用了一半

2 商寄存器初始时是空的,从右到左逐位填满

3 余数寄存器初始时是满的,有实际意义的位从左到右逐渐减少    

根据上面的浪费情况,提出以下解决方案,

1 除数寄存器缩减为32-bit,取消移位功能

2 取消商寄存器

3 64-bit ALU缩减为32-bit ALU

4 余数寄存器只有高32-bit参与加减法运算

5 余数寄存器需要支持左移和右移,左移是因为除数寄存器取消了右移功能,右移是因为余数可能会回退

6 商从右端逐位移入余数寄存器

7 运算结束时,商占据余数寄存器的低32-bit

优化后的除法器硬件结构如下图所示,

方波转正弦波。频率是500khz,求大神,最好有电路图,越快越好,谢了

参考参考

很多微控制器(MCU)或PIC都有用于产生正弦波但是效果却不甚理想的数模转换器(DAC)输出。一般来说它们的分辨率都比较低(8到10比特),总谐波失真率(THD)在1%内。或者,MCU或PIC使用一个带方波输出的五阶或七阶开关电容滤波器,并连接到MCU的两个I/O引脚上。一个输出被用作滤波器输入,另一个输出被用作滤波器时钟。此外,这两个输出必须是方波,并以100:1的比率跟随。

因为MCU不仅要产生一个正弦波,它还进行更多处理,所以将两个定时器或一个定时器绑定至固件通常需要很多系统开销。因此系统设计工程师不得不使用更快或更加昂毁亮贵的MCU。

这里有一个更好的办法,即利用RDD104可选的游余埋4各十进制CMOS除法器和一个MSFS5 开关电容滤波器来构建一个双芯片、失真率为0.2%的正弦波源。RDD104有两个引脚,可以从四个除法器divide-by-10、divide-by-100、divide-by-1000和divide-by-10k中选择一个。在引脚5连接外部时钟或带一个晶振,该器件就可使用。最大频率在5V直流电压下为1.5 MHz。

文中给出了方波-正弦波转换示意图。RDD104的引脚5和引脚6连接一个晶振以及一个10MΩ的电阻。引脚5还接有一个100pF的电容(C5)。MSFS5的输入电容,以及RDD104引脚6与MSFS5引脚4之间的连接具有与晶振引脚2相等的电容。由于DIV_SEL_1电平低,DIV_SEL_2电平高,所以选择100:1除法器。

MSFS5 是一个引脚可选的、七阶、低通/6端带通开关电容滤波器。这个具有8个引脚的IC可以用在Butterworth、Bessel或椭圆低通滤波器上,还可用于倍频程、1/3和1/神蚂6倍频程带通滤波器上。RDD104的Clock_Out交流耦合到MSFS5的时钟输入。设置MSFS5为1/6倍频程带通操作以实现在基频无衰减情况下方波谐波的最大衰减。可通过将FSEL和TYPE连接到VDD获得带通和1/6倍频程配置。设置滤波器为单电源运行,VDD为5V,VSS为0,GND通过2个电阻(R4和R5)连接到中间电源。用一个0.1μF的电容作为输入去耦。RDD104的输出通过两个10kΩ的电阻衰减,并交流耦合到MSFS5的滤波器输入端。

有了这样的配置,我们就可以得到一个10kHz、1Vrms的正弦波输出。在5V直流下的总电流消耗少于2mA,这使该解决方案很适用于便携式应用,在400 Hz~300k Hz带宽之间,THD等于0.2%(在AP Portable One Plus Access测试条件下测试)。

单周期除法器如何实现

除法器原理

和十进制除法类似,计算 27 除以 5 的过程如下所示:

在这里插入图片描述

除法运算过程如下:

(1) 取被除数的高几位数据,位宽和除数相同(实例中是 3bit 数据)。

(2) 将被除数高位数据与除数作比较,如果前者不小于后者,则可得到对应位的商为 1,两者做差得到第一步的余数;否则得到对应的商为 0,将前者直接作为余数。

(3) 将上一步中的余数与被除数剩余最高位 1bit 数据拼接成新的数据,然后再和除数做比较。可以得到新的商和余数。

(4) 重复过程 (3),直到被除数最低位数据也参与计算。

需要说明的是,商的位宽应该与被除数保持一致,因为除数有可能为1。所以上述手动计算除法的实例中,第一步做比较时,应该取数字 27 最高位 1 (3’b001) 与 3’b101 做比较。 根据此计算过程,设计位宽可配置的流水线式除法器,流水延迟周期个数与被除数位宽一致。

除法器设计

单独除法器设计

单步被除数位宽(信号 dividend)需比原始除数(信号 divisor)位宽多 1bit 才不至于溢出。为了便于流水,输出端需要有寄存器来存储原始的除数(信号divisor_orang_r)和被除数信息(信号 dividend_orang_r)。单步的运算结果就是得到新的 1bit 商数据辩棚(信号 merchant)和余数(信号 remainder)。为了得到最后的除法结果,新的 1bit 商数据(信号 merchant)还需要与上一周期的商结果(merchant_last)进行移位累加。单步运算单元设计如下(文件名 divider_cell.v):

module divider_cell#(

parameter N = 5,

parameter M = 3

)

(

input wire clk,

input wire rst_n,

input wire en,

input wire [N-1:0] dividend_orang, //原始被除数

input wire [M-1:0] divisor_orang, //原始除数

output reg [N-1:0] dividend_orang_r, //原始被除数

output reg [M-1:0] divisor_orang_r, //原始除数

input wire [M:0] dividend, //本轮被除数

input wire [N-1:0] merchant_last, //上一轮商结果

output reg valid, //本轮商有效标识

output reg [N-1:0] merchant, //本轮商

output reg [M-1:0] reminder //本携核则轮余数

);

always@(posedge clk) begin

if(en) begin

dividend_orang_r = dividend_orang;

divisor_orang_r = divisor_orang;

end

else begin

dividend_orang_r = 'b0;

divisor_orang_r = 'b0;

end

end

always@(posedge clk) begin

if(!rst_n) begin

valid = 1'b0;

end

else begin

valid = en;

end

end

always@(posedge clk) begin

if(!rst_n) begin

merchant = 'b0;

reminder = '氏氏b0;

end

else begin

if(en) begin

if(dividend = {1'b0, divisor_orang}) begin

merchant = (merchant_last1) + 1'b1;

reminder = dividend - {1'b0, divisor_orang};

end

else begin

merchant = merchant_last1;

reminder = dividend[M-1:0];

end

end

else begin

merchant = 'b0;

reminder = 'b0;

end

end

end

endmodule

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

流水线例化

流水线除法器能够实现流水计算,在N个周期连续计算出N个结果。

将单步计算的余数(信号 remainder)和原始被除数(信号 dividend)对应位的 1bit 数据重新拼接,作为新的单步被除数输入到下一级单步除法计算单元。其中,被除数、除数、及商的数据信息也要在下一级运算单元中传递。流水级模块例化完成除法的设计如下(文件名 pipeline_divider.v):

module pipeline_divider_top#(

parameter N = 32, //被除数位宽

parameter M = 32 //除数位宽

)

(

input wire clk,

input wire rst_n,

input wire en,

input wire [N-1:0] dividend,

input wire [M-1:0] divisor,

output wire valid,

output wire [N-1:0] merchant,

output wire [M-1:0] reminder

);

wire [N-1:0] dividend_orang [N-1:0]; //原始被除数、除数连线,需要N条

wire [M-1:0] divisor_orang [N-1:0];

wire [N-1:0] valid_cell; //valid连线,需要N条

wire [N-1:0] merchant_cell [N-1:0]; //商结果,需要N条

wire [M-1:0] reminder_cell [N-1:0];

divider_cell#(

.N ( N ),

.M ( M )

)u_divider_cell(

.clk ( clk ),

.rst_n ( rst_n ),

.en ( en ),

.dividend_orang ( dividend ),

.divisor_orang ( divisor ),

.dividend_orang_r ( dividend_orang[N-1] ),

.divisor_orang_r ( divisor_orang[N-1] ),

.dividend ( { {M{1'b0}}, dividend[N-1] } ),

.merchant_last ( 'b0 ),

.valid ( valid_cell[N-1] ),

.merchant ( merchant_cell[N-1] ),

.reminder ( reminder_cell[N-1] )

);

genvar i;

generate

for(i = 0; i N-1; i = i + 1) begin: divider_cell_pipeline

divider_cell#(

.N ( N ),

.M ( M )

)u_divider_cell(

.clk ( clk ),

.rst_n ( rst_n ),

.en ( valid_cell[i+1] ),

.dividend_orang ( dividend_orang[i+1] ),

.divisor_orang ( divisor_orang[i+1] ),

.dividend_orang_r ( dividend_orang[i] ),

.divisor_orang_r ( divisor_orang[i] ),

.dividend ( {reminder_cell[i+1], dividend_orang[i+1][i]} ),

.merchant_last ( merchant_cell[i+1] ),

.valid ( valid_cell[i] ),

.merchant ( merchant_cell[i] ),

.reminder ( reminder_cell[i] )

);

end

endgenerate

assign valid = valid_cell[0];

assign merchant = merchant_cell[0];

assign reminder = reminder_cell[0];

endmodule

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

非流水线除法器

这种除法器在N周期内只能完成一次除法计算,但只需要一个单步除法器。通过计数器来控制单步除法器单元的输入,从而实现移位除法计算。

全球首个RISC-V OoO CPU面世,RISC-V魅力何在?

2019年10月31日,SiFive公布了IP产品的一个里程碑,因为他们展示了其有史以来第一个乱序的CPU微体系结构,并承诺在现有RISC-V内核上实现显着的性能飞跃,并提供与Arm产品相比具有竞争力的PPA指标。

说起SiFive这个公司,其实很有意思。SiFive中国是在去年8月份成立的,与其他跨国企业的做法不一样的是,SiFive中国是一个独立公司,在中国独立运营,并非SiFive的子公司。它有自己的董事会,有自己的管理团队,未来它可以独立接受投资,也包括来自中国的投资。但同时也跟SiFive有关系,如提供IP还有其他方面的技术。

SiFive于2017年发布了U54系列,这是该公司第一个能够运行完整操作系统(例如Linux)的成熟CPU IP。

讲回正题,全球首个RISC-V处理器CPU,到底是一个什么东西?为什么RISC-V架构如此受追捧?

全新的RISC-V OoO CPU:U8面世

到目前为止,如果我们想基于新的ISA设计新的CPU,则首先要从小处着手,然后进行迭代,然后继续为设计增加更多的复杂性,这相对来说还不足为奇。SiFive的U5和U7系列相对来说CPU微体系结构较为简单。与Arm的低端和微控制器内核相比,它们能提供一些非常具有成本效益的选择和替代方案,但实际上并不能满足需要更高性能的更复杂工作负载的任务。

但新的U8系列通过大幅改善新的微体系结构,其性能比U54和U74高出5到4倍,这是我们行业中极其罕见的性能提升。

SiFive针对U8系列的设计目标也非常简单:直接对标Arm Cortex-A72,U8系列的目标是在性能上不相上下,并且在只有对手一半面积的同时提供1.5倍的更高的电源效率。当然,拿A72来比,还是有点“欺负”老产品的意味,不过SiFive的PPA目标相对较高,这意味着U8应该比Arm的最新一代内核更具竞争力。

RISC-V魅力何在?

顾名思义,RISC-V是RISC的第五个版本。RISC,即“精简指令集计算机”,是图灵奖得主John L. Hennessy和David A. Patterson对行业的重大贡献,由加州大学伯克利分校于1980年发布。芯片指令集帮助计算机软件与底层硬件设备通信,是计算机的基本组成部分。

我们先看看全世界对RISC-V的态度:

全球第一大硬盘产商西部数据(Western Digital)将以每年10亿到20亿颗的预期来推动RISC-V,逐步完成全线产品迁移到RISC-V定制架构;

MicroSemi提供基于Risc-V+Linux+CNN加速器的AI解决方案;

印度政府则大力资助基于RISC-V的处理器项目,使RISC-V成为了印度的事实国家指令集;

RISC-V基金会的会员已经增加到150多个,大学、科研院所和企业大量使用或评估基于RISC-V的应用,参与度之高,覆盖面之广,盛况空前;

指令集架构的生态链正在成长和完善,工具链、RTOS/Linux操作系统的移植等工作都取得关键突破。

无论模块化指令集“能屈能伸”,还是甩掉向后兼容 历史 包袱“无病一身轻”,再到40多条基本指令“大道至简”,且使用BSD License开源协议彻底开放,RISC-V的种种优势,宛如指令集纷繁万象中的一股春风。

早在去年,就有很多公司开始量产基于RISC-V的芯片,例如国内的嘉楠云智和华米等,他们做RISC-V芯片较早。行业人士当时也预计其他很多做RISC-V芯片的公司可能会在2019年或2020年正式推出基于RISC-V的芯片。

所以,兆易创新带来了GD32V系列开发板。

GD32V系列来袭

近期,业界领先的半导体供应谈梁商兆易创新正式推出全球首个基于RISC-V内核的GD32V系列32位通用MCU产品,提供完整工具链并持乱侍绝续打造RISC-V开发生态。

GD32VF103系列MCU采用了全新的基于开源指令集架构RISC-V的Bumblebee处理器内核,是兆易创新携手哗姿中国芯来 科技 面向物联网及其它超低功耗场景应用自主联合开发的一款商用RISC-V处理器内核。

GD32VF103系列RISC-V mCU提供了108MHz的运算主频,以及16KB到128KB的片上闪存和6KB到32KB的SRAM缓存, gFlash专利技术支持内核访问闪存高速雾等待。Bumblebee内核还内置了单周期硬件乘法器、硬件除法器和加速单元应对高级运算和数据处理的挑战。

GD32V系列新品全部符合工业级高可靠性和温度标准,并提供至少十年的持续供货保证。芯片的静电防护(ESD)防护水平在人体放电(HBM)模式可达5KV,器件放电模式(CDM)可达2KV,远高于行业安全标准,从而适用于复杂环境并让终端产品更可靠耐用。

全新的GD32VF103系列RISC-V MCU即刻上市。立创商城现已同步发售。

关键词:MCU mcu除法器

相关新闻

一点销电子网

Yidianxiao Electronic Website Platform

Tel:0512-36851680
E-mail:King_Zhang@Lpmconn.com
我们欢迎任何人与我们取得联系!
请填写你的信息,我们的服务团队将在以您填写的信息与您取得联系。
*您的姓名
*电话
问题/建议
承诺收集您的这些信息仅用于与您取得联系,帮助您更好的了解我们。