首页 > 其他分享 >FPGA移位加三法

FPGA移位加三法

时间:2023-07-27 12:34:38浏览次数:40  
标签:wire FPGA b0000 19 shift 加三法 ShiftReg data 移位

介绍

BCD码

BCD码的英文全称是Binary-Coded Decimal‎,简称BCD,按字面解释是二进制十进制代码,是一种二进制的数字编码形式。

常见的BCD码有8421BCD码,2421BCD码,5421BCD码,余3码以及格雷码等等。

在本文中,我们所采用的BCD码8421BCD码

8421码,即从左到右的二进制位权重分别为8、4、2、1。即

BCD码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
0 1 2 3 4 5 6 7 8 9

应用场景

数字时钟,需要十进制地显示时分秒;温度显示也需要十进制;次数显示也需要十进制······

错误例子

module func(i_data, o_data)
    input wire [7:0] i_data;
    output wire [11:0] o_data;
    
    assign o_data[11:8] = i_data / 100;
    assign o_data[7:4] = i_data / 10 % 10;
    assign o_data[3:0] = i_data % 10;
endmodule

这是我们在做算法题的时候用到的方法,而且Verilog是支持除法和取余运算的,但是这样会耗费太多资源。对于硬件设计来说,我们需要用适合硬件的方法。

8421码与二进制码的关系

对于4位二进制码,是逢16进位。而8421码是逢10进位。

因此,大于9的二进制码,加6就可以得到8421码。

移位加三法

首先给出步骤:(8位二进制数为例)

  • BCD码初始化为0。
  • 将原二进制码左移一位,左移出的一位添到BCD码的低位上。
  • 判断BCD码所对应的个,十,百位是否大于等于5,如果是则该段加3。
  • 继续重复以上步骤直到移位8次后停止。

总之,在移位的过程中,如果移位出的数值大于等于5,则将数值加3,再进行移位。对于n位二进制数,就进行n次移位。

例子

以二进制数 0111_1101为例,数值为125。

百位 十位 个位 二进制数
开始 4'b0000 4'b0000 4'b0000 8'b0111_1101
左移1 4'b0000 4'b0000 4'b0000 8'b1111_1010
左移2 4'b0000 4'b0000 4'b0001 8'b1111_0100
左移3 4'b0000 4'b0000 4'b0011 8'b1110_1000
左移4 4'b0000 4'b0000 4'b0111 8'b1101_0000
加3 4'b0000 4'b0000 4'b1010 8'b1101_0000
左移5 4'b0000 4'b0001 4'b0101 8'b1010_0000
加3 4'b0000 4'b0001 4'b1000 8'b1010_0000
左移6 4'b0000 4'b0011 4'b0001 8'b0100_0000
左移7 4'b0000 4'b0110 4'b0010 8'b1000_0000
加3 4'b0000 4'b1001 4'b0010 8'b1000_0000
左移8 4'b0001 4'b0010 4'b0101 8'b0000_0000

可以看到,最终结果为 12'b0001_0010_0101。按照8421BCD码解析,即为125。

为什么要大于等于5

之前的联系不是说,大于9嘛?其实这只是一个简单的运算前后顺序关系。

BCD码是4位二进制数表示一个十进制数的1位,如果大于等于5,比如5,4'b0101,下一次移位后变成了4’b1010,而BCD码中是没有4’b1010的,所以要加6,向高位进位。(见联系)

所以移位后加6和移位前加3都是可以的。

具体实现

实现一

RTL结构

  • bin[7:0]:二进制数输入
  • bcd[11:0]:8421BCD码输出,[11:8] 为百位,[7:4] 为十位,[3:0] 为个位。
  • 该模块调用8次移位加3模块,如图:

代码

