二位全减器VHDL设计
实验四 实验名称:组合逻辑电路设计(二)—三态门、数选器、逻辑运算器
实验名称:组合逻辑电路设计(二)—三态门、数选器、逻辑运算器二、实验目的1)掌握三态门、数选器、逻辑运算器三种组合逻辑电路的设计方法,及其VHDL 描述方法。
2)掌握利用CPLD器件开发组合逻辑电路的方法。
三、实验器材PC,EDA软件四、实验原理1)示例7.5(见P195-196)示例7.6(见P197-198)示例7.7(见P198-199)2)注意事项:(1)有时程序代码虽然简单,但是占用器件资源却多;相反,有事程序代码虽然复杂,但是占用器件资源却少。
因此,不能简单地用程序代码简单还是复杂来判断程序代码的优劣,而是要对程序代码进行综合评价,才能得出比较科学的结论。
(2)Std_logic数据类型,除“0”、“1”外,还有其他值,用others穷尽所有可能的组合值。
(3)结构体“with_selece”是并行选择信号赋值语句。
与case语句相似,不允许条件重叠和涵盖不全。
要用“when others”代表其他值,以穷尽所有可能值。
(4)编程要根据要求及真值表,要考虑输入所有可能出现的情况,尽量简洁。
(5)建立功能仿真波形时,要穷尽输入信号的所有逻辑组合。
(6)下载后测试电路功能时,要验证真值表里的所有逻辑组合情况。
五、实验内容及结果(1)设计一个多数表决电路,要求:①当输入A、B、C、D有三个或三个以上为1时输出F为1;输入为其他状态时输出为0。
②写出实验内容的真值表及逻辑表达式。
③编写出实现该电路的VHDL程序。
④用MAX+plusⅡ进行仿真。
⑤将编写好的程序下载到CPLD芯片里,观察结果。
逻辑表达式:真值表:表格 1 多数表决器真值表输入输出A B C D F0 0 0 0 00 0 0 1 00 0 1 0 00 0 1 1 00 1 0 0 00 1 0 1 00 1 1 0 00 1 1 1 11 0 0 0 01 0 0 1 01 0 1 0 01 0 1 1 11 1 0 0 01 1 0 1 11 1 1 0 11 1 1 1 1 VHDL语言描述:仿真图形:(2)设计二个二位二进制数相乘电路,要求:①写出实验内容的真值表。
《EDA课程设计2位十进制四则运算电路》
《电子设计自动化》课程设计题目:2位十进制四则运算器电路院(系)信息科学与工程学院专业通信工程届别2011级班级1班学号1115102040姓名韦桂任课老师彭盛亮摘要本次课程设计主要内容是采用VHDL语言实现2位十进制数四则运算编程,用Quartus II 软件实现功能仿真,并完成硬件测试。
本次试验目的是:输入任意两个两十进制位数(0~99),选择计算模式(加减乘除),输出它们的计算结果,利用四个数码 LED 分别显示输入的两个两位数,利用四个发光二极管显示计算模式(每次只有一个二极管发光),利用另外四个数码管显示计算结果;实现方法是:将整个系统分为输入模块,计算模块和输出模块三个部分组成。
输入模块由3个脉冲键,2个复位键和2个使能端组成;计算模块分别为加法器,减法器,乘法器,除法器;输出模块通过8个数码管和4个发光二极管分别显示运算数值,运算结果和运算模式。
经过多次修改,波形仿真和硬件测试均成功。
设置两个计数器的复位键,以便于输入比较大的数之后,想进行比较小的数字的运算可以按复位键,以减少按键5或键6的次数,设置模块时,为使电路看起来更加简洁,应减少使用电路模块,如:都除以10取余时,把除数端口都连接在同一个常数端。
目录第一部分系统设计 (4)1.1设计要求: (4)1.2系统设计方案: (4)1.2.1设计总思路: (4)1.2.2实验的主要方法: (4)1.2.3电路设计: (4)1.2.4实验电路图: (4)(1)总电路 (5)(2)输入模块: (5)(3)计算模块 (5)(4)输出模块: (6)1.2.5:总体方法的论证与比较: (7)第二部分软件设计 (7)2.1软件设计平台 (7)2.2程序流程图 (7)2.3实验相关程序 (7)2.3.1clkA与clkB中需要用的100进制计数器cnt100: (7)2.3.2.四进制计数器cnt4程序: (8)2.3.3.nu15_add中需用的加法程序: (9)2.3.4.nu15_sub中需要用的减法程序: (9)2.3.5.nu15_mod程序: (10)2.4 总电路波形仿真 (11)2.5 管脚分配 (11)(1)Input: (11)(2)Output: (11)第三部分系统测试 (12)3.1 软件测试结构综合结果 (12)3.2仪器设备名称、型号 (12)3.3功能测试方法、步骤: (12)第四部分结论及收获 (13)4.1结论 (13)4.2致谢 (13)4.3 参考文献 (13)第一部分系统设计1.1设计要求:输入两个2位十进制数(0~99),输出它们的四则运算(加减乘除)结果;发光二极管显示运算模式;可调用LPM_MULT及LPM_DIVIDE模块。
二位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 四输入表决器 二位二进制乘法器 一位二进制全减器等源代码及仿真波形
将8421BCD转换为余3码源代码:Library ieee;Use ieee.std_logic_1164.all;Entity bcd isPort(a:in std_logic_vector(3 downto 0);y:out std_logic_vector(3 downto 0));End;Architecture rtl of bcd isBeginProcess(a)BeginCase a isWhen"0000"=>y<="0011";When"0001"=>y<="0100";When"0010"=>y<="0101";When"0011"=>y<="0110";When"0100"=>y<="0111";When"0101"=>y<="1000";When"0110"=>y<="1001";When"0111"=>y<="1010";When"1000"=>y<="1011";When"1001"=>y<="1100";When others=>y<="ZZZZ";End case;End process;End;仿真图形:(仿真结果均有延时,大约20ns)四输入表决器源代码:Library ieee;Use ieee.std_logic_1164.all;Entity bjq isPort(i:in std_logic_vector(3 downto 0);f:out std_logic);End;Architecture nm2 of bjq isBeginProcess(i)Begincase i isWhen"0000"=>f<='0';When"0001"=>f<='0';When"0010"=>f<='0';When"0011"=>f<='0';When"0100"=>f<='0';When"0101"=>f<='0';When"0110"=>f<='0';When"0111"=>f<='1';When"1000"=>f<='0';When"1001"=>f<='0';When"1010"=>f<='0';When"1011"=>f<='1';When"1100"=>f<='0';When"1101"=>f<='1';When"1110"=>f<='1';When"1111"=>f<='1';When others=>f<='Z';End case;End process;End;仿真图形:2位二进制相乘电路源代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity multi isport(A,B:in std_logic_vector(1 downto 0);F:out std_logic_vector(3 downto 0));end;architecture bhv of multi isbeginprocess(A,B)beginif(A="01" and B="01" )thenF<="0001";elsif(A="01" and B="10")thenF<="0010";elsif(A="01" and B="11")thenF<="0011";elsif(A="10" and B="01")thenF<="0010";elsif(A="10" and B="10")thenF<="0100";elsif(A="10" and B="11")thenF<="0110";elsif(A="11" and B="01")thenF<="0011";elsif(A="11" and B="10")thenF<="0110";elsif(A="11" and B="11")thenF<="1001";elseF<="0000";end if;end process;end;仿真图形:一位二进制全减器源代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity subtracter isport(A,B,Ci:in std_logic;F,Co:out std_logic);end;architecture bhv of subtracter isbeginprocess(A,B,Ci)beginif(A='0' and B='0' and Ci='0')thenF<='0';Co<='0';elsif(A='0' and B='0' and Ci='1')thenF<='1';Co<='1';elsif(A='0' and B='1' and Ci='0')thenF<='1';Co<='1';elsif(A='0' and B='1' and Ci='1')thenF<='0';Co<='1';elsif(A='1' and B='0' and Ci='0')thenF<='1';Co<='0';elsif(A='1' and B='0' and Ci='1')thenF<='0';Co<='0';elsif(A='1' and B='1' and Ci='0')thenF<='0';Co<='0';elseF<='1';Co<='1';end if;end process;end;仿真图形:开关控制电路源代码:Library ieee;Use ieee.std_logic_1164.all;Entity switch_control isPort(a,b,c:in std_logic;y:out std_logic);End;Architecture nm5 of switch_control isBeginProcess(a,b,c);V ariable comb:std_logic_vector(2 downto 0);BeginComb:=a&b&c;Case comb isWhen"000"=>y<='0';When"001"=>y<='1';When"011"=>y<='0';When"010"=>y<='1';When"110"=>y<='0';When"111"=>y<='1';When"101"=>y<='0';When"100"=>y<='1';When others=>y<='X';End case;End process;End;仿真图形:。
实验一:一位二进制全减器设计
南昌大学实验报告学生姓名:刘志强学号: 6100409222 专业班级:电子091班实验类型:验证□综合□设计■创新□实验日期:实验成绩:实验一一位二进制全减器设计一、实验目的(1)掌握QuartusII的VHDL原理图设计和文本设计全过程;(2)熟悉简单组合电路的设计,掌握系统仿真,学会分析硬件测试结果。
二、实验内容与要求(1)设计一个二进制全减器,用分层设计方法,顶层为全减器,底层为半减器和逻辑门组成;(2)进行波形仿真,并分析仿真波形图;(3)下载测试全减法器是否正确。
三、设计思路/原理图一位全减器可以由两个半减器和一个或门连接而成,根据半减器真值表对半减器进行描述,再对或门的VHDL描述,而后根据原理图对全减器的VHDL描述。
图1 全减器f_suber电路图四、实验程序(程序来源:教科书本)library ieee; --半减器描述use ieee.std_logic_1164.all;entity h_suber is --定义半减器h_suber实体port(a,b:in std_logic;do,vo:out std_logic);end entity h_suber;architecture fs1 of h_suber issignal abc:std_logic_vector (1 downto 0);beginabc <= a&b ;process (abc)begincase abc iswhen "00" => do<='0';vo<='0';when "01" => do<='1';vo<='1';when "10" => do<='1';vo<='0';when "11" => do<='0';vo<='0';when others => null;end case;end process;end architecture fs1;library ieee; --一位二进制全减器顶层设计描述use ieee.std_logic_1164.all;entity f_suber is --定义全减器f_suber实体port (ain,bin,cin:in std_logic;v,sub:out std_logic);end entity f_suber;architecture fs of f_suber iscomponent h_suber ---调用半减器声明语句port (a,b:in std_logic;do,vo:out std_logic);end component;component or2a --调用或逻辑门声明语句port (m,n:in std_logic;h:out std_logic);end component;signal e,f,g:std_logic; ---定义3个信号作为内部的连接线beginu1:h_suber port map(a=>ain,b=>bin,do=>e,vo=>f); ---例化语句u2:h_suber port map(a=>e,b=>cin,do=>sub,vo=>g);u3:or2a port map(m=>g,n=>f,h=>v);end architecture fs;五、实验步骤1. 利用Quartus II 7.2建立工程在file中打开【】→【】→在【】中选择存放的目录→【】f_suber要与顶层文件中entity f_suber相同→点击next→点击next→选择芯片→next完成;再在file下面点【】→【】→点击ok→编写程序→编译并保存在f_suber文件中(改动程序后,再保存,再编译)→管脚【】→【】→而后对芯片设置,即打开device→点【】→点【】与【】→选如【】与【】→选芯片→确定ok ;重新编译→点下载,后选【】硬件有“JTAG【】”和“ASP【】手动添加以扩展名为.pof的文件【】”两个接口其一(要看硬件接口),选中【】”→添加【】中的驱动程序→【】→点【】开始下载。
用VHDL结构描述设计一全减器
下面再将或门的VHDL程序描述如下:
ENTITY orgate IS PORT(A1,B1:IN BIT; O1:OUT BIT); END orgate;
ARCHITECTURE orgate_arc OF orgate IS BEGIN O1<= A1 OR B1; END orgate_arc;
下面将两个半减器,一个或门的端口,通过定义一 些中间信号将其连接起来形成VHDL的结构描述。
在下面举的全减器例子里可以看到定义了中间信号
temp_T,temp_c1和temp_c2
ENTITY fullsub IS PORT(I1,I2,C_IN:IN BIT; FT,C_OUT:OUT BIT); END fullsub; ARCHITECTURE fullsub_arc OF fullsub IS SIGNAL temp_T,temp_c1,temp_c2:BIT; COMPONENT halfsub U0 temp_T U1 PORT(A,B:IN BIT; FT I1 T,C:OUT BIT); I2 halfsub halfsub END COMPONENT; temp_c2 C_IN COMPONENT orgate PORT(A1,B1:IN BIT; temp_c1 U2 C_OUT O1:OUT BIT); END COMPONENT;
首先用VHDL的行为描述设计半减器:
ENTITY halfsub IS PORT(A,B:IN BIT; T,C:OUT BIT); END halfsub; ARCHITECTURE halfsub_arc OF halfsub IS BEGIN PROCESS(A,B) BEGIN T<= A XOR B AFTER 10 ns; C <= (NOT A) AND B AFTER 10 ns; END PROCESS; END halfsub_arc;
加法器、减法器的设计 VHDL
实验报告课程名称电子设计自动化实验(基于FPGA)实验项目加法器、减法器的设计实验仪器计算机+ Quartus Ⅱ9.1系别信息与通信工程学院专业通信工程班级/学号学生姓名实验日期2012、5成绩_______________________ 指导教师_______________________加法器、减法器的设计完成一个8位二进制带符号数的加减电路设计。
设计要求如下:通过拨码开关输入两组8位二进制数,最高位为符号位,0表示正数,1表示负数,其余位表示二进制数值。
用一按键对加、减方式进行控制,0表示加,1表示减。
输出用四位LED数码管显示BCD码。
其中LED显示器最高位为符号位。
VHDL代码LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all;ENTITY add ISPORT(a:in std_logic_vector(7 downto 0);b:in std_logic_vector(7 downto 0);ctrl:in std_logic;bcd:out std_logic_vector(15 downto 0));END ENTITY;ARCHITECTURE func OF add ISSIGNAL x:std_logic_vector(9 downto 0);SIGNAL y:std_logic_vector(9 downto 0);SIGNAL z:std_logic_vector(9 downto 0);SIGNAL c:std_logic_vector(8 downto 0);SIGNAL dec:integer;BEGINyunsuan:BLOCK --运算模块BEGINPROCESS(a)BEGINIF (a(7) = '0') THEN --判断正负x <= '0'&'0'&a;ELSEx(9 downto 8) <= '1'&'1';x(7 downto 0) <= NOT('0'&a(6 downto 0)) + 1;END IF;END PROCESS;PROCESS(a,ctrl)BEGINIF(ctrl = '0') THEN --控制键为0,则做加法IF(b(7) = '0') THENy <= '0'&'0'&b;ELSEy <= '1'&'1'&(NOT('0'&b(6 downto 0))+1);END IF;ELSEIF(b(7) = '1') THENy <= '0'&'0'&'0'&b(6 downto 0);ELSEy <= '1'&'1'&(NOT('0'&b(6 downto 0))+1);END IF;END IF;END PROCESS;PROCESS(a,b)BEGINIF(a(6 downto 0) = 0) THENz <= y;ELSE IF(b(6 downto 0) = 0) THENz <= x;ELSEz <= x + y;END IF;END IF;END PROCESS;PROCESS(z)BEGINIF(z(9) = '1') THEN --判断结果的正负c(7 downto 0) <= NOT z(7 downto 0) + 1;c(8) <= '1';ELSEc(8 downto 0) <= '0'&z(7 downto 0);END IF;END PROCESS;END BLOCK;bcdout:BLOCKBEGINdec <= CONV_INTEGER(c); --二进制转十进制PROCESS(c)BEGINCASE c(8) IS --判断最高位正负WHEN '0' => bcd(15 downto 12) <= "0000";WHEN '1' => bcd(15 downto 12) <= "0001";WHEN OTHERS => bcd(15 downto 12) <= NULL;END CASE;CASE dec/100 IS --判断百位数字WHEN 0 => bcd(11 downto 8) <= "0000";WHEN 1 => bcd(11 downto 8) <= "0001";WHEN OTHERS => bcd(11 downto 8) <= NULL;END CASE;CASE (dec REM 100)/10 ISWHEN 0 => bcd(7 downto 4) <= "0000";WHEN 1 => bcd(7 downto 4) <= "0001";WHEN 2 => bcd(7 downto 4) <= "0010";WHEN 3 => bcd(7 downto 4) <= "0011";WHEN 4 => bcd(7 downto 4) <= "0100";WHEN 5 => bcd(7 downto 4) <= "0101";WHEN 6 => bcd(7 downto 4) <= "0110";WHEN 7 => bcd(7 downto 4) <= "0111";WHEN 8 => bcd(7 downto 4) <= "1000";WHEN 9 => bcd(7 downto 4) <= "1001";WHEN OTHERS => bcd(7 downto 4) <= NULL;END CASE;CASE dec REM 10 ISWHEN 0 => bcd(3 downto 0) <= "0000";WHEN 1 => bcd(3 downto 0) <= "0001";WHEN 2 => bcd(3 downto 0) <= "0010";WHEN 3 => bcd(3 downto 0) <= "0011";WHEN 4 => bcd(3 downto 0) <= "0100";WHEN 5 => bcd(3 downto 0) <= "0101";WHEN 6 => bcd(3 downto 0) <= "0110";WHEN 7 => bcd(3 downto 0) <= "0111";WHEN 8 => bcd(3 downto 0) <= "1000";WHEN 9 => bcd(3 downto 0) <= "1001";WHEN OTHERS => bcd(3 downto 0) <= NULL;END CASE;END PROCESS;END BLOCK;END ARCHITECTURE;未下载验证、调试,如发现错误,见谅!——Higashi Q83831295。
VHDL加法器和减法器的原理
VHDL加法器和减法器的原理加法器3.2.1 加法器的原理在将两个多位二进制数相加时,除了最低位以外,每一位都应该考虑来自低位的进位,即将两个对应位的加数和来自低位的进位3个数相加。
这种运算称为全加,所用的电路称为全加器。
多位加法器的构成有两种方式:并行进位和串行进位。
并行进位加法器设有进位产生逻辑,预算速度较快;串行进位方式是将全加器级联构成多位加法器。
并行进位加法器通常比串行级联加法器占用更多的资源。
随着为数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大,因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。
本次设计采用的是并行加法器方式。
3.2.2 加法器要求实现的功能实现两个二进制数字的相加运算。
当到达时钟上升沿时,将两数输入,运算,输出结果。
3.2.3 加法器的VHDL语言实现(以下以12位数加16位数生成16位数的加法器为例)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add121616 isPORT(clk : in STD_LOGIC;Din1 :in signed (11 downto 0);Din2 :in signed (15 downto 0);Dout:out signed (15 downto 0));END add121616;ARCHITECTURE a of add121616 isSIGNAL s1: signed(15 downto 0);BEGINs1<=(Din1(11)&Din1(11)&Din1(11)&Din1(11)&Din1);PROCESS(Din1,Din2,clk)BEGINif clk'event and clk='1' thenDout<=s1+Din2;end if;end process;end a;3.2.4 加法器的模块图3.2.5 加法器的波形仿真完全符合设计要求。
采用VHDL层次化文件设计一个四位全减器
采用VHDL层次化文件设计一个四位全减器一、实训目的1.巩固VHDL层次化文件设计方法。
2.培养应用VHDL层次化文件设计法的技能。
二、实训器材计算机与Quartus Ⅱ工具软件。
三、实训指导(一)实训原理4位二进制减法器由4个全减器构成,而全减器又由一个半减器和一个或门构成,半减器的真值表如表4-1所示:表4-1 半减器的真值表输入输出a1b1s1c10000011110101100半减器的逻辑表达式为:s1=NOT(a1 XOR(NOT b1))c1=(NOT a1) AND b1一位全减器的真值表如表4-2所示:表4-2 一位全减器的真值表c_in i1i2fs c_out0000000111010100110010011101011100011111(二)实训步骤1.电路模块划分根据算法分析,4位二进制减法器可由4个全减器构成,画出其原理方框图。
全减器的原理方框图如图4-1所示。
而每个全减器又可划分为一个半减器和一个或门这两个更小的模块,画出其原理方框图。
4位二进制减法器的原理方框图如图4-2所示。
图4-1一位全减器原理方框图图4-2 4位二进制减法器原理框图2.设计底层设计文件(1)设计半减器文件halfsub.vhd 。
(2)设计或门电路文件orgate.vhd 。
(3)设计全减器电路文件fullsub.vhd ,其中把半减器和或门电路文件作为元件调用。
3.设计顶层设计文件设计顶层设计文件sub4.vhd ,其中把全减器文件作为元件调用。
VHDL 代码如下:halfsub.vhd文件代码如下:ENTITY halfsub ISPORT(a1,b1:IN BIT;s1,c1:OUT BIT);END halfsub;ARCHITECTURE a OF halfsub ISBEGINPROCESS(a1,b1)BEGINs1<=NOT(a1 XOR(NOT b1)) AFTER 10ns; c1<=(NOT a1) AND b1 AFTER 10 ns;END PROCESS;END a;orgate.vhd文件代码如下:ENTITY orgate ISPORT(a,b:IN BIT;o:OUT BIT);END orgate;ARCHITECTURE a OF orgate ISBEGINo<=a OR b;END a;fullsub.vhd文件代码如下:ENTITY fullsub ISPORT(i1,i2,c_in:IN BIT;fs,c_out:OUT BIT);END fullsub;ARCHITECTURE a OF fullsub ISSIGNAL temp_s,temp_c1,temp_c2:BIT; COMPONENT halfsubPORT(a1,b1:IN BIT;s1,c1:OUT BIT);END COMPONENT;COMPONENT orgatePORT(a,b:IN BIT;o:OUT BIT);END COMPONENT;BEGINU0:halfsub PORT MAP(i1,i2,temp_s,temp_c1);U1:halfsub PORT MAP(temp_s,c_in,fs,temp_c2);U2:orgate PORT MAP(temp_c1,temp_c2,c_out);END a;sub4.vhd文件代码如下:ENTITY sub4 ISPORT(a,b:IN BIT_VECTOR(3 DOWNTO 0);cin:IN BIT;fs:OUT BIT_VECTOR(3 DOWNTO 0);cout:OUT BIT);END sub4;ARCHITECTURE a OF sub4 ISSIGNAL temp_co0,temp_co1,temp_co2:BIT;COMPONENT fullsub ISPORT(i1,i2,c_in:IN BIT;fs,c_out:OUT BIT);END COMPONENT;BEGINU0:fullsub PORT MAP(a(0),b(0),cin,fs(0),temp_co0);U1:fullsub PORT MAP(a(1),b(1),temp_co0,fs(1),temp_co1); U2:fullsub PORT MAP(a(2),b(2),temp_co1,fs(2),temp_co2); U3:fullsub PORT MAP(a(3),b(3),temp_co2,fs(3),cout); END a;1.编译顶层设计文件把以上各个模块的VHDL设计文件放入同一个文件夹中,以顶层文件建立工程,直接编译顶层文件同时也就编译各个底层模块文件。
实验五 用VHDL语言进行多位减法器的设计
实验五用VHDL语言进行多位减法器的设计实验五用vhdl语言进行多位减法器的设计实验5用vhdl语言进行多位减法器的设计一、实验目的学习在quartusⅱ下用vhdl语言设计复杂组合电路与功能仿真的方法。
二、实验仪器设备1、pc机一台2、quartusⅱ。
三、实验要求1、复习教材中的有关内容,编写成多位减法器的vhdl源程序。
2、用vhdl语言输入方式完成电路设计,编译、仿真后,在试验箱上实现。
四、实验内容及参考实验步骤1、用vhdl语言设计一个半减器。
并展开编程仿真。
2、在半减器的基础上,利用元件例化语句,设计一个一位的全减器,并编译仿真。
3、在一位全减器的基础上,利用元件例化语句,设计一个8位的全减器,并编程仿真。
五、实验报告1、根据实验过程写出试验报告2、总结用vhdl语言的设计流程1、总结复杂组合电路的设计方法。
附录1、半减器程序libraryieee;useieee.std_logic_1164.all;entityh_suberisport(x,y:instd_logic;diff,s_out:outstd_logic);endentityh_suber;architecturebhvofh_suberisbeginprocess(x,y)begindiff<=xxory;s_out<=(notx)andy;endprocess;endarchitecturebhv;2、一位全减器程序libraryieee;useieee.std_logic_1164.all;entitysuberisport(x,y,sub_in:instd_logic;diffr,sub_out:outstd_logic);endentitysuber;signalt0,t1,t2:std_logic;beginu1:h_suberportmap(x=>x,y=>y,diff=>t0,s_out=>t1);u2:h_suberportmap(x=>t0,y=>sub_in,diff=>diffr,s_out=>t2);sub_out<=t1ort2;endar chitecturebhv;3、8位全减器程序libraryieee;useieee.std_logic_1164.all;entitysub8isport(a,b:instd_logic_vector(7downto0);sin:instd_logic;sout:outstd_logic;c:outstd_logic_vector(7downto0));endentitysub8;port(x,y,sub_in:instd_logic;signalt:std_logic_vector(6downto0);beginu0:suberportmap(x=>a(0),y=>b(0),sub_in=>sin,diffr=>c(0),sub_out=>t(0));u1:sube rportmap(x=>a(1),y=>b(1),sub_in=>t(0),diffr=>c(1),sub_out=>t(1));u2:suberportm ap(x=>a(2),y=>b(2),sub_in=>t(1),diffr=>c(2),sub_out=>t(2));u3:suberportmap(x=> a(3),y=>b(3),sub_in=>t(2),diffr=>c(3),sub_out=>t(3));u4:suberportmap(x=>a(4),y =>b(4),sub_in=>t(3),diffr=>c(4),sub_out=>t(4));u5:suberportmap(x=>a(5),y=>b(5) ,sub_in=>t(4),diffr=>c(5),sub_out=>t(5));u6:suberportmap(x=>a(6),y=>b(6),sub_i n=>t(5),diffr=>c(6),sub_out=>t(6));u7:suberportmap(x=>a(7),y=>b(7),sub_in=>t(6 ),diffr=>c(7),sub_out=>sout);endarchitecturebhv;。
用VHDL实现计算器
谢谢观看!
then in3:=in1/in2; t<=in3; end if; end process p1111;
--'*'
p111:process(t) begin case t is when 0=>g<="11111100";--0 when 1=>g<="01100000";--1 when 2=>g<="11011010";--2 when 3=>g<="11110010";--3 when 4=>g<="01100110";--4 when 5=>g<="10110110";--5 when 6=>g<="10111110";--6 when 7=>g<="11100000";--7 when 8=>g<="11111110";--8 when 9=>g<="11110110";--9 when others=>t<="00000010";--错 end case; end process p111;
程序源码
--库的引用 LIBRARY IEEE; --USE IEEE.std_logic_arith.ALL; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --use ieee.numeric_bit.all;
--实体声明 entity adder is port( d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d
二位全减器VHDL设计
根据一位二进制全减器的工作原理, 可得其真值表为 (如下: cin 表示低位向本位借位。 cout 表示本位向高位借位) ain 0 0 0 0 1 1 1 1 bin 0 0 1 1 0 0 1 1 cin 0 1 0 1 0 1 0 1 cout 0 1 1 1 0 0 0 1 sum 0 1 1 0 1 0 0 1
u2 : h_suber PORT MAP(a=>e, b=>cin, co=>f,so=>sum); u3 : or2a PORT MAP(a=>d, b=>f,c=>cout); END ARCHITECTURE fd1 ; ///////////////////////////////////////////////////////////////////////////////// LIBRARY IEEE; ——二位全减器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_2_suber IS PORT ( A,B: IN STD_LOGIC_VECTOR(1 DOWNTO 0); C0:IN STD_LOGIC; S: OUT STD_LOGIC_ VECTOR(1 DOWNTO 0); C:OUT STD_LOGIC ); END ENTITY f_2_suber; ARCHITECTURE one OF f_2_suber IS COMPONENT f_suber ——调用一位全减器声明语句 PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END COMPONENT ; SIGNAL S1,C1,S2: STD_LOGIC; BEGIN U1: f_suber PORT MAP ( ain=>A(0),bin=>B(0),cin=>C0,cout=>C1,sum=>S1 ); U2: f_suber PORT MAP ( ain=>A(1),bin=>B(1),cin=>C1,cout=>C,sum=>S2 ); S<=S2&S1; END ARCHITECTURE one ;
基于vhdl通用计算器源程序设计说明书
源程序4位二进制并行进位加法器的源程序ADDER4B.VHD 如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER4B IS --四位二进制并行加法器PORT(ci:IN STD_LOGIC; --低位进位a:IN STD_LOGIC_VECTOR3 DOWNTO 0); --4位加数b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位被加数s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位和co:OUT STD_LOGIC --进位输出);END ADDER4B;ARCHITECTURE behave OF ADDER4B ISSIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); --部定义的一个数据SIGNAL aa,bb:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINaa<=’0’&a; --将4位加数矢量扩为5位,为进位提供空间bb<=’0’&b; --将4位被加数矢量扩为5位,为进位提供空间INT<=aa+bb+ci; -- 相加s<=SINT(3 DOWNTO 0);co<=SINT(4); --最高位为输出进位END behave;顶层模块:8位二进制并行进位加法器的部分程序ADDER8B.VHD如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8B ISPORT(ci:IN STD_LOGIC;a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);co:OUT STD_LOGIC);END ADDER8B;ARCHITECTURE a OF ADDER8B ISComponent adder4B --引用4位二进制并行进位加法器PORT(ci:IN STD_LOGIC;a:IN STD_LOGIC_VECTOR3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);co:OUT STD_LOGIC);END COMPONENT;SIGNAL CARRY_OUT:STD_LOGIC; --4位加法器的进位标志BEGINU1:ADDER4B --安装一个4位二进制加法器U1PORT MAP(ci=>ci,a=>a(3 DOWNTO 0),b=>b(3 DWONTO 0),s=>(3 DOWNTO0),co=>CARRY_OUT);U2:ADDER4B --安装一个4位二进制加法器U2PORT MAP(ci=>CARRY_OUT,a=>a(7 DOWNTO 4),b=>b(7 DWONTO 4),s=>(7 DOWNTO 4),co=>co);END behave;加法器VHDL程序如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY adder ISport(a:in std_logic; --被加数ab:in std_logic; --加数bci:in std_logic; --输入进位s:out std_logic; --结果输出co:out std_logic --输出进位);end adder;architecture behave of adder issignal tem: std_logic; --暂存signal stem: std_logic;begintem<=a xor b; --中间变量stem<=tem xor ci; --结果co<=(tem and ci) or (a and b); --进位输出s<=stem; --输出end behave;4位二进制并行进位减法器的源程序suber.VHD如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sub4 ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位被减数b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位减数ci:IN STD_LOGIC; --输入进位s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --结果输出co:OUT STD_LOGIC --输出进位);end suber;architecture behave of suber iscomponent adder is --引用加法器的模块port(a:in std_logic;b:in std_logic;ci:in std_logic;s:out std_logic;co:out std_logic);end component;signal btem:std_logic_vector(3 downto 0); --减数寄存signal ctem:std_logic_vector(4 downto 0); -- 进位寄存signal stem:std_logic_vector(3 downto 0); -- 结果寄存beginbtem(3 downto 0)<=not b(3 downto 0); --先把减数求反ctem(0)<=not ci; --输入的进位也求反,从而对减数求补码g1:for I in 0 to 3 generate --连用4位全加器add:adder port map (a(i),btem(i),ctem(i),stem(i),ctem(i+1));end generate;s(3 downto 0)<=stem(3 downto 0); --结果输出co<=not ctem(4); --求反输出进位end behave;乘法器的源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;Entity mul isPort(a:in std_logic_vector(3 downto 0); --4位被乘数b:in std_logic_vector(3 downto 0); --4位乘数y:out std_logic_vector(7 downto 0) --乘积);end mul;architecture arch of mul isbeginy(7 downto 0)<=a(3 downto 0)*b(3 downto 0);end arch;除法器的源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity diver isPORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8位被除数输入b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位除数输入clk:IN STD_LOGIC; --时钟str:IN STD_LOGIC; --启动信号s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位商输出y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --4位余数输出);End;Architecture behave of diver isComponent suber is --引用减法器PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ci:IN STD_LOGIC;s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);co:OUT STD_LOGIC);End component;type state_type is(start,one,two,three,eror); --状态定义signal state:state_type; --定义状态变量signal ain: std_logic_vector(7 downto 0); --被除数寄存signal bin: std_logic_vector(3 downto 0); --除数寄存signal atem: std_logic_vector(3 downto 0); --减法器被减数输入signal btem: std_logic_vector(3 downto 0); --减法器减数输入signal stem: std_logic_vector(3 downto 0); --结果寄存signal citem: std_logic; --减法器借位输入signal cotem:std_logic; --减法器借位输出beginp2:process(clk)variable n: integer range 0 to 3; --移位次数计数值beginif clk’event and clk=’1’ thencase state iswhen atart=> --开始状态if str=’1’ then --收到启动信号state<=one; --转到状态oneatem(3 downto 0)<=a(7 downto 4); --把高4位放到减法器被减数端btem(3 downto 0)<=b(3 downto 0); --把除数放到减法器减数端ain(7 downto 0)<=a(7 downto 0); --寄存被除数bin(3 downto 0)<=b(3 downto 0); --寄存除数end if;when one=> --第一次移位if cotem=’0’ then --被除数高4位小于除数,溢出!state<=eror; --转到出错状态else --不溢出ain(3 downto 1)<=ain(2 downto 0); --被除数做移位ain(0)<=not cotem; --在最低位接收该位商值atem(3 downto 0)<=ain(6 downto 3); --把除数寄存器高4位输到减法器,作为减法器被减数state<=two; --转到下一状态end if;when two=> --再做3此移位if n=2 then --第四次移位state<=three; --是,则跳转到下一状态n:=0; --移位计数器清零else --否则state<=two; --还回到这个状态n:=n+1; --移位计数器加1end if;if cotem=’0’ then --不够减,有借位atem(3 downto 1)<=stem(2 downto 0); --减法器结果移位作为下一次的输入else --够减,没有借位atem(3 downto 1)<=atem(2 downto 0); --结果输出移位作为下一次的输入end if;ain(3 downto 1)<=ain(2 downto 0); --结果寄存器左移一位ain(0)<=not cotem; --这次运算借位输出,输入到寄存器ain最后一位atem(0)<=ain(3); --寄存器ain的最高位作为减法器输入被减数的低位when three=> --正常运算结果输出s(3 downto 1)<=ain(2 downto 0); --寄存器ain低3位作为输出结果高3位s(0)<=not cotem; --最后一次减法运算的借位输出求反作为结果输出最低位if cotem=’0’ then --最后一次减法运算,够减(无借位)y(3 downto 0)<=atem(3 downto 0); --则减法器输出结果为整个除法的余数else --否则,不够减y(3 downto 0)<=atem(3 downto 0); --则最后一次减法运算的被减数为整个除法的余数end if;atem(3 downto 0)<= "0"; --寄存器清零btem(3 downto 0)<= "0"; --寄存器清零state<=start; --回到开始状态when eror=> --溢出状态state<=start; --回到开始状态atem(3 downto 0)<= "0"; --寄存器清零btem(3 downto 0)<= "0"; --寄存器清零end case;end if;end process p2;citem<=’0’; --4位减法器借位输入接地U1:suber port map(atem,btem,citem,stem,cotem);end behave;数字按键译码电路VHDL语言描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity numdecoder isport(reset:in std_logic;inclk:std_logic;innum:std_logic_vetctor(9 downto 0);outnum:buffer std_logic_vector(3 woento 0);outflag:out std_logic);end;architecture behave of numdecoer is]beginif reser=’1’thenoutnum<=”0000”;elsif inclk’event and inclk=’1’thencase innum iswhen”0000000001”=>outnum<=”0000”;outflag<=’1’; --按下第一个键表示输入0when”0000000010”=>outnum<=”0001”;outflag<=’1’; --按下第二个键表示输入1when”0000000100”=>outnum<=”0010”;outflag<=’1’; --按下第三个键表示输入2when”0000001000”=>outnum<=”0011”;outflag<=’1’; --按下第四个键表示输入3when”0000010000”=>outnum<=”0100”;outflag<=’1’; --按下第五个键表示输入4when”0000100000”=>outnum<=”0101”;outflag<=’1’; --按下第六个键表示输入5when”0001000000”=>outnum<=”0110”;outflag<=’1’; --按下第七个键表示输入6when”0010000000”=>outnum<=”0111”;outflag<=’1’; --按下第八个键表示输入7when”010*******”=>outnum<=”1000”;outflag<=’1’; --按下第九个键表示输入8when”1000000000”=>outnum<=”1001”;outflag<=’1’; --按下第十个键表示输入9when others=>outnum<=outnum;outflag<=’0’; --不按键时保持end case;end if;end process;end behave;7段译码器的vhdl语言描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity vdecode isport(indata:in std_logic_vector(3 downto 0);outdata:out std_logic_vector(0 to 6));End;Atchitecture behave of vdecode isBeginWith indata selectOutdata<=”1111110”when”0000”,”0110000”when”0000”,”1111001”when”0000”,”0110011”when”0000”,”1011011”when”0000”,”1011111”when”0000”,”1110000”when”0000”,”1111111”when”0000”,”1111110”when”0000”,”1111110”when”0000”,”1111011”when”0000”,”0000000”when others;End behave;8位二进制数转换成个位、十位、百位的进程:Ctrview:process(c,clk)BeginIf c=’1’thenview1<=”0000”;view2<=”0000”;view<=”0000”;viewstep<=takenum;elsif clk’event and clk=’1’thencase virestep iswhen takenum=>ktemp<=keep;viewstep<=hundred=>if ktemp>=”11001000”thenview1<=”0010”;ktemp<=ktemp-“11001000;elsif ktemp>=”01100100”thenview1<=”0001”;ktemp<=ktemp-“01100100”;elsif view1<=”0000”;end if;viewstep<=ten;when ten=>if ktemp>=”01011010”thenview2<=”1001”;ktemp<=ktemp-“01011010”;elsif ktemp>=”01010000”thenview2<=”1000”;ktemp<=ktemp-“01010000”; elsif ktemp>=”01000110”thenview2<=”0111”;ktemp<=ktemp-“01000110”; elsif ktemp>=”00111100”thenview2<=”0110”;ktemp<=ktemp-“00111100”; elsif ktemp>=”00110010”thenview2<=”0101”;ktemp<=ktemp-“00110010”; elsif ktemp>=”00101000”thenview2<=”0100”;ktemp<=ktemp-“00101000”; elsif ktemp>=”00011110”thenview2<=”0011”;ktemp<=ktemp-“00011110”; elsif ktemp>=”00010100”thenview2<=”0010”;ktemp<=ktemp-“00010100”; elsif ktemp>=”00001010”thenview2<=”0001”;ktemp<=ktemp-“00001010”; elsif view2<=”0000”;end if;viewstep<=onewhen one=>view3<=ktemp(3 downto 0);viewstep<=takenum;when others=>NULL;end case;end if;end process ctrview;计算器的VHDL语言LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;Entity cal isPort(inclk:in std_logic;num:in std_logic_vector(9 downto 0);plus: in std_logic;subt: in std_logic;mult: in std_logic;mdiv: in std_logic;equal: in std_logic;c: in std_logic;onum1,onum2,onum3:out std_logic_vector(0 to0));end cal;architecture behave of cal istype state is(takenum,hundred,ten,one);signal viewstep: state;signal ktemp: std_logic_vector(7 downto 0);signal flag: std_logic;signal fl: std_logic;signal acc: std_logic_vector(7 downto 0);signalreg: std_logic_vector(7 downto 0);signal keep: std_logic_vector(7 downto 0);signal ans:std_logic_vector(7 downto 0);signal dans: std_logic_vector(3 downto 0);signal numbuff: std_logic_vector(3 downto 0);signal vf: std_logic;signal strdiv: std_logic;signal numclk: std_logic;signal clear:std_logic;signal inplus: std_logic;signal insubt: std_logic;signal inmult: std_logic;signal inmdiv: std_logic;signal inequal: std_logic;signal view1,view2,view3:std_logic_vector(3 downto 0); signal cou: std_logic_vector(1 downto 0);signal clk_gg: std_logic_vector(11 downto 0);signal clk: std_logic;signal clk: std_logic;component numbercoder isport(reset: in std_logic;inclk: in std_logic;innum: in std_logic_vector(9 downto 0);outnum: buffer std_logic_vector(3 downto 0); outflag: out std_logic);end component;component vdecode isport(indata: in std_logic_vector(3 downto 0); outdata: out srd_logic_vector(0 to 6));end component;component diver isport(a: in std_logic_vector(7 downto 0);b: in std_logic_vector(3 downto 0);clk: in std_logic;str: in std_logic;s: in std_logic_vector(3 downto 0);y: in std_logic_vector(3 downto 0););end component;begininum1: numdecoder port map (c,clk,num,numbuff,numclk); clock: process(inclk,c)beginif c=’1’ thenclk_gg(11 downto 0)<=”0”;elsif inclk’event and inclk=’1’ thenclk_gg(11 downto 0)<=clk_gg(11 downto 0)+1;end if;end process clock;clk<=clk_gg(11);pacecal: process(c,clk)beginif c=’1’theninplus<=’0’;insubt<=’0’;inmult<=’0’;inmdiv<=’0’;elsif clk’event and clk=’1’thenif plus=’1’ theninplus<=’1’;insubt<=’0’;inmult<=’0’; inmdiv<=’0’;elsif subt=’1’ theninplus<=’0’;insubt<=’1’;inmult<=’0’; inmdiv<=’0’;elsif mult=’1’ theninplus<=’0’;insubt<=’0’;inmult<=’1’; inmdiv<=’0’;elsif mdiv=’1’ theninplus<=’0’;insubt<=’0’;inmult<=’0’; inmdiv<=’1’;end if;end if;end process pacecal;ctrflag: process(c,clk)beginif c=’1’ thenflag<=’0’;elsif clk’event and clk=’1’ thenif inplus=’1’ or insubt=’1’ or inmult==’1’ or inmdiv=’1’ then flag<=’1’;else flag<=’0’;end if;ctrfirstnum: process(c,clk)beginif c=’1’ thenacc<=”00000000”;elsif numclk’event and numclk=’0’ thenif flag=’0’ thenacc<=acc*”1010”+numbuff;end if;enf if;end process ctrfirstnum;ctrsecondnum: process(c,clk)beginif c=’1’ or clear=’1’ thenreg<=”00000000”;fl<=’0’elsif numclk’event and numclk=’0’ thenif flag=’1’ thenfl<=’1’;reg<=reg*”1010”+numbuff;end if;end if;end process ctrsecondnum;ctrclear: process(c,clk)beginif c=’1’ thenclear<=’0’;elsif clk’event and clk=’1’ thenif plus=’1’ or subt=’1’ thenclear<=’1’;else clear<=’0’;end if;end if;end process ctrclear;ctrinequal: process(c,clk)beginif c=’1’ theninequal<=’0’;elsif clk’event and clk=’1’ thenif plus=’1’ or subt=’1’ or mult=’1’ or mdiv=’1’ or equal=’1’ then inequal<=’1’;else inequal<=’0’;end if;end if;end process ctrinequal;ctrcou: process(c,inequal)beginif c=’1’ thencou<=”00”;elsif inequal’event and inequal=’1’ thenif cou=”10” thencou<=cou;else cou<=cou+1;end if;end if;end process ctrcou;ctrcal: process(c,inequal)beginif c=’1’ thenans<=”00000000”;strdiv<=’0’;elsif inequal’event and inequal=’1’ thenif flag=’1’ thenif inplus=’1’ thenif cou=”10” thenans<=ans+reg;else ans<=acc+reg;end if;elsif insubt=’1’ thenif cou=”10” thenans<=ans-reg;else ans<=acc-reg;end if;elsif inmult=’1’ thenif acc<=00001111” and reg<=”00001111” thenans<=acc(3 downto 0)*reg(3 downto 0);else ans<=”00000000”;end if;elsif inmdiv=’1’ thenstrdiv<=’1’;end if;else strdiv<=’0’;end if;end if;end process ctrcal;d1: div port map (acc,reg(3 downto 0),clk,strdiv,dans); ctrvf: process(c,equal)beginif c=’1’ thenvf<=’0’;elsif equal;event and equal=’1’ thenvf<=’1’;end if;end process ctrvf;ctrkeep: process(c,clk)beginif c=’1’ thenkeep<=”00000000”;elsif clk’event and clk=’0’ thenif flag=’0’ thenkeep<=acc;elsif flag=’1’ and fl=’1’ and vf=’0’ thenkeep<=reg;elsif flag=’1’ and fl=’0’ and vf=’0’ and cou=”10” then keep<=ans;elsif flag=’1’ and vf=’1’ thenif inmdiv=’0’ thenkeep<=ans;elsekeep(3 downto 0)<=dans;end if;end if;end if;end process ctrkeep;ctrview: process(c,clk)beginif c=’1’ thenview1<=”0000”;view2<=”0000”;view3<=”0000”; viewstep<=takenum;elsif clk’event and clk=’1’ thencase viewstep iswhen takenum =>ktemp<=keep;viewstep<=hundred;when hundred =>if ktemp>=”11001000” thenview1<=”0010”; ktemp<=ktemp-“11001000”;elsif ktemp>=”01100100” thenview1<=”0001”; ktemp<=ktemp-“01100100”;else view1<=”0000”;end if;viewstep<=ten;when ten =>if ktemp>=”01011010” thenview2<=”1001”; ktemp<=ktemp-“01011010”;elsif ktemp>=”01010000” thenview2<=”1000”; ktemp<=ktemp-“01010000”;elsif ktemp>=”01000110” thenview2<=”0111”; ktemp<=ktemp-“01000110”;elsif ktemp>=”00111100” thenview2<=”0110”; ktemp<=ktemp-“00111100”;elsif ktemp>=”00110010” thenview2<=”0101”; ktemp<=ktemp-“00110010”;elsif ktemp>=”00101000” thenview2<=”0100”; ktemp<=ktemp-“00101000”;elsif ktemp>=”00011110” thenview2<=”0011”; ktemp<=ktemp-“00011110”;elsif ktemp>=”00010100” thenview2<=”0010”; ktemp<=ktemp-“00010100”;elsif ktemp>=”00001010” thenview2<=”0001”; ktemp<=ktemp-“00001010”; else view2<=”0000”;end if;viewstep<=one;when one =>view3<=ktemp(3 downto 0);viewstep<=takenum;when others =>null;end case;end if;end process ctrview;v1: vdecode port map (view1,onum1);v2: vdecode port map (view2,onum2);v3: vdecode port map (view3,onum3);end c;大学本科生毕业设计(论文)撰写规范本科生毕业设计(论文)是学生在毕业前提交的一份具有一定研究价值和实用价值的学术资料。
基于VHDL语言的两位数简易记分板设计毕业设计
本科毕业设计题目:基于VHDL语言的两位数简易记分板设计学位论文原创性声明兹呈交的学位论文,是本人在指导老师指导下独立完成的研究成果。
本人在论文写作中参考的其他个人或集体的研究成果,均在文中以明确方式标明。
本人依法享有和承担由此论文而产生的权利和责任。
声明人(签名):年月日黄山学院本科毕业设计说明书正文目录摘要 (1)英文摘要 (2)1 引言 (2)1.1 研究背景 (2)1.2 选题的目的和意义 (3)2 系统方案的拟定 (3)2.1 EDA软件的选择 (3)2.2 硬件描述语言的选择 (4)2.3 记分板系统的设计 (4)3 软件设计 (5)3.1 偶数分频器模块的设计 (5)3.2 按键去抖模块的设计 (12)3.3 译码显示模块 (14)4 系统组态及调试 (16)4.1 系统组态 (16)4.2 顶层程序设计及调试 (17)结论 (21)参考文献 (22)致谢 (23)附录 (24)基于VHDL语言的两位数简易记分板设计机电工程学院自动化专业指导老师:摘要:目前市场上销售的记分器大都是依据单片机技术的制造的,它的主要器件是单片机,并且它的编码器及解码器是由单片机内部的软件生成的。
在实际应用中,由于种种未知的因素可能导致程序出现运行不稳定的现象,从而导致系统的可靠性随时受到严重的威胁。
而基于EDA技术设计的记分器,它的系统完全由FPGA构成,系统要求实现的功能全部由FPGA内部的硬件来提供,从而大大提高了系统工作的稳定性和可靠性。
FPGA的最重要的特色就是它具有现场可编程功能,所以如果需要对设计进行修改,不必重新设计系统,只需更改芯片内部的控制和接口电路,再利用EDA软件将更新后的设计程序下载到FPGA中即可,无需更改外部电路的设计。
本论文详细阐述了运用EDA技术结合FPGA芯片在MAX+Plus II开发环境下设计两位数简易记分板的方法。
记分板的功能有:加分、减分、清零以及鸣叫提示。
将设计好的程序下载到FPGA芯片中进行验证,完全符合本论文的设计要求。
EDA课程设计--2位十进制四则运算器电路
《电子设计自动化》课程设计题目:2位十进制四则运算器电路院(系)专业届别班级学号姓名任课老师摘要本次设计的目的是通过QuartusII软件实现输入两个2位十进制数(0~99),输出它们的四则运算(加减乘除)结果(发光二极管显示运算模式;调用LPM_MULT、LPM_CONSTANT及LPM_DIVIDE模块)。
实现的方法是利用四则运算的规律进行初步设计,然后进行调整和修改。
最终结果要求:随机的输入两个数,经过加法、减法、乘法和除法的运算,可以得到正确的运算结果。
主要分为4大部分:一、2位十进制数模块;二、加减乘除四则运算四个小模块;三、加减乘除四则运算的选择模块;四、处理输出结果的模块。
目录1 系统设计 (4)2 单元电路设计 (5)3 软件设计 (5)4 系统测试 (14)5 结论 (14)6 参考文献 (14)1、系统设计一、设计要求:输入两个2位十进制数(0~99),输出它们的四则运算(加减乘除)结果;发光二极管显示运算模式;可调用LPM_MULT及LPM_DIVIDE模块。
二、系统设计方案:(1)系统设计思路要完成2位十进制四则运算器电路,首先,需要生成2个两位的十进制数,其次,需要加减乘除四个运算,然后,四种运算的选择,最后,对输出结果的处理。
2个2位十进制模块:法一,用两个100进制计数器构成;法二,用4个10进制计数器构成。
因为add1模块(后面详细介绍)只有两个输入口,所以选择法一比较方便。
加减乘除四则运算:①加法:写一个加法程序,制成模块,再分别取出它的各位、十位、百位。
②减法:写一个减法程序,用调用LPM的方法制成一个模块,在分别取出它的各位、十位和符号位。
③乘法:直接调用内部LPM,制成乘法模块。
④除法:直接调用内部LPM,制成除法模块。
加减乘除运算的选择:写一个4路选择器,分别选择加减乘除。
对输出结果的处理:写一个程序,对应不同选择下的不同输出,注意位数(加法:输出在0~198之间,需3个LED灯来显示;减法:输出在0~99之间,需3个LED灯(其中一个符号位);乘法:输出在0~9801之间,需4个LED灯;除法:输出在0~99之间,需2个LED灯。
EDA技术实用教程--VHDL版本(第五版)潘松课后习题答案
《EDA技术实用教程(第五版)》习题1 习题1-1EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?P3~4EDA技术与ASIC设计和FPGA开发有什么关系?答:利用EDA技术进行电子系统设计的最后目标是完成专用集成电路ASIC的设计和实现;FPGA和CPLD是实现这一途径的主流器件。
FPGA和CPLD的应用是EDA技术有机融合软硬件电子设计技术、SoC(片上系统)和ASIC设计,以及对自动设计与自动实现最典型的诠释。
FPGA在ASIC设计中有什么用途?答:FPGA和CPLD通常也被称为可编程专用IC,或可编程ASIC。
FPGA实现ASIC设计的现场可编程器件。
1-2 与软件描述语言相比,VHDL有什么特点? P4~6答:编译器将软件程序翻译成基于某种特定CPU的机器代码,这种代码仅限于这种CPU 而不能移植,并且机器代码不代表硬件结构,更不能改变CPU的硬件结构,只能被动地为其特定的硬件电路结构所利用。
综合器将VHDL程序转化的目标是底层的电路结构网表文件,这种满足VHDL设计程序功能描述的电路结构,不依赖于任何特定硬件环境;具有相对独立性。
综合器在将VHDL(硬件描述语言)表达的电路功能转化成具体的电路结构网表过程中,具有明显的能动性和创造性,它不是机械的一一对应式的“翻译”,而是根据设计库、工艺库以及预先设置的各类约束条件,选择最优的方式完成电路结构的设计。
l-3什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?P6什么是综合? 答:在电子设计领域中综合的概念可以表示为:将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。
有哪些类型?答:(1)从自然语言转换到VHDL语言算法表示,即自然语言综合。
(2)从算法表示转换到寄存器传输级(RegisterTransport Level,RTL),即从行为域到结构域的综合,即行为综合。
实验一 一位二进制全减器的设计
实验一、一位二进制全减器的设计一、实验目的:(1)掌握Quartus II 的VHDL 文本设计的全过程;(2)熟练和掌握EDA设计流程;熟悉简单组合电路的设计,掌握系统仿真,学会分析硬件测试结果。
(3)学习PH-1V型实验装置上发光二极管和按键的使用方法。
二、实验内容与要求:(1)用文本方法实现半减器,再利用半减器完成全减器的设计,熟悉层次设计概念;(2)给出此项设计的仿真波形;(3)选择实验电路NO.1验证, 用发光管指示显示结果。
三、设计原理:全减器可以有2个半减器和1个或门组成。
(1)半减器真值表:Sub_out表示本位)四、实验程序:(1) 实验程序(程序来源:)(2)对全减器进行原理图编辑:五、实验步骤:1.建立工作库文件夹和编辑设计文件(1)在D盘下建立一个文件夹保存工程文件;(2)打开QuartusII,建立新的VHDL文件,再打开的页面下输入程序。
2.编译过程(1)输入完程序之后逐个编译(2)逐个编译无错之后进行全程编译3.系统仿真(1)建立新的波形激励文件(2)在波形编辑器窗口添加节点(3)通过Edit->End Time 来设定仿真结束时间(4)点击save保存(5)通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。
4.引脚锁定(1)通过Assignment->Assignment Editor->Pin查找到所有的引脚(2)选择各个输入输出信号来锁定到不同引脚,进行全编译。
5.编程下载(1)选择Tools->Programmer菜单,点击Hardware Setup窗口完成硬件设置(2)点击Start开始编程下载六、仿真波形分析:波形分析:用波形与真值表进行比较即可。
有波形可以看出,100对应11,是对的。
再看111对应11也与理论相符。
引脚的锁定:x锁定为引脚60,y锁定为引脚61,Sub_in锁定为引脚63,Sub_out锁定为引脚169,diffr锁定为引脚167。
组合逻辑课程设计位二进制全加器全减器原创样本
组合逻辑电路课程设计——4位二进制全加器/全减器作者:学号:课程设计题目规定:1)使用74LS283构成4位二进制全加/全减器。
2)阐述设计思路。
3)列出真值表。
4)画出设计逻辑图。
5)用VHDL对所画电路进行仿真。
目录摘要 (2)1总电路设计 (2)1.1硬件电路的设计 (2)1.2全加器(full-adder ) (3)1.2.1四位二级制加法器 (4)1.2.1.1串行进位加法器 (4)1.2.1.2超前进位加法器 (5)1.2.1.3超前位链结构加法器 (6)1.3全减器(full-substracter ) (6)1.4总电路设计 (7)2设计思路 (8)2.1全加器 (8)2.2全减器 (8)3真值表 (9)4逻辑图与仿真 (10)5软件程序的设计 (14)6结果分析与总结 (17)摘要加法器是数字系统中产生数和装置。
加数和被加数为输入,和数与进位为输出装置为半加器。
若加数、被加数与低位进位数为输入,而和数与进位为输出则为全加器。
例如:为了节约资源,减法器和硬件乘法器都可以用加法器来构成。
但宽位加法器设计是很耗资源,因而在实际设计和有关饿得设计与开发中需要注意资源运用率和进位速度两方面问题,多位加法器构成重要有两种:并行进位和串行进位。
并行进位加法器设有并行进位产生逻辑,运营速度比串行进位快;串行进位是将全加器采用并行级联或菊花链式级联构成多位加法器。
加法器也是惯用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用。
此外还可以用来表达各种数值,如:BCD、加三码,重要加法器是以二进制作运算。
本文将采用4位二进制并行加法器作为折中选取,所选加法器为74LS283,74LS283是4位二进制先行进位加法器,它只用了几级逻辑来形成和及进位输出,故由其构成4位二进制全加器;而四位全减器可以用加法器简朴改造而来,最后本文采用 VHDL对四位全加器/全减器进行仿真。
核心字74LS283全加器、四位二进制、迭代电路、并行进位、串行进位、VHDL1总电路设计1.1硬件电路设计该4位二进制全加器以74LS283为核心,74LS283芯片引脚图如下图,本文采用先行进位方式,极大地提高了电路运营速度,下面是对4位全加器电路设计详细分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
u2 : h_suber PORT MAP(a=>e, b=>cin, co=>f,so=>sum); u3 : or2a PORT MAP(a=>d, b=>f,c=>cout); END ARCHITECTURE fd1 ; ///////////////////////////////////////////////////////////////////////////////// LIBRARY IEEE; ——二位全减器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_2_suber IS PORT ( A,B: IN STD_LOGIC_VECTOR(1 DOWNTO 0); C0:IN STD_LOGIC; S: OUT STD_LOGIC_ VECTOR(1 DOWNTO 0); C:OUT STD_LOGIC ); END ENTITY f_2_suber; ARCHITECTURE one OF f_2_suber IS COMPONENT f_suber ——调用一位全减器声明语句 PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END COMPONENT ; SIGNAL S1,C1,S2: STD_LOGIC; BEGIN U1: f_suber PORT MAP ( ain=>A(0),bin=>B(0),cin=>C0,cout=>C1,sum=>S1 ); U2: f_suber PORT MAP ( ain=>A(1),bin=>B(1),cin=>C1,cout=>C,sum=>S2 ); S<=S2&S1; END ARCHITECTURE one ;
1 1 1 1
0 0 1 1 表4
0 1 0 1
1 0 0 1
0 0 0 1
二位全减器:
四、实验程序(程序来源:EDA 技术实验教程)
LIBRARY IEEE ; ——或门逻辑描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2a IS PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC ); END ENTITY or2a; ARCHITECTURE one OF or2a IS //可以试试不用或门定义试试 BEGIN c <= a OR b ; END ARCHITECTURE one; ////////////////////////////////////////////////////////////////// LIBRARY IEEE; ——半减器描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_suber IS PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_suber; ARCHITECTURE fh1 OF h_suber is BEGIN so <= a xor b ; co <= (not a )AND b ; END ARCHITECTURE fh1; //////////////////////////////////////////////////////////////////// LIBRARY IEEE; ——1 位二进制全减器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_suber IS PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END ENTITY f_suber; ARCHITECTURE fd1 OF f_suber IS COMPONENT h_suber ——调用半减器声明语句 PORT ( a,b : IN STD_LOGIC; co,so : OUT STD_LOGIC); END COMPONENT ; COMPONENT or2a ——调用或门声明语句 PORT (a,b : IN STD_LOGIC; c : OUT STD_LOGIC); END COMPONENT; SIGNAL d,e,f : STD_LOGIC; ——定义 3 个信号作为内部的连接线 BEGIN u1 : h_suber PORT MAP(a=>ain,b=>bin, co=>d,so=>e); ——例化语句
1. 半减器原理
两个二进制数相减叫做半减,实现半减操作的电路称为半减器,表 2 为 半减器的真值表。A 为被减数,B 为减数,S 表示半减差,C 表示向高位 借位。 A B S C 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 从二进制数减法的角度看,真值表中只考虑了两个减数本身,没有考虑 低位来的借位,这就是半减器的由来。 S= A xor B C=(NOT A) and B
由 EDA 教程中全加器的顶层设计描述及半加器调用可类比Байду номын сангаас全减器的设计,可由先对半减 器进行描述,然后进行两次调用。半减器的工作时的逻辑表达式为:so=a XOR b ; co=(NOT a)AND b
1. 全减器原理 全减器能减数、被减数和低位来的借位信号相减,并根据求减结果给出该位 的借位信号。表 4 为全减器的真值表。Ai 表示被减数Bi 表示减数Ci −1 表示相 邻低位来的借位数,Si 表示本为和差,Ci 表示向相邻高位的借位数。 Ai Bi Ci −1 Si Ci 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1
全减器真值表
根据一位二进制全减器的工作原理, 可得其真值表为 (如下: cin 表示低位向本位借位。 cout 表示本位向高位借位) ain 0 0 0 0 1 1 1 1 bin 0 0 1 1 0 0 1 1 cin 0 1 0 1 0 1 0 1 cout 0 1 1 1 0 0 0 1 sum 0 1 1 0 1 0 0 1