VHDL实现BCD码加法器

简介: VHDL实现BCD码加法器

VHDL实现BCD码加法器

BCD码加法器计算两个四位二进制数的相加值,
由9个输入端和5个输出端组成,分为相加,修正判别和修正三个阶段。
在相加值为0-9时,BCD码与四位二进制码相同,
当值为10-15时,BCD码等于四位二进制码加上“0110”。

如图所示:

相加模块与四位全加器实现功能相同,将对其进行例化使用:

LIBRARY IEEE;                                                             --结构描述方式实现BCD码加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY  homework8 IS
  PORT(
  AA,BB:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  FF:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);      --FF为最终输出
  CIN:IN STD_LOGIC;
  COUT:OUT STD_LOGIC
  );
END homework8;
ARCHITECTURE yejiayu OF homework8 IS
COMPONENT homework6           
  PORT(
  A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  F:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);       --四位全加器的输出   
  CI:IN STD_LOGIC;                          --低位
  CO:OUT STD_LOGIC              --高位
  );
END COMPONENT homework6;
                        --修正判别过渡
  SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q1接手四位全加器的输出
  SIGNAL Q2:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q2为修正被加数
  SIGNAL COU1:STD_LOGIC;            
  SIGNAL COU2:STD_LOGIC;           
BEGIN
  U1:homework6 PORT MAP(A=>AA,B=>BB,CI=>CIN,F=>Q1,CO=>COU1);--修正判别
  COU2<=NOT((NOT COU1)AND(NOT(Q1(3) AND Q1(2)))AND(NOT(Q1(3) AND Q1(1))));
    Q2<=(2=>COU2,3=>COU2,OTHERS =>'0');       --被加数的2,3位与COU2相连,其余接地
    U2:homework6 PORT MAP(A=>Q2,B=>Q1,CI=>'0',F=>FF,CO=>COU1);--修正
END yejiayu;

保存后仿真:

也可以换种方式实现:

LIBRARY IEEE;                               --行为描述方式实现
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY  homework9 IS
  PORT(
  AA,BB:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  FF:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);      --FF为最终输出
  CIN:IN STD_LOGIC;
  COUT:OUT STD_LOGIC
  );
END homework9;
ARCHITECTURE yejiayu OF homework9 IS
COMPONENT homework6           
  PORT(
  A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  F:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);       --四位全加器的输出   
  CI:IN STD_LOGIC;                          --低位
  CO:OUT STD_LOGIC              --高位
  );
END COMPONENT homework6;
                        --修正判别过渡
  SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q1接手四位全加器的输出
  SIGNAL Q2:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q2为修正被加数
  SIGNAL COU1:STD_LOGIC;            
  SIGNAL COU2:STD_LOGIC;           
BEGIN
  U1:homework6 PORT MAP(A=>AA,B=>BB,CI=>CIN,F=>Q1,CO=>COU1);--修正判别
  PROCESS(AA,BB,CIN)
    BEGIN
    IF(COU1='1')THEN            --和>15时
      Q2<=Q1+6;
    ELSIF(Q1>9)THEN             --和>9时
      COU2<='1';
      Q2<=Q1-10;
    ELSIF(Q1<10)THEN
      COU2<='0';
      Q2<=Q1;
    END IF;
    FF<=Q2;                 --值传给FF
    COUT<=COU2;               --值传给COUT
  END PROCESS;
END yejiayu;

保存后仿真:

相关文章
C语言:十进制、BCD码互换
C语言:十进制、BCD码互换
C语言:十进制、BCD码互换
|
异构计算
【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
1190 0
【408计算机组成原理】—BCD码(三)
【408计算机组成原理】—BCD码(三)
|
算法 Python
如何将算法翻译成RTL(四)有符号数的加减法实现
如何将算法翻译成RTL(四)有符号数的加减法实现
216 0
|
算法 Python
如何将算法翻译成RTL(二):带小数的加减法实现
如何将算法翻译成RTL(二):带小数的加减法实现
185 0
|
算法 C语言 芯片
【C语言】BCD码、十进制互相转换
【C语言】BCD码、十进制互相转换
839 0
FPGA-(任务01)设计一个三位二进制减法计数器
FPGA-(任务01)设计一个三位二进制减法计数器
174 0
FPGA-(任务01)设计一个三位二进制减法计数器
FPGA-基本知识 设计一个一位(四位)半加器和一位(四位)全加器
FPGA-基本知识 设计一个一位(四位)半加器和一位(四位)全加器
574 0
FPGA-基本知识 设计一个一位(四位)半加器和一位(四位)全加器
|
人工智能 BI
第三次笔记:算术逻辑单元 电路基本原理 加法器的设计 一位全加器 串行进位加法器 并行进位加法器 补码加减运算器 无符号整数加减法 标志位的生成
第三次笔记:算术逻辑单元 电路基本原理 加法器的设计 一位全加器 串行进位加法器 并行进位加法器 补码加减运算器 无符号整数加减法 标志位的生成
456 0
第三次笔记:算术逻辑单元 电路基本原理 加法器的设计 一位全加器 串行进位加法器 并行进位加法器 补码加减运算器 无符号整数加减法 标志位的生成