欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VHDL语言实现32位二进制数转BCD码

程序员文章站 2024-02-01 19:10:52
...

使用FPGA开发板上的数码管显示数值,需要将数值转换成对应的BCD码,再通过七段译码器将数值显示在数码管上。我用除十取余的方法,用VHDL写了32位二进制数转BCD码代码。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY BIN32_TO_BCD1 IS
	PORT(
		BIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
		BCD: OUT STD_LOGIC_VECTOR(39 DOWNTO 0)
	);
END ENTITY BIN32_TO_BCD1;

ARCHITECTURE RTL OF BIN32_TO_BCD1 IS
BEGIN
	PROCESS(BIN)
		VARIABLE TEMP: INTEGER;
		VARIABLE BIN_TEMP: INTEGER;
		VARIABLE BCD_TEMP: STD_LOGIC_VECTOR(39 DOWNTO 0);
	BEGIN
	        BCD_TEMP:=X"0000000000";
	        BIN_TEMP:=CONV_INTEGER(BIN);
		FOR K IN 0 TO 9 LOOP
			TEMP:=BIN_TEMP REM 10;
			BCD_TEMP(3+4*K DOWNTO K*4):=CONV_STD_LOGIC_VECTOR(TEMP,4);
			BIN_TEMP:=(BIN_TEMP-TEMP)/10;
			IF BIN_TEMP=0 THEN
				EXIT;
			END IF;
		END LOOP;
		BCD<=BCD_TEMP;
	END PROCESS;
END RTL;

本来想用左移加3的算法,但没有成功。上面这个除十取余的方法是将STD_LOGIC_VECTOR转换成INTEGER,然后除十取余提出逐个十进制位。限于VHDL的INTEGER为有符号整型,以上代码其实只能实现31位无符号二进制转BCD码。