移位加3模块
module shift(i_data, o_data);
	input wire [19:0] i_data;
	output wire [19:0] o_data;
	
	wire [19:0] shift_data;
	
	assign shift_data[19:16] = i_data[19:16] > 4'd4 ? i_data[19:16] + 4'd3 : i_data[19:16];
	assign shift_data[15:12] = i_data[15:12] > 4'd4 ? i_data[15:12] + 4'd3 : i_data[15:12];
	assign shift_data[11:8] = i_data[11:8] > 4'd4 ? i_data[11:8] + 4'd3 : i_data[11:8];
	assign shift_data[7:0] = i_data[7:0];
	
	assign o_data = shift_data << 1'b1;

endmodule
顶层模块
module bin2bcd(bin, bcd);
	input wire [7:0] bin;
	output wire [11:0] bcd;
	
	wire [19:0] w_0;
	wire [19:0] w_1;
	wire [19:0] w_2;
	wire [19:0] w_3;
	wire [19:0] w_4;
	wire [19:0] w_5;
	wire [19:0] w_6;
	wire [19:0] w_7;

	shift shift_ins0 (.i_data({12'd0, bin}), .o_data(w_0));
	shift shift_ins1 (.i_data(w_0), .o_data(w_1));
	shift shift_ins2 (.i_data(w_1), .o_data(w_2));
	shift shift_ins3 (.i_data(w_2), .o_data(w_3));
	shift shift_ins4 (.i_data(w_3), .o_data(w_4));
	shift shift_ins5 (.i_data(w_4), .o_data(w_5));
	shift shift_ins6 (.i_data(w_5), .o_data(w_6));
	shift shift_ins7 (.i_data(w_6), .o_data(w_7));
	
	assign bcd = w_7[19:8];

endmodule

实现二

  • inData[15:0]:二进制数输入
  • outData[19:0]:8421BCD码输出,个十百千位同理。
  • 本代码通过循环实现。

代码

module   BinaryToBCD(
	input		wire	[16-1:0]	inData, 		//二进制输入
	output	wire	[16+3:0]	outData		//BCD输出
	);
	parameter	bit_binary = 16;			//二进制数据位数
	reg			[bit_binary-1:0]	bin;
	reg     		[bit_binary+3:0]	ShiftReg;
	always@(inData)
	begin
		bin = inData;
		ShiftReg = 'd0;
		repeat (bit_binary - 1)
		begin
			ShiftReg[0] = bin[bit_binary-1];
            //adjust by add 3
            if(ShiftReg[19:16] > 4)
                ShiftReg[19:16] = ShiftReg[19:16] + 2'd3;
            else
                ShiftReg[19:16] = ShiftReg[19:16];
            if(ShiftReg[15:12] > 4)
                ShiftReg[15:12] = ShiftReg[15:12] + 2'd3;
            else
                ShiftReg[15:12] = ShiftReg[15:12];
            if(ShiftReg[11:8] > 4)
                ShiftReg[11:8] = ShiftReg[11:8] + 2'd3;
            else
                ShiftReg[11:8] = ShiftReg[11:8];            
            if(ShiftReg[7:4] > 4)
                ShiftReg[7:4] = ShiftReg[7:4] + 2'd3;
            else
                ShiftReg[7:4] = ShiftReg[7:4];
            if(ShiftReg[3:0] > 4)
                ShiftReg[3:0] = ShiftReg[3:0] + 2'd3;
            else
                ShiftReg[3:0] = ShiftReg[3:0]; 
        	ShiftReg = ShiftReg << 1;
        	bin = bin << 1;
		end
		ShiftReg[0] = bin[bit_binary-1];
	end
	assign outData = ShiftReg;
endmodule

参考文献

[1] https://blog.51cto.com/u_15076212/3816404 "基于FPGA的二进制转BCD设计与实现(移位加3法)"

[2] https://zhuanlan.zhihu.com/p/209083141 "[走近FPGA]之二进制转BCD码"

标签:wire,FPGA,b0000,19,shift,加三法,ShiftReg,data,移位
From: https://www.cnblogs.com/Az1r/p/17584630.html

相关文章

  • m基于FPGA的16QAM软解调verilog实现,含testbench
    1.算法仿真效果 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera6.6d StarterEdition 其中Vivado2019.2仿真结果如下:     Quartusii18.0+ModelSim-Altera6.6d StarterEdition的测试结果如下:   2.算法涉及......
  • 5模型机整体的联调【FPGA模型机课程设计】
    5模型机整体的联调【FPGA模型机课程设计】前言推荐5模型机整体的联调安排MIPS基本整数指令集MIPS扩展整数指令集测试与结果1FPGA模型计算机整体方案设计掌握MIPS指令集的相关设计2模型计算机各功能电路设计初始化数据I型指令测试R型指令测试J型指令测试访存指令测试3模型机指令......
  • 【FPGA基础】时钟设计与异步复位同步撤离设计
    一、时钟设计1、时钟分频设计累加器时钟分频(32分频)always@(posedgeclkandnegedgerst_n)beginif(!rst_n)clk_cnt<=5'b0;elseclk_cnt<=clk_cnt+1'b1;end 异步时钟分频(32分频)always@(posedgeclk)clk_2<=~clk_2;alwa......
  • FPGA配合R820T
    想法:FPGA控制R820T的I2C,将R820T输出的中频做处理。准备:某宝买的RTL-SDR,原理如下:软件无线电通过数字信号处理来实现无线信号的调制解调。在RTL-SDR中通过调谐芯片(R820T、E4000)将无线信号下变频至低中频信号,由RTL2832U中的ADC采样得到数字信号,再进行数字下变频得到基带信号,由......
  • m基于FPGA的各类存储器纯Verilog实现,包含testbench,包括RAM,SRAM等
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,Vivado2019.2仿真结果如下: ram   SRAM   2.算法涉及理论知识概要        FPGA(FieldProgrammableGateArray)是一种可编程逻辑器件,具有可重构性、高速度、低功耗等特点,被广泛应用于数字电路设计......
  • FPGA数码管动态显示
    FPGA驱动6位数码管,主控芯片EP4CE6F17C8N。所使用实验板的数码管原理图如图所示,所使用的数码管3661BS是6位共阳极的数码管。使用PNP三极管驱动数码管,当三极管基极SMG_W0引脚输入低电平时,PNP三极管导通。通过控制SMG_W0~W5的电平来控制三极管的导通,从而控制位选信号。共阳极数码管,......
  • m基于FPGA的带相位偏差64QAM调制信号相位估计和补偿算法verilog实现,包含testbench
    1.算法仿真效果 本系统进行了Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:   将FPGA的仿真结果导入到matlab中,显示星座图,结果如下所示:    2.算法涉及理论知识概要         在现代通信系统中,调制技术是实现高速数据传输和频谱效率优化的......
  • m基于FPGA的1024QAM调制信号产生模块verilog实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,Vivado2019.2仿真结果如下:将1024调制信号导入到matlab显示星座图2.算法涉及理论知识概要本文将详细介绍基于FPGA的1024QAM调制信号产生模块。本文将从以下几个方面进行介绍:1024QAM调制信号的基本原理、符号映射方式、并行化......
  • m基于FPGA的带相位偏差64QAM调制信号相位估计和补偿算法verilog实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:将FPGA的仿真结果导入到matlab中,显示星座图,结果如下所示:2.算法涉及理论知识概要在现代通信系统中,调制技术是实现高速数据传输和频谱效率优化的重要手段。其中,64QAM调制技术是一种常见的高......
  • m基于FPGA的1024QAM调制信号产生模块verilog实现,包含testbench
    1.算法仿真效果 本系统进行了Vivado2019.2平台的开发,Vivado2019.2仿真结果如下:   将1024调制信号导入到matlab显示星座图  2.算法涉及理论知识概要       本文将详细介绍基于FPGA的1024QAM调制信号产生模块。本文将从以下几个方面进行介绍:1024QAM调制信......