二位全加器(VHDL)
(12-13)1位二进制全加器的VHDL设计
3、标准逻辑矢量:std_logic_vector( * downto *) 或者 std_logic_vector( * to *) 表示一维数组或者总线 并置操作符& 用于将单独的信号合并起来组成新的数组或 者总线 4、1位全加器的VHDL描述 半加器的VHDL描述 全加器的VHDL描述(层次设计)
作用:表示多分支情况的选择语句,各分支无优先级。 执行:每次启动CASE语句,只选择执行其中一个分支的语句。 注意:(1)对所有的情况都要赋值,否则会综合成锁存器。 (2)CASE语句只能在process语句中使用。 (3)与IF语句的区别。
2. 标准逻辑矢量数据类型STD_LOGIC_VECTOR
半加器h_adder电路图
全加器f_adder电路图
▼半加器描述和CASE语句
半加器h_adder逻辑功能真值表 a b so co 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 可使用CASE语句描述真值表
1. CASE语句
CASE语句的一般表式是:
CASE <表达式> IS When <选择值1或标识符1> => <顺序语句>; ... ; <顺序语句> ; When <选择值2或标识符2> => <顺序语句>; ... ; <顺序语句> ; ... END CASE ;
课外练习:
采用调用方法设计8位全加器 。 提示:调用8次,将8个1位全加器串连起来。
4 计数器设计
知识要点
计数器:广泛用于控制。 整数:INTEGER, 要定义范围,便于综合器确定线 宽。 • 表示方法:如2,35,16#d9#, 2#11001#等。 • 自然数和正整数。 操作符的重载函数 • 重载:给操作符赋予新的功能,使不同数据类型 的数据可以混合使用 • 使用重载函数: USE IEEE.STD_LOGIC_UNSIGNED.ALL
vhdl 中的generate语句
vhdl 中的generate语句generate语句是在编写VHDL代码时用于生成重复结构的语句。
使用generate语句可以使得代码更加简洁,可读性更强,并且可以快速地生成大量的代码。
generate语句通常包含在architecture体中,在一个实体(entity)中可以定义多个architecture体。
generate语句用于生成不同的电路部件,这些电路部件并不在同一个层次上,而是在一个高层次的模块内部。
generate语句通常用于生成多个实例化模块的问题,针对于那种在实际电路中需要多个相同的模块的情况而言。
begin………其中,generate和end generate配对,位于一个缩进之内的所有语句一起作为generate语句的一部分。
在begin和end之间可以包含各种语句,例如if语句、for循环语句、case语句等。
此外,在generate语句中还可以使用类似于entity体和architecture体的定义方式来定义子程序或组合逻辑的方式来自动生成多种电路。
举个例子,假设我们要为一个N位的2进制加法器自动生成多位全加器。
假设我们已经定义了一个4位全加器,为了生成N位全加器,我们可以使用一个简单的for循环语句:生成一个4位全加器:library ieee;use ieee.std_logic_1164.all;entity fulladder isport(a: in std_logic; b: in std_logic; cin: in std_logic; s: out std_logic;cout: out std_logic);signal temp1,temp2,temp3,temp4: std_logic;temp1 <= a xor b;temp4 <= temp3 and cin;end str;现在我们可以使用generate语句来生成一个N位的全加器。
VHDL第4章_全加器
元件例化语句的第二部分则是此元件与当前设计实体(顶层文件 中 元件例化语句的第二部分则是此元件与当前设计实体 顶层文件)中 顶层文件 元件间及端口的连接说明。语句的表达式如下: 元件间及端口的连接说明。语句的表达式如下:
例化名 : 元件名 PORT MAP( [端口名 =>] 连接端口名 连接端口名,...); 端口名
3. 并置操作符 &
以下是一些并置操作示例: 以下是一些并置操作示例: SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; ... a <= '1'&'0'&d(1)&'1' ; -- 元素与元素并置,并置后的数组长度为 元素与元素并置,并置后的数组长度为4 & & & ... IF a & d = "101011" THEN ... –- 在IF条件句中可以使用并置符 条件句中可以使用并置符
co 0 0 0 1
1位二进制半加器 位二进制半加器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT (a,b : IN STD_LOGIC; , co, so : OUT STD_LOGIC); END ENTITY h_adder; ; ARCHITECTURE fh1 OF h_adder I BEGIN so <= (a OR b)AND(a NAND b); co <= NOT( a NAND b); END ARCHITECTURE fh1;
二位BCD码加法器的VHDL源程序如下
二位BCD码加法器的VHDL源程序如下:ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity bcdadd is ---------------------实体部分port(key:in std_logic;---------------定义key输入口a0,a1,b0,b1:in integer range 0 to 9; -----定义两个加数的输入口a0l,a1l,b0l,b1l,s0l,s1l,s2l:out std_logic_vector(6 downto 0);----定义七个输出数码管s:out std_logic);----定义Key指示灯输出口end;architecture one of bcdadd is ----------结构体部分signal one:integer range 0 to 18; ----定义两个数的个位相加之后的信号signal ten:integer range 0 to 19; -----定义两个数的十位相加之后的信号signal co1,co2:integer range 0 to 1; ----定义个位和十位的进位信号signal s0,s1:integer range 0 to 15;beginp1:process(one,ten,a0,b0,a1,b1,co1)----第一个进程,进行加运算beginone<=a0+b0; --------------------个位相加之和if one>9 then--------------------和大于9,进位为1co1<=1;s0<=one-10; -----------------------个位的值else -----------------------和小于9,进位为0co1<=0;s0<=one; -------------------------个位的值end if;ten<=a1+b1+co1;----------------------十位相加值和,加数包括个位来的进位if ten>9 then -------------------和大于9,进位为1co2<=1;s1<=ten-10;-------------------十位的值else ----------------------------------和小于9,进位为0co2<=0;s1<=ten;-----------------------十位的值end if;end process p1;p2:process(a0,a1,b0,b1) ----------第二个进程,两个加数的输出数码管显示译码begincase a0 is ----------------------被加数的个位显示译码when 0=>a0l<="1000000";when 1=>a0l<="1111001";when 2=>a0l<="0100100";when 3=>a0l<="0110000";when 4=>a0l<="0011001";when 5=>a0l<="0010010";when 6=>a0l<="0000010";when 7=>a0l<="1111000";when 8=>a0l<="0000000";when 9=>a0l<="0010000";when others=>a0l<="ZZZZZZZ";end case;case a1 is ------------------------------被加数的十位显示译码when 0=>a1l<="1000000";when 1=>a1l<="1111001";when 2=>a1l<="0100100";when 3=>a1l<="0110000";when 4=>a1l<="0011001";when 5=>a1l<="0010010";when 6=>a1l<="0000010";when 7=>a1l<="1111000";when 8=>a1l<="0000000";when 9=>a1l<="0010000";when others=>a1l<="ZZZZZZZ";end case;case b0 is-----------------------------加数的个位显示译码when 0=>b0l<="1000000";when 1=>b0l<="1111001";when 2=>b0l<="0100100";when 3=>b0l<="0110000";when 4=>b0l<="0011001";when 5=>b0l<="0010010";when 6=>b0l<="0000010";when 7=>b0l<="1111000";when 8=>b0l<="0000000";when 9=>b0l<="0010000";when others=>b0l<="ZZZZZZZ";end case;case b1 is ----------------------------加数的十位显示译码when 0=>b1l<="1000000";when 1=>b1l<="1111001";when 2=>b1l<="0100100";when 3=>b1l<="0110000";when 4=>b1l<="0011001";when 5=>b1l<="0010010";when 6=>b1l<="0000010";when 7=>b1l<="1111000";when 8=>b1l<="0000000";when 9=>b1l<="0010000";when others=>b1l<="ZZZZZZZ";en d case;end process p2;p3:process(key,s0,s1,co2,a0,a1,b0,b1) --------第三个进程,和的显示译码以及输入大于9是的出来beginif key='0' or a0>9 or b0>9 or a1>9 or b1>9 then --当key等于0或者两个输入中的任何一个位大于9,和的数码显示均为“Z”状态s0l<="ZZZZZZZ";s1l<="ZZZZZZZ";s2l<="ZZZZZZZ";elsecase s0 is-------------------------------和的个位显示译码when 0=>s0l<="1000000";when 1=>s0l<="1111001";when 2=>s0l<="0100100";when 3=>s0l<="0110000";when 4=>s0l<="0011001";when 5=>s0l<="0010010";when 6=>s0l<="0000010";when 7=>s0l<="1111000";when 8=>s0l<="0000000";when 9=>s0l<="0010000";when others=>s0l<="ZZZZZZZ";end case;case s1 is--------------------------------和的十位显示译码when 0=>s1l<="1000000";when 1=>s1l<="1111001";when 2=>s1l<="0100100";when 3=>s1l<="0110000";when 4=>s1l<="0011001";when 5=>s1l<="0010010";when 6=>s1l<="0000010";when 7=>s1l<="1111000";when 8=>s1l<="0000000";when 9=>s1l<="0010000";when others=>s1l<="ZZZZZZZ";end case;case co2 is --------------------------和的百位显示译码when 0=>s2l<="1000000";when 1=>s2l<="1111001";end case;end if;end process p3;p4:process(key) -------------第四个进程,设置key的指示灯begini f key='1' thens<='1' ;else s<='0';end if;end process p4;end;。
VHDL全加器的设计
实验四全加器的设计一、实验目的通过VHDL语言设计4位全加器,掌握加法器的设计方法;学习利用软件工具的模块封装(1位全加器)及连接使用方法,在软件工具的原理图输入法下完成4位全加器的设计。
二、实验原理根据数字电路全加器的理论知识,按图1所示的1位全加器的管脚图进行设计。
图 1 1位全加器管脚图三、实验内容用VHDL语言设计1位全加器,进行编译、波形仿真及器件编程。
代码一见附录,仿真图如下图 2 1位全加器功能仿真图使用原理图设计4位全加器进行编译、波形仿真及器件编程。
原理图如下仿真图如下用VHDL语言设计4位全加器,进行编译、波形仿真及器件编程,代码二见附录,仿真图如下图 5 4位全加器功能仿真图附录代码一、library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity swqjq isport (a,b:in std_logic;ci:in std_logic;co:out std_logic;s:out std_logic);end swqjq;architecture zhang of swqjq isbeginprocess (a,b,ci)beginif(a='0'and b='0'and ci='0') thens<='0';co<='0';elsif(a='1'and b='0'and ci='0') thens<='1';co<='0';elsif(a='0'and b='1'and ci='0') thens<='1';co<='0';elsif(a='1'and b='1'and ci='0') thens<='0';co<='1';elsif(a='0'and b='0'and ci='1') thens<='1';co<='0';elsif(a='0'and b='1'and ci='1') thens<='0';co<='1';elsif(a='1'and b='0'and ci='1') thens<='0';co<='1';elses<='1';co<='1';end if;end process;end zhang;代码二、library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity adder4b isport ( ci:in std_logic;a,b:in std_logic_vector(3 downto 0);s:out std_logic_vector(3 downto 0);co:out std_logic);end adder4b;architecture zhang of adder4b issignal sint:std_logic_vector(4 downto 0); signal aa,bb:std_logic_vector(4 downto 0); beginaa<='0'&a(3 downto 0);bb<='0'&b(3 downto 0);sint<=aa+bb+ci;s(3 downto 0)<=sint(3 downto 0);co<=sint(4);end zhang;。
EDA 实验一 用两种方法设计2位全加器
实验一用两种方法设计2位全加器实验目的:熟悉利用Quartus II的开发环境设计简单的组合逻辑电路,掌握层次化设计的方法,并通过一个2位全加器的设计把握利用EDA软件进行电子线路设计的各种详细流程。
实验原理:一个2位全加器可由2个1位全加器构成,加法器间的进位可以用串行的方式实现,即将低位的进位输出与高位的进位输入相连接。
而1个全加器的设计可以使用2个半加器进行组合。
这种层次化的设计过程中,每一个层次都可以使用原理图或是VHDL语言来实现。
实验任务:1、完成半加器、全加器的设计,每个层次都可以用原理图或是VHDL语言实现。
将其进行仿真和测试,并生成相应的硬件符号。
2、建立更高层次的原理图设计,将2个1位全加器构成1个2位全加器,完成相应的仿真和测试,使其可以在硬件电路板上实现。
实验内容:1、半加器,全加器(两种方法)方法一:半加器:library ieee;use ieee.std_logic_1164.all;entity h_adder isport(a,b:in std_logic;co,so:out std_logic);end entity h_adder;architecture act of h_adder isbeginso<=a xor b;co<=a and b;end architecture act;全加器:library ieee;use ieee.std_logic_1164.all;entity f_adder isport(ain,bin,cin:in std_logic;sum,cout:out std_logic);end entity f_adder;architecture act of f_adder iscomponent h_adderport(a,b:in std_logic;co,so:out std_logic);end component;signal co1,co2,temp:std_logic;beginu1:h_adder port map(a=>ain,b=>bin,co=>co1,so=>temp);u2:h_adder port map(a=>temp,b=>cin,co=>co2,so=>sum); cout<=co1 or co2;end architecture;方法二:半加器:全加器:2、一个2位全加器仿真波形:第一种设计方法:第二种设计方法:实验结果与总结:丰富自己,取悦自己,随缘,随顺,随境,你的心才会敞开,才会接纳更多的有可能。
实验二 加法器的设计与仿真实验报告
实验二加法器的设计与仿真一、实验目的:实现加法器的设计与仿真。
二、实验内容1.用逻辑图和VHDL语言设计全加器;2.利用设计的全加器组成串行加法器;3.用逻辑图和VHDL语言设计并行加法器。
三、实验步骤。
(一)、全加器、串行加法器和并行加法器的逻辑图。
1.全加器:2.串行加法器:3.74283:4位先行进位全加器逻辑框图:逻辑图:(二)、全加器、串行加法器和并行加法器的VHDL。
1.全加器:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY work;ENTITY quanjiaqi ISPORT(X : IN STD_LOGIC;Y : IN STD_LOGIC;CIN : IN STD_LOGIC;S : OUT STD_LOGIC;COUT : OUT STD_LOGIC);END quanjiaqi;ARCHITECTURE bdf_type OF quanjiaqi ISSIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_2 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_3 : STD_LOGIC;BEGINSYNTHESIZED_WIRE_2 <= Y AND X;SYNTHESIZED_WIRE_1 <= CIN AND Y;SYNTHESIZED_WIRE_3 <= CIN AND X;SYNTHESIZED_WIRE_0 <= X XOR Y;S <= SYNTHESIZED_WIRE_0 XOR CIN;COUT <= SYNTHESIZED_WIRE_1 OR SYNTHESIZED_WIRE_2 OR SYNTHESIZED_WIRE_3; END bdf_type;2.串行加法器:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY work;ENTITY chuanxingjiafaqi ISPORT(x0 : IN STD_LOGIC;y0 : IN STD_LOGIC;cin : IN STD_LOGIC;x1 : IN STD_LOGIC;x2 : IN STD_LOGIC;y2 : IN STD_LOGIC;x3 : IN STD_LOGIC;y3 : IN STD_LOGIC;y1 : IN STD_LOGIC;s0 : OUT STD_LOGIC;s1 : OUT STD_LOGIC;s2 : OUT STD_LOGIC;s3 : OUT STD_LOGIC;cout : OUT STD_LOGIC);END chuanxingjiafaqi;ARCHITECTURE bdf_type OF chuanxingjiafaqi ISCOMPONENT quanjiaqiPORT(X : IN STD_LOGIC;Y : IN STD_LOGIC;CIN : IN STD_LOGIC;S : OUT STD_LOGIC;COUT : OUT STD_LOGIC);END COMPONENT;SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_2 : STD_LOGIC;BEGINb2v_inst : quanjiaqiPORT MAP(X => x0,Y => y0,CIN => cin,S => s0,COUT => SYNTHESIZED_WIRE_0); b2v_inst1 : quanjiaqiPORT MAP(X => x1,Y => y1,CIN => SYNTHESIZED_WIRE_0,S => s1,COUT => SYNTHESIZED_WIRE_1); b2v_inst2 : quanjiaqiPORT MAP(X => x2,Y => y2,CIN => SYNTHESIZED_WIRE_1,S => s2,COUT => SYNTHESIZED_WIRE_2); b2v_inst3 : quanjiaqiPORT MAP(X => x3,Y => y3,CIN => SYNTHESIZED_WIRE_2,S => s3,COUT => cout);END bdf_type;3.74283:4位先行进位全加器LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY work;ENTITY 74283_0 ISPORT(CIN : IN STD_LOGIC;A1 : IN STD_LOGIC;A2 : IN STD_LOGIC;B2 : IN STD_LOGIC;A3 : IN STD_LOGIC;A4 : IN STD_LOGIC;B4 : IN STD_LOGIC;B1 : IN STD_LOGIC;B3 : IN STD_LOGIC;SUM4 : OUT STD_LOGIC;COUT : OUT STD_LOGIC;SUM1 : OUT STD_LOGIC;SUM2 : OUT STD_LOGIC;SUM3 : OUT STD_LOGIC );END 74283_0;ARCHITECTURE bdf_type OF 74283_0 IS BEGIN-- instantiate macrofunctionb2v_inst : 74283PORT MAP(CIN => CIN,A1 => A1,A2 => A2,B2 => B2,A3 => A3,A4 => A4,B4 => B4,B1 => B1,B3 => B3,SUM4 => SUM4,COUT => COUT,SUM1 => SUM1,SUM2 => SUM2,SUM3 => SUM3);END bdf_type;四、实验仿真结果。
数电VHDL代码-七段数码管译码器-表决器-半加器-全加器-四位串型加法器
七段数码管译码器library ieee;use ieee.std_logic_1164.all;entity seg7_1 isport(a: in std_logic_vector(3 downto 0);b: out std_logic_vector(6 downto 0));end entity seg7_1;architecture one of seg7_1 isbegin process(a)begin case a iswhen"0000" => b<="1111110";when"0001" => b<="0110000";when"0010" => b<="1101101";when"0011" => b<="1111001";when"0100" => b<="0110011";when"0101" => b<="1011011";when"0110" => b<="1011111";when"0111" => b<="0001111"; when"1000" => b<="1111111"; when"1001" => b<="1111011";when others => b<="0000000";end case;end process;end ;表决器library ieee;use ieee.std_logic_1164.all;entity vote isport(I: in std_logic_vector(3 downto 0); Y: out std_logic);end entity vote;architecture one of vote isbeginY<=(I(2) and I(1) and I(0)) or (I(3) and I(2) and I(0)) or (I(3) and I(1) and I(0)) or (I(3) and I(2) and I(1));end one;半加器library ieee;use ieee.std_logic_1164.all;entity hadder isport(a,b: in std_logic;s,co: out std_logic);end entity hadder;architecture one of hadder isbegins<=a xor b;co<=a and b;end one;全加器library ieee;use ieee.std_logic_1164.all;entity fadder isport(ain,bin,cin: in std_logic;cout,sum: out std_logic);end entity fadder;architecture one of fadder iscomponent hadderport(a,b:in std_logic;co,s:out std_logic);end component ;signal d,e,f:std_logic;beginu1:hadder port map (a=>ain,b=>bin,co=>d,s=>e); u2:hadder port map (a=>e,b=>cin,co=>f,s=>sum); cout<=d or f;end;四位串型加法器library ieee;use ieee.std_logic_1164.all;entity adder4 isport(A,B: in std_logic_vector(3 downto 0); M: in std_logic;R:in std_logic;S: out std_logic_vector(3 downto 0);C: out std_logic);end entity adder4;architecture a of adder4 iscomponent fadderport(ain,bin,cin:in std_logic;cout,sum:out std_logic);end component ;signal D,F:std_logic_vector(3 downto 0); beginD(0)<=M xor B(0);D(1)<=M xor B(1);D(2)<=M xor B(2);D(3)<=M xor B(3);F(0)<=M xor R;u1:fadder port map(ain=>A(0),bin=>D(0),cin=>F(0),cout=>F(1),sum=>S(0)); u2:fadder port map (ain=>A(1),bin=>D(1),cin=>F(1),cout=>F(2),sum=>S(1)); u3:fadder port map (ain=>A(2),bin=>D(2),cin=>F(2),cout=>F(3),sum=>S(2)); u4:fadder port map (ain=>A(3),bin=>D(3),cin=>F(3),cout=>C,sum=>S(3));end;。
(VHDL实验报告)一位半加器,全加器的设计
A
10
五、实验步骤
(一)半加器的设计
4、对设计文件进行仿真
4)编辑输入端口波形,即指定输入端口的逻辑电平变化,在波形编辑窗 口中,选择要输入波形的输入端口。以 b 端口为例,右键单击 b ,依次选 择value--clock--period,将时间改为1us。然后重复此过程将 a 的时间改 成 2us (a的周期是b的2倍),再将输入端的D0--D3选择不同的周期(一次 要有所差别)。最后选择软件的 Fie>Save进行保存。
3)加入输入、输出端口,在波形编辑器窗口左边的端口名列表 区点击鼠标右键,在弹出的右键菜单中选择 Insert Node or Bus… 命令,在弹出的 Insert Node or Bus 对话框界面中点击 Node Finder…按钮。在出现的 Node Finder 界面中的 Filter 列表中选 择 点击 List,在 Nodes Found 窗口出现所有信号的名称,点击中 间的按钮则 Selected Nodes 窗口下方出现被选择的端口名称。双击 OK按钮,完成设置,回到 Insert Node or Bus 对话框,双击OK按钮 ,所有的输入、输出端口将会在端口名列表区内显示出来。
5)按默认选项,点击NEXT出现新建工程以前所有的设定信息, 再点击FINISH完成新建工程的建立。
A
7
五、实验步骤
(一)半加器的设计
2、建立文本设计文件
1)选择File--New--Device Design Files--VHDL File,点击OK按钮,打开进入文本编辑器对话框。
2)在文本编辑器中输入对应VHDL程序代码,如下图 所示:
全加器的设计采用“元件例化语句”,故需建立两个VHDL文 本编辑对话框(一个顶层文件,一个底层文件)。在相应的编辑框中 输入相应的VHDL语句,再分别以各自的实体名进行保存。注意的是顶 层文件名应必须与工程名一致。此次实验底层文件为半加器VHDL语句 ,顶层文件为全加器VHDL语句,其语句分别如下两图所示:
全加器 VHDL
布尔方程library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fadder_boole isport(ai,bi:in std_logic;ci:in std_logic;si:out std_logic;co:out std_logic);end fadder_boole;architecture behavior of fadder_boole isbeginsi<=ai xor bi xor ci;co<=(ai and bi)or(ai and ci)or(bi and ci); end behavior;with select whenlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fadder_withselect isport(ai,bi:in std_logic;ci:in std_logic;si:out std_logic;co:out std_logic);end fadder_withselect;architecture behavior of fadder_withselect is signal temp:std_logic_vector(2 downto 0); begintemp<=ci&ai&bi;with temp selectsi<='0' when "000",'1' when "001",'1' when "010",'0' when "011",'1' when "100",'0' when "101",'0' when "110",'1' when others;with temp selectco<='0' when "000",'0' when "001",'0' when "010",'1' when "011",'0' when "100",'1' when "101",'1' when "110",'1' when others;end behavior;when elselibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fadder_whenelse isport(ai,bi:in std_logic;ci:in std_logic;si:out std_logic;co:out std_logic);end fadder_whenelse;architecture behavior of fadder_whenelse is signal temp:std_logic_vector(2 downto 0); begintemp<=ci&ai&bi;si<='0' when temp="000"else'1' when temp="001"else'1' when temp="010"else'0' when temp="011"else'1' when temp="100"else'0' when temp="101"else'0' when temp="110"else'1' when temp="111";co<='0' when temp="000"else'0' when temp="001"else'0' when temp="010"else'1' when temp="011"else'0' when temp="100"else'1' when temp="101"else'1' when temp="110"else'1' when temp="111";end behavior;if then elselibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fadder_ifthenelse isport(ai,bi:in std_logic;ci:in std_logic;si:out std_logic;co:out std_logic);end fadder_ifthenelse;architecture behavior of fadder_ifthenelse isbeginprocess(ci,ai,bi)variable temp:std_logic_vector(2 downto 0);begintemp:=ci&ai&bi;if(temp="000")thensi<='0';co<='0';elsif(temp="001")thensi<='1';co<='0';elsif(temp="010")thensi<='1';co<='0';elsif(temp="011")thensi<='0';co<='1';elsif(temp="100")thensi<='1';co<='0';elsif(temp="101")thensi<='0';co<='1';elsif(temp="110")thensi<='0';co<='1';elsesi<='1';co<='1';end if;end process;end behavior;case whenlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fadder_casewhen isport(ai,bi:in std_logic;ci:in std_logic;si:out std_logic;co:out std_logic);end fadder_casewhen;architecture behavior of fadder_casewhen isbeginprocess(ci,ai,bi)variable temp:std_logic_vector(2 downto 0);begintemp:=ci&ai&bi;case temp iswhen "000"=>si<='0';co<='0';when "001"=>si<='1';co<='0';when "010"=>si<='1';co<='0';when "011"=>si<='0';co<='1';when "100"=>si<='1';co<='0';when "101"=>si<='0';co<='1';when "110"=>si<='0';co<='1';when "111"=>si<='1';co<='1';when others=>null;end case;end process;end behavior;。
实验一 一位二进制全加器设计实验
南昌大学实验报告学生姓名: 学 号: 专业班级: 中兴101实验类型:■ 验证 □ 综合 □设计 □ 创新 实验日期: 2012 9 28 实验成绩:实验一 一位二进制全加器设计实验一.实验目的(1)掌握Quartus II 的VHDL 文本设计和原理图输入方法设计全过程; (2)熟悉简单组合电路的设计,掌握系统仿真,学会分析硬件测试结果; (3) 熟悉设备和软件,掌握实验操作。
二.实验内容与要求(1)在利用VHDL 编辑程序实现半加器和或门,再利用原理图连接半加器和或门完成全加器的设计,熟悉层次设计概念;(2)给出此项设计的仿真波形;(3)参照实验板1K100的引脚号,选定和锁定引脚,编程下载,进行硬件测试。
三.设计思路一个1位全加器可以用两个1位半加器及一个或门连接而成。
而一个1位半加器可由基本门电路组成。
(1) 半加器设计原理能对两个1位二进制数进行相加而求得和及进位的逻辑电路称为半加器。
或:只考虑两个一位二进制数的相加,而不考虑来自低位进位数的运算电路,称为半加器。
图1为半加器原理图。
其中:a 、b 分别为被加数与加数,作为电路的输入端;so 为两数相加产生的本位和,它和两数相加产生的向高位的进位co 一起作为电路的输出。
半加器的真值表为表1 半加器真值表absoco0 0 0 0 0 1 1 0 1 0 1 0 111由真值表可分别写出和数so ,进位数co 的逻辑函数表达式为:b a b a b a so ⊕=+=--(1)ab co = (2)图1半加器原理图(2) 全加器设计原理除本位两个数相加外,还要加上从低位来的进位数,称为全加器。
图2全加器原理图。
全加器的真值表如下:表2全加器真值表c a b co so0 0 0 0 00 0 1 0 10 1 0 0 10 1 1 1 01 0 0 0 11 0 1 1 01 1 0 1 01 1 1 1 1其中a为加数,b为加数,c为低位向本位的进位,co为本位向高位的进位,so为本位和。
用VHDL设计快速BCD码加法器
用VHDL 设计快速BCD 码加法器ΞThe D esign of Rap id Adder Usi ng VHDL南京邮电学院 (南京210003) 张生平 薛 梅 【摘 要】 介绍了一种多位BCD 码快速加法器的设计方法,并给出了3位BCD 码加法器的V HDL 源程序和在Foundati on Series 3.1i 环境中的模拟结果。
关键词:VHDL ,BCD ,程序【Abstract 】 T h is p ap er in troduces a w ay fo r design ing rap id adder ,and an exam p le of 32b it 2BCD 2adder is p rovided in V HDL ,and also the si m u lati on resu lt in Foundati on Series 3.1i is given .Keywords :VHSI C Hardware D escr iption Language ,B i nary Coded D ec i m a l ,program 通常对BCD 操作数进行计算的方法是将BCD 输入变换成二进制数,按正数的二进制格式进行计算,然后把二进制数计算结果变换回BCD 符号。
例如加法运算,首先按二进制格式进行运算,然后进行修正。
再用中规模集成电路设计多位BCD 数加法器,采用二进制加法器(如74283)构成BCD 加法器然后进行级连,或直接用BCD 加法器(如M C 14560)进行级连。
这样构成的加法器,位数增加,速度显著降低。
随着可编程逻辑器件的出现,可以将多位的BCD 加法器做到可编程器件内部,图1图1 BCD 数直接相加示意图所示为3位BCD 加法器的设计方法示意图。
其设计思想如下:两个BCD 数A 和B 是12位(按二进制)的操作数,代表000-999之间的十进制数。
EDA-Quartus II新实验指导书
实验的基本步骤本实验指导书的所有实验基于EDA实验台进行。
采用软件为Quartus II ,硬件芯片为ALTERA 的Cyclone II 系列FPGA芯片EP2C8Q208C8。
使用本EDA实验台进行数字逻辑实验,不需要进行手工接线。
实验工作分3步进行:1:在PC机上,基于Quartus II软件进行原理图(逻辑图)的设计,设计完成后,需要经过引脚锁定、编译下载到EDA实验台上的FPGA芯片中。
下载完成后,即在FPGA 芯片中形成物理的逻辑电路。
此步工作相当于传统实验的基于物理器件的接线操作。
2:在PC机上仿真,验证逻辑的正确性3:下载到板子上,进行物理验证(需要安装USB Blaster线缆驱动,具体安装方法自行上网查找)。
此过程可以用万用表、LED指示灯、七段码等验证实验的正确性。
实验的注意事项1:Quartus II的工程名和顶层实体名字必须为英文,且实体名字必须和VHDL代码的实体名字严格一致。
存储路径最好不要含中文和空格。
2:Quartus II的设计中所有的命名中,名字不要有空格。
3:Quartus II的原理图方式设计中放置“input”“ouput”引脚符号时,引脚符号的虚线框和原件的虚线框要刚好对上,以保证连接上,虚线框分开和部分重叠都不能正确连接。
4:所用到的时钟信号必须锁定到28脚,具体原理参考“实验用到的资源和原理”部分。
实验报告格式和内容书写实验报告,语言要简练,书写端正、作图正规。
按照如下格式和内容书写。
注意:试验5为综合性实验,其格式和实验1到4不同,同时其需要有封面并装订成册。
一般实验(实验1――4)项目名称一、实验目的及要求二、实验仪器设备三、实验内容、结果四、实验总结包括实验中遇到的问题,如何解决遇到的问题;实验后的认识和感悟等。
综合性实验(实验6)项目名称一、实验内容二、实验目的及要求三、实验仪器设备四、实验结果五、实验总结实验用到的资源和原理需要的资源:1:逻辑开关2:发光二极管指示灯3:20M时钟数字逻辑实验需要用到的输入为逻辑0、1,由逻辑开关提供,实验板提供了5个逻辑开关,为KEY_OK,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,和FPGA的连接关系如下表1-1。
实验二 vhdl半加器与全加器的设计与验证实验
北京邮电大学世纪学院<通信工程系数字电路实验>实验报告实验名称:VHDL半加器与全加器的设计与验证实验班级:姓名:专业:学号:实验室:实验组别:实验时间:审阅教师:评定成绩:实验题目基于 VHDL 的半加器与全加器的设计与验证实验一、实验目的1、学习 Quartus II 软件的使用;2、VHDL 半加器的设计与验证实验;3、VHDL 全加器的设计与验证实验;4、掌握模块的 VHDL 调用;5、学习基于 VHDL 的数字电路的设计。
二、预习内容1、VHDL 语言的基本结构;2、VHDL 语言的数据类型和运算操作符;3、VHDL 语言的主要描述语句;三、实验内容本实验主要运用 Quartus II 软件进行 VHDL 电路设计;内容一、VHDL 半加器的设计,包括电路设计并进行时序仿真验证,然后将电路设计进行实际电路的验证;内容二、VHDL 全加器的设计,在VHDL 程序中调用生成的半加器图形符号完成全加器设计,时序仿真验证后,将全加器电路进行实际电路的验证;本实验的重点和难点是 VHDL 语言的使用1、VHDL 半加器电路的设计2、VHDL 半加器电路的时序验证3、VHDL 全加器电路的设计4、全加器电路的时序验证四、实验结果分析对所设计的半加器电路、全加器电路进行实际电路的验证。
分析:五、思考题1、在采用 Quartus II 软件进行 VHDL 电路设计中,工程名、实体名、结构体名如何选取,实体名、结构体名是否可以任意选取,为什么?2、一个完整的 VHDL 语言程序通常包含那几部分?3、VHDL 结构体有那三种描述方式?六、总结。
第3章二进制半加器和全加器的VHDL设计
ENTITY h_adder IS
PORT (a, b : IN STD_LOGIC;
co, so : OUT STD_LOGIC); END ENTITY h_adder;
I113
ARCHITECTURE fh1 OF h_adder is SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ; --定义标准逻辑位矢量
so co
0
0
1
0
1
0
0
1
现在你能否写出实现半 加器的VHDL程序呢?
异或 与
3.2 半加器及全加器的VHDL描述
⑤【例3-2】 LIBRARY IEEE; --半加器描述(1):真值表描述方法 USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS
PORT (A, B : IN STD_LOGIC; co, soபைடு நூலகம்: OUT STD_LOGIC);
进位。
0
1
1
1
0
全加器能进行加数、 1
0
0
0
1
被加数和低位来的
1
0
1
1
0
进位信号相加,并
1
1
0
1
0
根据求和结果给出
1
1
1
1
1
该位的进位信号。
1位二进制全加器真值表
Sum=ain+bin+cin
思考:全加器是加数+被加数+进位,是三者加了两回
3.4 全加器的VHDL描述
u1 h_adder
net2
h_adder
逻辑运算符 AND
vhdl不同位宽数据相加
vhdl不同位宽数据相加VHDL是面向信号处理领域的硬件描述语言,用于数字电路和系统设计。
在数字电路和系统中,进行数据相加是最基本的操作,通常用于加法器。
当我们需要进行不同位宽数据的相加时,使用VHDL来描述这种行为变得非常重要。
在讨论VHDL中不同位宽数据相加的实现之前,我们需要先理解什么是位宽。
位宽是表示数字的二进制数的长度。
例如,在八位系统中,我们可以使用8位二进制数来表示数字。
对于每个二进制数,我们可以表示从0到255的十进制数。
位宽取决于应用程序的需求和硬件性能的要求。
在VHDL中,我们可以使用现有的加法器来实现两个相同位宽的数据之间的相加。
例如,对于两个8位位宽数据的相加,我们可以使用标准的8位加法器来实现。
这可以通过使用VHDL中的加法运算符“+”来完成。
以下是一个实现两个8位数据相加的简单代码示例:```vhdl library IEEE; useIEEE.STD_LOGIC_1164.ALL;entity adder is port (a : in std_logic_vector(7 downto 0); b : in std_logic_vector(7 downto 0); c : out std_logic_vector(7 downto 0)); end adder;architecture Behavioral of adder is begin c<= a + b; end Behavioral; ```在上面的代码中,我们定义了一个加法器实体,并为输入值a和b以及输出值c定义了端口。
addition运算符(+)以一个8位的std_logic_vector数据类型作为输入参数,并在输出参数c中输出结果。
然而,在某些情况下,我们需要进行不同位宽数据的相加。
例如,我们需要将16位位宽数据和8位位宽数据相加。
在这种情况下,我们需要对8位和16位数据进行位扩展,以便它们具有相同的位宽。
位二进制全加器VHDL的设计
4.4 计数器设计
表面上具有双向端口的功能,但实际上其输入功能是不完整的,它只能将自己输出的信 号再反馈回来,并不含有的功能。
表式Q <= Q + 1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外, 前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q + 1,需等待下一个时钟周 期。
... ;
作用:表示多分支情况的选择语句,各分支无优先级。 执行:每次启动语句,只选择执行其中一个分支的语句。
注意:(1)对所有的情况都要赋值,否则会综合成锁存器。 (2)语句只能在语句中使用。 (3)与语句的区别。
2. 标准逻辑矢量数据类型
在使用中,必须注明其数组宽度,即位宽,如: B : (7 0) --8位数 或 A :(1 4)--4位数
检测是否允许计数
< "1001"
+ 1; 允许计数
( =>‘0’)等于或者大于9,计数值清零
;
;
;
= “1001” <= ‘1’; 计数等于9,输出进位信号
<= '0';
;
<= ;
将计数值向端口输出
;;ຫໍສະໝຸດ ▼ 相关语法说明5 一般加法计数器设计
1. 变量
2.
变量赋值符号 := 如‘1’
3.
变量的功能:用于数据暂存单元,只能在语句中定义和使用。
<= a & b ; ()
"00" => <='0'; <='0' ; "01" => <='1'; <='0' ; "10" => <='1'; <='0' ; "11" => <='0'; <='1' ; => ; ; ; 1;