vhdl_用 VHDL 的行为描述方式设计 1 位 BCD 码加法器.
相关理论内容:参考
https://www.cnblogs.com/wentirensheng/articles/10193287.html
初始版本(有点问题)
元件例化法和行为描述法:
LIBRARY ieee; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY BCDadder_xuchaoxin IS PORT (--基于四位全加器的8421BCD码全加器 AA, BB : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CIN : IN STD_LOGIC; SS : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC); END BCDadder_xuchaoxin; --方法一:元件例化法: ARCHITECTURE instantiation OF BCDadder_xuchaoxin IS COMPONENT adder_xuchaoxin PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 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; --为修正判别过渡部分创建信号Q1, SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q2 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL COU : STD_LOGIC; SIGNAL COUT1 : STD_LOGIC; --符号"=>"给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。 --比如:w<= (o=> '1',OTHERS => '0')--最低位是1,其他位是О(箭头换了,但赋值方向仍为从右到左) BEGIN--实例化四位全加器 U1 : adder_xuchaoxin PORT MAP(A => AA, B => BB, CI => CIN, f => Q1, co => cou); --在元件实例化过程中有两种方法可以用来实现元件端口的映射:位置映射和名称映射。 cout1 <= NOT((NOT cou) AND (NOT (Q1(3)AND Q1(2))) AND (NOT (Q1(3)AND Q1(1)))); Q2 <= (2 => cout1, 3 => cout1, OTHERS => '0');--Q2基于(间接地)Q1,直接基于cout1 U2 : adder_xuchaoxin PORT MAP(A => Q2, B => Q1, CI => '0', f => ss, co => cout); END instantiation; --方法2:行为描述: ARCHITECTURE behavior OF BCDadder_xuchaoxin IS COMPONENT adder_xuchaoxin PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 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; --为修正判别过渡部分创建信号Q1, SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q2 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL COU : STD_LOGIC; SIGNAL COUT1 : STD_LOGIC; --符号"=>"给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。 --比如:w<= (0=> '1',OTHERS => '0')--最低位是1,其他位是О(箭头方向换了,不同于赋值,这是一个绑定(映射)端口的操作) BEGIN--实例化四位全加器 U1 : adder_xuchaoxin PORT MAP(A => AA, B => BB, f => Q1, CI => CIN, CO => COU); PROCESS (AA, BB, CIN)--通过process(args)来使用if结构 BEGIN--做修正判断 IF (COU = '1') THEN--A+B>15时 Q2 <= Q1 + 6; ELSIF (Q1 > 9) THEN--A+B>9时 COUT1 <= '1'; Q2 <= Q1 - 10; ELSIF (Q1 < 10) THEN--A+B<10,不需要修正(或者说修正值置位0即可),直接将Q1的值赋给Q2 Q2 <= Q1; COUT1 <= '0'; END IF; --将元件的端口绑定道主实体adder_xuchaoxin这给BCD加法器上: SS <= Q2;--本位相加结果(还是一个8421BCD码,位宽为4,取值0~15); COUT <= COUT1;--本次两个BCD码相加的进位情况(0/1); END PROCESS; END behavior; --使用第二种实现来仿真 CONFIGURATION configure OF BCDadder_xuchaoxin IS FOR behavior END FOR; END CONFIGURATION configure;
LIBRARY ieee; USE IEEE.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; --这是一个四位全加器:为2两个4位二进制分别配四个输入端口。 --而且考虑到进位,所以需要安排5个输出端口(其中一个为进位用的) --可以发现,四个一位全加器构成的四位全加器中,每个一位全加器的低位进位端低位的全加器的本位进位输入端co相连(当然首尾两片的进位端口没有被占用) ENTITY adder_xuchaoxin IS PORT ( Ci : IN STD_LOGIC; a, b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); f : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); Co : OUT STD_LOGIC); END adder_xuchaoxin; ARCHITECTURE test1 OF adder_xuchaoxin IS SIGNAL aa, bb : STD_LOGIC_VECTOR(4 DOWNTO 0);--位宽为5 SIGNAL ss : STD_LOGIC_VECTOR(4 DOWNTO 0); --由于对信号的赋值只有最后一次有效,故引入变量/中间信号: BEGIN aa <= '0' & a(3 DOWNTO 0); bb <= '0' & b(3 DOWNTO 0); ss <= aa + bb + Ci;--对齐相加. f(3 DOWNTO 0) <= ss(3 DOWNTO 0); Co <= ss(4);--ss(4)为此次四位全加器的进位情况 END test1;
rtf图
真值表
渐渐修改:
LIBRARY ieee; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY BCDadder_xuchaoxin IS PORT (--基于四位全加器的8421BCD码全加器 AA, BB : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CIN : IN STD_LOGIC; SS : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC); END BCDadder_xuchaoxin; --方法一:元件例化法: ARCHITECTURE instantiation OF BCDadder_xuchaoxin IS COMPONENT adder_xuchaoxin PORT (--在结构体正式开始(begin)编写之前中引入原件声明component_port_end_component A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 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; --为修正判别过渡部分声明创建信号Q1, SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q2 : STD_LOGIC_VECTOR(2 DOWNTO 0);--表示修正值0、6 SIGNAL COU : STD_LOGIC; SIGNAL COUT1 : STD_LOGIC; --符号"=>"给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。 --比如:w<= (0=> '1',OTHERS => '0')--最低位是1,其他位是О(箭头换了,但赋值方向仍为从右到左) BEGIN--实例化四位全加器 U1 : adder_xuchaoxin PORT MAP(A => AA, B => BB, CI => CIN, f => Q1, co => cou); --在元件实例化过程中有两种方法可以用来实现元件端口的映射:位置映射和名称映射。 cout1 <= NOT((NOT cou) AND (Q1(3)NAND Q1(2)) AND (Q1(3)NAND Q1(1))); Q2 <= (2 => cout1, 1 => cout1, OTHERS => '0');--Q2基于(间接地)Q1,直接基于cout1 U2 : adder_xuchaoxin PORT MAP(A => Q2, B => Q1, CI => '0', f => ss, co => cout); END instantiation; --方法2:行为描述: ARCHITECTURE behavior OF BCDadder_xuchaoxin IS COMPONENT adder_xuchaoxin PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 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; --为修正判别过渡部分创建信号Q1, SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q2 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL COU : STD_LOGIC; SIGNAL COUT1 : STD_LOGIC; --符号"=>"给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。 --比如:w<= (o=> '1',OTHERS => '0')--最低位是1,其他位是О(箭头方向换了,不同于赋值,这是一个绑定(映射)端口的操作) BEGIN--实例化四位全加器 U1 : adder_xuchaoxin PORT MAP(A => AA, B => BB, f => Q1, CI => CIN, CO => COU); PROCESS (AA, BB, CIN)--通过process(args)来使用if结构 BEGIN--做修正判断 IF (COU = '1') THEN--A+B>15时 Q2 <= Q1 + 6;--加6修正 ELSIF (Q1 > 9) THEN--A+B>9时 COUT1 <= '1'; Q2 <= Q1 - 10; ELSIF (Q1 < 10) THEN--A+B<10,不需要修正(或者说修正值为0即可),直接将Q1的值赋给Q2 Q2 <= Q1; COUT1 <= '0'; END IF; --将元件的端口绑定道主实体adder_xuchaoxin这给BCD加法器上: SS <= Q2;--本位相加结果(还是一个8421BCD码,位宽为4,取值0~15); COUT <= COUT1;--本次两个BCD码相加的进位情况(0/1); END PROCESS; END behavior; --使用第二种实现来仿真 CONFIGURATION configure OF BCDadder_xuchaoxin IS FOR behavior END FOR; END CONFIGURATION configure;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-08-10 android_logcat日志调试工具:只查看某个级别的日志(例如只查看你debug级别而不要显示高于debug级别的日志)
2023-08-10 searchEngin_设置bing国际版为默认引擎