(12-13)1位二进制全加器的VHDL设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
【例】 LIBRARY IEEE; --半加器描述(1) 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 is BEGIN so <= NOT(a XOR (NOT b)) ; co <= a AND b ; END ARCHITECTURE fh1;
自然数:NATURE,包含0和所有正整数; 正整数:POSITIVE,不包含0; INTEGER,NATURE,POSITIVE都定义在VHDL标准程 序包STANDARD中,是默认打开的,所以不需要 进行库的声明语句。
▼ 计数器设计的另一种表述 Nhomakorabea4.4 计数器设计
【例】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY CNT4 IS PORT (CLK: IN STD_LOGIC ; Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ; END ;
【例】 。。。。。。。。。。。。。。。
ARCHITECTURE bhv OF CNT4 IS SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN --Q1为内部信号,无传输方向限制 PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= Q1 + 1 ; --右边两个不同数据类型的数相加
【例】
LIBRARY IEEE; --半加器描述(2) 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 is SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ; BEGIN abc <= a & b ; PROCESS(abc) BEGIN CASE abc IS WHEN "00" => so<='0'; co<='0' ; WHEN "01" => so<='1'; co<='0' ; WHEN "10" => so<='1'; co<='0' ; WHEN "11" => so<='0'; co<='1' ; WHEN OTHERS => NULL ; END CASE; END PROCESS; END ARCHITECTURE fh1 ;
1位二进制全加器的VHDL设计
2012-3-12
本节知识要点: 1、CASE语句 表示多分支情况的选择语句,各分支无优先级。 与IF语句的区别。 2、元件例化语句(有2个语句组成) 用于层次设计,即在当前设计中调用一个已经设计好 的功能模块 component 语句:将一个设计实体定义为一个元 件 port map 语句: 用于元件调用(端口映射)。
▼ 4位加法计数器
4.4 计数器设计
表面上BUFFER具有双向端口INOUT的功能,但实际上 其输入功能是不完整的,它只能将自己输出的信号再反馈 回来,并不含有IN的功能。 表式Q <= Q + 1的右项与左项并非处于相同的时刻内, 对于时序电路,除了传输延时外,前者的结果出现于当前 时钟周期;后者,即左项要获得当前的Q + 1,需等待下 一个时钟周期。
END IF; END PROCESS ; Q <= Q1 ; END bhv;
内部信号无传输方向限制; 重载:对操作符赋予(即加载)新的功能。 运算符重载:调用运算符重载函数后,不同类型 的数据可以进行运算并将结果转换到需要的类型 。使用语句 USE IEEE.STD_LOGIC_UNSIGNED.ALL 则自动引用重载函数。
移位寄存器的设计
并行置位 移位寄存器的描述 移位输出
4 计数器设计
【例】
ENTITY CNT4 IS PORT ( CLK : IN BIT ; Q: BUFFER INTEGER RANGE 15 DOWNTO 0); END ; ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q <= Q + 1 ; --两边的数据类型相同 END IF; END PROCESS ; END bhv;
4.4 计数器设计
▼ 整数类型 1 0 35 10E3 16#D9# 8#720# 2#11010010# 十进制整数 十进制整数 十进制整数 十进制整数,等于十进制整数1000 十六进制整数,等于十六进制整数D9H 八进制整数,等于八进制整数720 二进制整数,等于二进制整11010010B
例 Q : BUFFER NATURAL RANGE 15 DOWNTO 0;
▼ 计数器设计的另一种表述
4位加法计数器由两大部分组成:加法器和锁存器
4位加法计数器RTL电路(Synplify综合)
综合后的电路:加法器为组合电路,锁存器用于 锁存数据; 工作过程:加法器的输入信号为1和锁存器的输 出反馈信号,只要锁存器输出发生改变,则加法 器自动相加,经过一个延时将结果送到锁存器的 输入,但只有当时钟沿到来时,该输入才传送到 输出端。 综合成电路时的优化:锁存器由D触发器组成, 优化潜力小,只有组合电路优化潜力大。
在使用STD_LOGIC_VECTOR中,必须注明其数组 宽度,即位宽,如: B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --8位数 或 SIGNAL A :STD_LOGIC_VECTOR(1 TO 4) --4位数
3. 并置操作符
以下是一些并置操作示例: SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; ... a <= „1‟„0‟d(1)„1‟ ; -- 元素与元素并置,
BUFFER模式
当输出的量内部需要用时,必须定义为BUFFER类型。
计数器的电路结构
一个加法器 一个锁存器 Q<=Q+1对应的电路解释(工作过程)
变量
在进程语句PROCESS内部定义和使用
省略赋值符
(OTHERS => X)
十进制计数器的设计
使能型号和复位信号 内部变量的定义 进位信号
并置后的数组长度为4
... IF a d = "101011" THEN ... –- 在IF条件句中可以使用并置符
【例】 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 fu1;
【例】 ... --半加器描述(3) SIGNAL abc,cso : STD_LOGIC_VECTOR(1 DOWNTO 0 ); BEGIN abc <= a & b ; co <= cso(1) ; so <= cso(0) PROCESS(abc) BEGIN CASE abc IS WHEN "00" => cso<="00" ; WHEN "01" => cso<="01" ; WHEN "10" => cso<="01" ; WHEN "11" => cso<="10" ; END CASE; END PROCESS; END ARCHITECTURE fh1;
▼全加器描述和例化语句 元件例化语句由两部分组成,第一部分是将一个现成的 设计实体定义为一个元件,语句的功能是对待调用的元件 作出调用声明,它的最简表达式如下所示: COMPONENT 元件名 IS PORT (端口名表) ; END COMPONENT 文件名 ; 元件例化语句的第二部分则是此元件引脚与当前设计实体 (顶层文件)中的具体信号连接起来。语句的表达式如下: 例化名 : 元件名 PORT MAP( [端口名 =>] 连接端口名,...); 注意连接顺序:左边表示元件引脚名,右边表示与该引脚 相连的实际信号名。
;
【例】 --1位二进制全加器顶层设计描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_adder IS PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END ENTITY f_adder;
ARCHITECTURE fd1 OF f_adder IS COMPONENT h_adder 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; BEGIN u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>d, so=>e); u2 : h_adder PORT MAP(a=>e, b=>cin, co=>f, so=>sum); u3 : or2a PORT MAP(a=>d, b=>f, c=>cout); END ARCHITECTURE fd1;