第 5章
VHDL设计进阶
EDA技术 实用教程
KX
康芯科技
5.1 4位加法计数器的 VHDL描述
5.1.1 4位加法计数器
【 例 5-1】
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;
KX
康芯科技
5.1.2 整数、自然数和正整数数据类型整数常量的书写方式示例如下:
1 十进制整数
0 十进制整数
35 十进制整数
10E3 十进制整数
16#D9# 十六进制整数
8#720# 八进制整数
2#11010010# 二进制整数
5.1 4位加法计数器的 VHDL描述
KX
康芯科技
5.1.3 4位加法计数器的另一种表达方式
【 例 5-2】
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
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
Q1 <= Q1 + 1 ;
END IF;
Q <= Q1 ;
END PROCESS ;
END bhv;
KX
康芯科技
5.1.3 4位加法计数器的另一种表达方式
4位加法计数器由两大部分组成:
图 5-1 4位加法计数器 RTL电路
KX
康芯科技
5.1.3 4位加法计数器的另一种表达方式
5.1 4位加法计数器的 VHDL描述图 5-2 4位加法计数器工作时序
KX
康芯科技
5.1.3 4位加法计数器的另一种表达方式
5.1 4位加法计数器的 VHDL描述数据类型:
整数类型 INTEGER,自然数类型、正整数类型 POSITIVE。
BUFFER模式:
BUFFER表达特定端口的特定功能,并非是特定的端口结构。
重载函数:
程序包 STD_LOGIC_UNSIGNED含有加号 (+)和其他运算符的重载函数。
计数器结构:
加法计数由两部分组成:加 1组合电路和寄存器时序电路。
KX
康芯科技
1,变量
2,省略赋值操作符( OTHERS=>X)
为了简化表达才使用短语,(OTHERS=>X)”,这是一个省略赋值操作符,它可以在较多位的位矢量赋值中作省略化的赋值,如以下语句:
SIGNAL d1,STD_LOGIC_VECTOR(4 DOWNTO 0);
VARIABLE a1,STD_LOGIC_VECTOR(15 DOWNTO 0);
...
d1 <= (OTHERS=>'0'); a1,= (OTHERS=>'0') ;
5.2 不同工作方式的时序电路设计
5.2.1 相关语法
KX
康芯科技5.2.2 带有复位和时钟使能的 10进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT (CLK,RST,EN,IN STD_LOGIC;
CQ,OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT,OUT STD_LOGIC );
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLE CQI,STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI,= (OTHERS =>'0') ; --计数器复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF EN = '1' THEN --检测是否允许计数
IF CQI < "1001" THEN CQI,= CQI + 1; --允许计数
ELSE CQI,= (OTHERS =>'0');--大于 9,计数值清零
END IF;
END IF;
END IF;
IF CQI = "1001" THEN COUT <= '1'; --计数大于 9,输出进位信号
ELSE COUT <= '0';
END IF;
CQ <= CQI; --将计数值向端口输出
END PROCESS;
END behav;
【例 5-3】
KX
康芯科技
5.2 不同工作方式的时序电路设计
5.2.2 带有复位和时钟使能的 10进制 计数器图 5-3 例 5-3的 RTL电路
KX
康芯科技
5.2 不同工作方式的时序电路设计
5.2.2 带有复位和时钟使能的 10进制计数器图 5-4 例 5-3的工作时序
KX
康芯科技
5.2.3 带有并行置位的移位寄存器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SHFRT IS -- 8位右移寄存器
PORT ( CLK,LOAD,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
QB,OUT STD_LOGIC );
END SHFRT;
ARCHITECTURE behav OF SHFRT IS
BEGIN
PROCESS (CLK,LOAD)
VARIABLE REG8,STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF LOAD = '1' THEN -- 装载新数据
REG8,= DIN;
ELSE
REG8(6 DOWNTO 0),= REG8(7 DOWNTO 1);
END IF;
END IF;
QB <= REG8(0);
END PROCESS; -- 输出最低位
END behav;
【例 5-4】
KX
康芯科技
5.2 不同工作方式的时序电路设计
5.2.3 带有并行置位的移位寄存器图 5-5 例 5-4的工作时序
KX
康芯科技
5.3 数据对象 DATA OBJECTS
5.3.1 常数 (CONSTANT)
常数定义的一般表述如下:
CONSTANT 常数名:数据类型,= 表达式 ;
例如:
CONSTANT FBT,STD_LOGIC_VECTOR,= "010110" ; -- 标准位矢类型
CONSTANT DATAIN,INTEGER,= 15 ; -- 整数类型
KX
康芯科技
5.3 数据对象 DATA OBJECTS
5.3.2 变量 (VARIABLE)
定义变量的一般表述如下:
VARIABLE 变量名,数据类型,= 初始值 ;
例如:
VARIABLE a,INTEGER RANGE 0 TO 15 ;
VARIABLE d,STD_LOGIC ;
KX
康芯科技
5.3 数据对象 DATA OBJECTS
5.3.2 变量 (VARIABLE)
变量赋值语句左边的目标变量可以是单值变量,也可以是一个变量的集合,如位矢量类型的变量 。 如
VARIABLE x,y,INTEGER RANGE 15 DOWNTO 0 ;
VARIABLE a,b,STD_LOGIC_VECTOR(7 DOWNTO0) ;
x,= 11 ;
y,= 2 + x ; -- 运算表达式赋值,y也是实数变量
a,= b
a (0 TO 5),= b (2 TO 7) ;
KX
康芯科技
5.3 数据对象 DATA OBJECTS
5.3.3 信号 (SIGNAL)
SIGNAL 信号名,数据类型,= 初始值 ;
目标信号名 <= 表达式 ;
SIGNAL a,b,c,y,z,INTEGER ;
...
PROCESS (a,b,c)
BEGIN
y <= a + b ;
z <= c – a ;
y <= b ;
END PROCESS ;
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句信号 SIGNAL 变量 VARIABLE
基本用法 用于作为电路中的信号连线 用于作为进程中局部数据存储单元适用范围 在整个结构体内的任何地方都能适用 只能在所定义的进程中使用行为特性 在进程的最后才对信号赋值 立即赋值表 6-1 信号与变量赋值语句功能的比较
5.3 数据对象 DATA OBJECTS
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句
【 例 5-5】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF3 IS
PORT ( CLK,D1,IN STD_LOGIC ;
Q1,OUT STD_LOGIC);
END ;
ARCHITECTURE bhv OF DFF3 IS
BEGIN
PROCESS (CLK)
VARIABLE QQ,STD_LOGIC ;
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
QQ,= D1 ;
END IF;
Q1 <= QQ;
END PROCESS ;
END ;
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句
【 例 5-6】
.,,
ARCHITECTURE bhv OF DFF3 IS
SIGNAL QQ,STD_LOGIC ;
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK ='1' THEN
QQ <= D1 ;
END IF;
Q1 <= QQ;
END PROCESS ;
END ;
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句
【例 5-7】
SIGNAL in1,in2,e1,...,STD_LOGIC ;
..,
PROCESS( in1,in2,.,,)
VARIABLE c1,.,,,STD_LOGIC_VECTOR(3 DOWNTO 0) ;
BEGIN
IF in1 = '1' THEN,.,–- 第 1 行
e1 <= "1010" ; –- 第 2 行
...
IF in2 = '0' THEN,,,–- 第 15+n 行
...
c1,= "0011" ; –- 第 30+m 行
..,
END IF;
END PROCESS;
KX
康芯科技
【 例 5-8】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF3 IS
PORT ( CLK,D1,IN STD_LOGIC ;
Q1,OUT STD_LOGIC);
END ;
ARCHITECTURE bhv OF DFF3 IS
SIGNAL A,B,STD_LOGIC ;
BEGIN
PROCESS (CLK) BEGIN
IF CLK'EVENT AND CLK = '1' THEN
A <= D1; B <= A; Q1 <=B;
END IF;
END PROCESS ;
END ;
5.3.4 进程中的信号与变量赋值语句
KX
康芯科技
【 例 5-9】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF3 IS
PORT ( CLK,D1,IN STD_LOGIC ;
Q1,OUT STD_LOGIC);
END ;
ARCHITECTURE bhv OF DFF3 IS
BEGIN
PROCESS (CLK)
VARIABLE A,B,STD_LOGIC ;
BEGIN
IF CLK'EVENT AND CLK ='1' THEN
A:= D1; B,= A; Q1 <= B;
END IF;
END PROCESS ;
END ;
5.3.4 进程中的信号与变量赋值语句
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句
D Q
D Q D QD QD1 Q1
D1 Q1
C L K
C L K
图 5-6 例 5-8的 RTL电路 图 5-7 例 5-9的 RTL电路
5.3 数据对象 DATA OBJECTS
KX
康芯科技
【 例 5-10】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
PORT (i0,i1,i2,i3,a,b,IN STD_LOGIC;
q,OUT STD_LOGIC);
END mux4;
ARCHITECTURE body_mux4 OF mux4 IS
signal muxval,integer range 7 downto 0;
BEGIN
process(i0,i1,i2,i3,a,b)
begin
muxval <= 0;
if (a = '1') then muxval <= muxval + 1; end if;
if (b = '1') then muxval <= muxval + 2; end if;
case muxval is
when 0 => q <= i0;
when 1 => q <= i1;
when 2 => q <= i2;
when 3 => q <= i3;
when others => null;
end case;
end process;
END body_mux4;
KX
康芯科技
【 例 5-11】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
PORT (i0,i1,i2,i3,a,b,IN STD_LOGIC;
q,OUT STD_LOGIC);
END mux4;
ARCHITECTURE body_mux4 OF mux4 IS
BEGIN
process(i0,i1,i2,i3,a,b)
variable muxval,integer range 7 downto 0;
begin
muxval,= 0;
if (a = '1') then muxval,= muxval + 1; end if;
if (b = '1') then muxval,= muxval + 2; end if;
case muxval is
when 0 => q <= i0;
when 1 => q <= i1;
when 2 => q <= i2;
when 3 => q <= i3;
when others => null;
end case;
end process;
END body_mux4;
KX
康芯科技图 5-8 例 5-10的 RTL电路
KX
康芯科技图 5-9 例 5-11的 RTL电路
KX
康芯科技图 5-10 例 5-10中错误的工作时序图 5-11 例 5-11中正确的工作时序
KX
康芯科技
【 例 5-12】
Library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SHIFT IS
PORT (CLK,C0,IN STD_LOGIC; --时钟和进位输入
MD,IN STD_LOGIC_VECTOR(2 DOWNTO 0); --移位模式控制字
D,IN STD_LOGIC_VECTOR(7 DOWNTO 0); --待加载移位的数据
QB,OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --移位数据输出
CN,OUT STD_LOGIC); --进位输出
END ENTITY;
ARCHITECTURE BEHAV OF SHIFT IS
SIGNAL REG,STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL CY,STD_LOGIC ;
BEGIN
PROCESS (CLK,MD,C0)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
CASE MD IS
接下页
KX
康芯科技
【 WHEN "001" => REG(0) <= C0 ;
REG(7 DOWNTO 1) <= REG(6 DOWNTO 0); CY <= REG(7);--带进位循环左移
WHEN "010" => REG(0) <= REG(7);
REG(7 DOWNTO 1) <= REG(6 DOWNTO 0); --自循环左移
WHEN "011" => REG(7) <= REG(0);
REG(6 DOWNTO 0) <= REG(7 DOWNTO 1); --自循环右移
WHEN "100" => REG(7) <= C0 ;
REG(6 DOWNTO 0) <= REG(7 DOWNTO 1); CY <= REG(0); --带进位循环右移
WHEN "101" => REG(7 DOWNTO 0) <= D(7 DOWNTO 0); --加载待移数
WHEN OTHERS => REG <= REG ; CY <= CY ; --保持
END CASE;
END IF;
END PROCESS;
QB(7 DOWNTO 0) <= REG(7 DOWNTO 0); CN <= CY; --移位后输出
END BEHAV;
接上页
KX
康芯科技
5.3.4 进程中的信号与变量赋值语句
5.3 数据对象 DATA OBJECTS
图 5-12 例 5-12中带进位循环左移仿真波形( MD="001")
KX
康芯科技
5.4 双向电路和三态控制电路设计
5.4.1 三态门设计
【 例 5-13】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY tri_s IS
port ( enable,IN STD_LOGIC;
datain,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
dataout,OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END tri_s ;
ARCHITECTURE bhv OF tri_s IS
BEGIN
PROCESS(enable,datain)
BEGIN
IF enable = '1' THEN dataout <= datain ;
ELSE dataout <="ZZZZZZZZ" ;
END IF ;
END PROCESS;
END bhv;
图 5-13 8位 3态控制门电路
KX
康芯科技
5.4.2 双向端口设计
【 例 5-14】
library ieee;
use ieee.std_logic_1164.all;
entity tri_state is
port (control,in std_logic;
in1,in std_logic_vector(7 downto 0);
q,inout std_logic_vector(7 downto 0);
x,out std_logic_vector(7 downto 0));
end tri_state;
architecture body_tri of tri_state is
begin
process(control,q,in1)
begin
if (control = '0') then x <= q ;
else q <= in1; x<="ZZZZZZZZ" ;
end if;
end process;
end body_tri;
KX
康芯科技
5.4.2 双向端口设计图 5-14 例 5-14的仿真波形图图 5-16 例 5-14的综合结果
KX
康芯科技
5.4.2 双向端口设计
【 例 5-15】
(以上部分同上例 )
process(control,q,in1)
begin
if (control='0') then x <= q ; q <= "ZZZZZZZZ";
else q <= in1; x <="ZZZZZZZZ";
end if;
end process;
end body_tri;
5.4 双向电路和三态控制电路设计
KX
康芯科技
5.4.2 双向端口设计图 5-15 例 5-15的仿真波形图图 5-17 例 5-15的综合结果
KX
康芯科技
【 例 5-16】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY tristate2 IS
port ( input3,input2,input1,input0,
IN STD_LOGIC_VECTOR (7 DOWNTO 0);
enable,IN STD_LOGIC_VECTOR(1 DOWNTO 0);
output,OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END tristate2 ;
ARCHITECTURE multiple_drivers OF tristate2 IS
BEGIN
PROCESS(enable,input3,input2,input1,input0 )
BEGIN
IF enable = "00" THEN output <= input3 ;
ELSE output <=(OTHERS => 'Z');
END IF ;
IF enable = "01" THEN output <= input2 ;
ELSE output <=(OTHERS => 'Z');
END IF ;
IF enable = "10" THEN output <= input1 ;
ELSE output <=(OTHERS => 'Z');
END IF ;
IF enable = "11" THEN output <= input0 ;
ELSE output <=(OTHERS => 'Z');
END IF ;
END PROCESS;
END multiple_drivers;
5.4.3 三态总线电路设计
KX
康芯科技
【 例 5-17】 ( 注,MaxplusII不支持本例 )
library ieee;
use ieee.std_logic_1164.all;
entity tri2 is
port (ctl,in std_logic_vector(1 downto 0);
datain1,datain2,datain3,datain4,
in std_logic_vector(7 downto 0);
q,out std_logic_vector(7 downto 0) );
end tri2;
architecture body_tri of tri2 is
begin
q <= datain1 when ctl="00" else (others =>'Z') ;
q <= datain2 when ctl="01" else (others =>'Z') ;
q <= datain3 when ctl="10" else (others =>'Z') ;
q <= datain4 when ctl="11" else (others =>'Z') ;
end body_tri;
5.4.3 三态总线电路设计
KX
康芯科技
5.4 双向电路和三态控制电路设计
5.4.3 三态总线电路设计图 5-18 例 5-16错误的综合结果
KX
康芯科技
5.4 双向电路和三态控制电路设计
5.4.3 三态总线电路设计图 5-19 例 5-17正确的综合结果
KX
康芯科技
5.4 双向电路和三态控制电路设计
5.4.4 顺序条件语句 IF语句
(1) IF 条 件句 Then
顺 序 语 句
END IF ;
(2) IF 条件句 Then
顺序语句
ELSE
顺序语句
END IF ;
(3) IF 条件句 Then
IF 条件句 Then
...
END IF
END IF
(4) IF 条件句 Then
顺序语句
ELSIF 条件句 Then
顺序语句
...
ELSE
顺序语句
END IF
KX
康芯科技
【 例 5-18】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY control_stmts IS
PORT (a,b,c,IN BOOLEAN;
output,OUT BOOLEAN);
END control_stmts;
ARCHITECTURE example OF control_stmts IS
BEGIN
PROCESS (a,b,c)
VARIABLE n,BOOLEAN;
BEGIN
IF a THEN n,= b; ELSE n,= c;
END IF;
output <= n;
END PROCESS;
END example;
5.4.4 顺序条件语句 IF语句
KX
康芯科技
【 例 5-19】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY coder IS
PORT ( din,IN STD_LOGIC_VECTOR(0 TO 7);
output,OUT STD_LOGIC_VECTOR(0 TO 2) );
END coder;
ARCHITECTURE behav OF coder IS
SIGNAL SINT,STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS (din)
BEGIN
IF (din(7)='0') THEN output <= "000" ;
ELSIF (din(6)='0') THEN output <= "100" ;
ELSIF (din(5)='0') THEN output <= "010" ;
ELSIF (din(4)='0') THEN output <= "110" ;
ELSIF (din(3)='0') THEN output <= "001" ;
ELSIF (din(2)='0') THEN output <= "101" ;
ELSIF (din(1)='0') THEN output <= "011" ;
ELSE output <= "111" ;
END IF ;
END PROCESS ;
END behav;
5.4.4 顺序条件语句 IF语句
KX
康芯科技表 5-2 8线 -3线优先编码器真值表输 入 输 出
din0 din1 din2 din3 din4 din5 din6 din7 output0 output1 output2
x x x x x x x 0 0 0 0
x x x x x x 0 1 1 0 0
x x x x x 0 1 1 0 1 0
x x x x 0 1 1 1 1 1 0
x x x 0 1 1 1 1 0 0 1
x x 0 1 1 1 1 1 1 0 1
x 0 1 1 1 1 1 1 0 1 1
0 1 1 1 1 1 1 1 1 1 1
注:表中的,x”为任意,类似 VHDL中的,-,值 。
5.4.4 顺序条件语句 IF语句
KX
康芯科技
5.5 进程语句结构
5.5.1 进程语句格式
PROCESS语 句 结构 的一般表 达 格式如下
[进 程 标号,] PROCESS [ ( 敏感信 号参数 表 ) ] [IS]
[进 程 说 明部分 ]
BEGIN
顺 序描述 语 句
END PROCESS [进 程 标号 ];
KX
康芯科技
5.5.2 PROCESS组成
PROCESS语句结构进程说明 顺序描述语句 敏感信号参数表信号赋值语句变量赋值语句进程启动语句子程序调用语句顺序描述语句进程跳出语句
5.5 进程语句结构
KX
康芯科技
5.5 进程语句结构
5.5.1 进程语句格式
PROCESS语 句 结构 的一般表 达 格式如下
[进 程 标号,] PROCESS [ ( 敏感信 号参数 表 ) ] [IS]
[进 程 说 明部分 ]
BEGIN
顺 序描述 语 句
END PROCESS [进 程 标号 ];
KX
康芯科技
5.5.3 进程要点
1,PROCESS为一无限循环语句
2,PROCESS中的顺序语句具有明显的顺序 /并行运行双重性
PROCESS(abc)
BEGIN
CASE abc IS
WHEN "0000" => so<="010" ;
WHEN "0001" => so<="111" ;
WHEN "0010" => so<="101" ;
.,,
WHEN "1110" => so<="100" ;
WHEN "1111" => so<="000" ;
WHEN OTHERS => NULL ;
END CASE;
END PROCESS;
KX
康芯科技
5.5.3 进程要点
3,进程必须由敏感信号的变化来启动
4,进程语句本身是并行语句
5.5 进程语句结构
KX
康芯科技【 例 6-19】
ENTITY mul IS
PORT (a,b,c,selx,sely,IN BIT;
data_out,OUT BIT );
END mul;
ARCHITECTURE ex OF mul IS
SIGNAL temp,BIT;
BEGIN
p_a,PROCESS (a,b,selx)
BEGIN
IF (selx = '0') THEN temp <= a;
ELSE temp <= b;
END IF;
END PROCESS p_a;
p_b,PROCESS(temp,c,sely)
BEGIN
IF (sely = '0') THEN data_out <= temp;
ELSE data_out <= c;
END IF;
END PROCESS p_b;
END ex;
5,信号是多个进程间的通信线
KX
康芯科技
6,一个进程中只允许描述对应于一个时钟信号的同步时序逻辑图 5-20 例 5-20的综合结果
KX
康芯科技
5.6 仿真 延时
5.6.1 固有延时
z <= x XOR y AFTER 5ns ; z <= x XOR y ;
5.6.2 传输延时
z <= TRANSPORT x AFTER 10 ns;
5.6.3 仿真?
x <= 9 ;
y <= x ;
z <= x AFTER 5ns ;
KX
康芯科技习 题
5-1 什么是固有延时? 什么是惯性延时?
5-2? 是什么? 在 VHDL中,?有什么用处?
5-3 哪些情况下需要用到程序包 STD_LOGIC_UNSIGNED? 试举一例 。
5-4 说明信号和变量的功能特点,应用上的异同点 。
5-5 在 VHDL设计中,给时序电路清 0(复位 )有两种方法,它们是什么?
5-6 在描述时序电路的进程中,哪一种复位方法必须将复位信号放在敏感信号表中? 给出这两种电路的 VHDL描述 。
5-7 什么是重载函数?重载算符有何用处?如何调用重载算符函数?
KX
康芯科技习 题
5-8 判断下面 3个程序中是否有错误,若有则指出错误所在,并给出完整程序 。
程序 1:
Signal A,EN,std_logic;
Process (A,EN)
Variable B,std_logic;
Begin
if EN = 1 then B <= A;
end if;
end process;
KX
康芯科技习 题程序 2:
Architecture one of sample is
variable a,b,c,integer;
begin
c <= a + b;
end;
程序 3:
library ieee;
use ieee.std_logic_1164.all;
entity mux21 is
port ( a,b,in std_logic; sel,in std_logic; c,
out std_logic;);
end sam2;
architecture one of mux21 is
begin
if sel = '0' then c,= a; else c,= b;
end if;
end two;
KX
康芯科技习 题
5-9 设计含有异步清零和计数使能的 16位二进制减法计数器 。
5-10 根据例 5-4设计 8位左移移位寄存器,给出时序仿真波形 。
5-11 将例 5-16中的 4个 IF语句分别用 4个并列进程语句表达出来 。
KX
康芯科技实 验 与 设 计
5-1 设计含异步清 0和同步时钟使能的加法计数器
(1) 实验目的,学习计数器的设计,仿真和硬件测试,进一步熟悉 VHDL设计技术 。
(2) 实验原理,实验程序为例 5-3,实验原理参考 5.2.2节 。
(3) 实验内容 1,按照第 4章第 4节的步骤,在 MAX+plusII上对例 5-3进行编辑,编译,综合,
适配,仿真 。 说明例中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形 。
(4) 实验内容 2,引脚锁定以及硬件下载测试 。 建议选择电路模式 5( 参考附录 2),用键
8(PIO7)控制 RST,键 7(PIO6)控制 EN,计数溢出 COUT接发光管 D8(PIO15); CQ是计数输出,接数码 1(PIO19-PIO16,低位靠右 );时钟 CLK接 clock2,通过跳线选择 4Hz信号 。
引脚锁定后进行编译,下载和硬件测试实验 。 将实验过程和实验结果写进实验报告 。
(5) 思考题 1,在例 5-3中是否可以不定义信号 CQI,而直接用输出端口信号完成加法运算,
即:
CQ <= CQ + 1? 为什么?
(6) 实验报告,将实验原理,设计过程,编译仿真波形和分析结果,硬件测试实验结果写进实验报告 。
KX
康芯科技实 验 与 设 计
5-2 7段数码显示译码器设计
(1) 实验目的,学习 7段数码显示译码器设计;学习 VHDL的 CASE语句应用及多层次设计方法 。
(2) 实验原理,7段数码是纯组合电路,通常的小规模专用 IC,如 74或 4000系列的器件只能作十进制 BCD码译码,然而数字系统中的数据处理和运算都是 2进制的,所以输出表达都是 16进制的,为了满足 16进制数的译码显示,最方便的方法就是利用译码程序在
FPGA/CPLD中来实现 。 例 5-21作为 7段译码器,输出信号 LED7S的 7位分别接如图 5-21数码管的 7个段,高位在左,低位在右 。 例如当 LED7S输出为,1101101” 时,数码管的 7个段,g,f,e,d,c,b,a分别接 1,1,0,1,1,0,1;接有高电平的段发亮,于是数码管显示,5” 。 注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段 h,
例 5-21中的 LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)应改为,.,(7 DOWNTO
0) 。
(3) 实验内容 1,说明例 5-21中各语句的含义,以及该例的整体功能 。 在 MAX+plusII上对该例进行编辑,编译,综合,适配,仿真,给出其所有信号的时序仿真波形 。
提示:用输入总线的方式给出输入信号仿真数据,仿真波形示例图如图 5-22所示 。
KX
康芯科技实 验 与 设 计
【 例 5-21】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DECL7S IS
PORT ( A,IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED7S,OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ;
END ;
ARCHITECTURE one OF DECL7S IS
BEGIN
PROCESS( A )
BEGIN
CASE A IS
WHEN "0000" => LED7S <= "0111111" ;
WHEN "0001" => LED7S <= "0000110" ;
KX
康芯科技实 验 与 设 计
WHEN "0010" => LED7S <= "1011011" ;
WHEN "0011" => LED7S <= "1001111" ;
WHEN "0100" => LED7S <= "1100110" ;
WHEN "0101" => LED7S <= "1101101" ;
WHEN "0110" => LED7S <= "1111101" ;
WHEN "0111" => LED7S <= "0000111" ;
WHEN "1000" => LED7S <= "1111111" ;
WHEN "1001" => LED7S <= "1101111" ;
WHEN "1010" => LED7S <= "1110111" ;
WHEN "1011" => LED7S <= "1111100" ;
WHEN "1100" => LED7S <= "0111001" ;
WHEN "1101" => LED7S <= "1011110" ;
WHEN "1110" => LED7S <= "1111001" ;
WHEN "1111" => LED7S <= "1110001" ;
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS ;
END ;
图 5-21 共阴数码管及其电路
KX
康芯科技实 验 与 设 计
(4) 实验内容 2,引脚锁定及硬件测试 。 建议选实验电路模式 6( 参考附录 2,图 F-18),用数码 8显示译码输出 (PIO46-PIO40),键 8,键 7,键 6
和键 5四位控制输入,硬件验证译码器的工作性能 。
(5) 附加实验内容,用例化语句按图 5-23的方式,以例 5-3( 将其改为
16进制计数器 ) 和例 5-21为底层元件,完成顶层文件设计,并重复以上实验过程 。 注意图 5-23中的 tmp是 4位总线,led是 7位总线 。 对于引脚锁定和实验,建议选电路模式 6,用数码 8显示译码输出,用键 3作为时钟输入 (每按 2次键为 1个时钟脉冲 ),或直接接时钟信号 clock0。
(6) 实验报告,根据以上的实验内容写出实验报告,包括程序设计,软件编译,仿真分析,硬件测试和实验过程;设计程序,程序分析报告,
仿真波形图及其分析报告 。
KX
康芯科技实 验 与 设 计图 5-22 7段译码器仿真波形图 5-23 计数器和译码器连接电路的顶层文件原理图
KX
康芯科技实 验 与 设 计
5-3 8位数码扫描显示电路设计
(1) 实验目的,学习扫描显示电路的设计 。
(2) 实验原理,图 5-24所示的是 8位数码扫描显示电路,其中每个数码管的 8个段,h,g,f,e,d,c,b,a( h是小数点 ) 都连在一起,8个数码管分别由 8个选通信号 k1,k2,… k8来选择 。 被选通的数码管显示数据 。 例如,在某一时刻,k3为高电平,其余选通信号为低电平,这时仅
k3对应的数码管显示来自段信号端的数据,而其它 7个数码管呈现关闭状态 。 根据这种电路状况,如果希望在 8个数码管显示希望的数据,就必须使得 8个选通信号 k1,k2,… k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的 。
KX
康芯科技实 验 与 设 计图 5-24 8位数码扫描显示电路例 5-22是扫描显示的示例程序,其中 clk是扫描时钟; SG为 7段控制信号,由高位之低位分别接 g,f,e,d,c,b,a 7个段; BT是位选控制信号
,接图 5-24中的 8个选通信号,k1,k2,…k8 。 程序中 CNT8是一个 3位计数器,作扫描计数信号,由进程 P2生成;进程 P3是 7段译码查表输出程序,
与例 5-21相同;进程 P1是对 8个数码管选通扫描程序,例如当 CNT8等于
"001" 时,K2对应的数码管被选通,同时,A被赋值 3,再由进程 P3译码输出 "1001111",显示在数码管上即为,3” ;当 CNT8扫变时,将能在 8个数码管上显示数据,13579BDF 。
KX
康芯科技实 验 与 设 计
【 例 5-22】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SCAN_LED IS
PORT ( CLK,IN STD_LOGIC;
SG,OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --段控制信号输出
BT,OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );--位控制信号输出
END;
ARCHITECTURE one OF SCAN_LED IS
SIGNAL CNT8,STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL A,INTEGER RANGE 0 TO 15;
BEGIN
P1,PROCESS( CNT8 )
BEGIN
CASE CNT8 IS 接下页
KX
康芯科技实 验 与 设 计
WHEN "000" => BT <= "00000001" ; A <= 1 ;
WHEN "001" => BT <= "00000010" ; A <= 3 ;
WHEN "010" => BT <= "00000100" ; A <= 5 ;
WHEN "011" => BT <= "00001000" ; A <= 7 ;
WHEN "100" => BT <= "00010000" ; A <= 9 ;
WHEN "101" => BT <= "00100000" ; A <= 11 ;
WHEN "110" => BT <= "01000000" ; A <= 13 ;
WHEN "111" => BT <= "10000000" ; A <= 15 ;
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS P1;
P2,PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN CNT8 <= CNT8 + 1;
END IF;
END PROCESS P2 ;
P3,PROCESS( A ) –-译码电接下页
KX
康芯科技实 验 与 设 计BEGIN
CASE A IS
WHEN 0 => SG <= "0111111"; WHEN 1 => SG <= "0000110";
WHEN 2 => SG <= "1011011"; WHEN 3 => SG <= "1001111";
WHEN 4 => SG <= "1100110"; WHEN 5 => SG <= "1101101";
WHEN 6 => SG <= "1111101"; WHEN 7 => SG <= "0000111";
WHEN 8 => SG <= "1111111"; WHEN 9 => SG <= "1101111";
WHEN 10 => SG <= "1110111"; WHEN 11 => SG <= "1111100";
WHEN 12 => SG <= "0111001"; WHEN 13 => SG <= "1011110";
WHEN 14 => SG <= "1111001"; WHEN 15 => SG <= "1110001";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS P3;
END;
KX
康芯科技实 验 与 设 计
(3) 实验内容 1,说明例 5-22中各语句的含义,以及该例的整体功能 。 对该例进行编辑,编译,综合,适配,仿真,给出仿真波形 。 实验方式:
若考虑小数点,SG的 8个段分别与 PIO49,PIO48,…,PIO42( 高位在左,如果是 1K30,引脚分别对应,89,90,91,92,95,96,97,98,
其中 P89对应小数点 ),BT的 8个位分别与 PIO34,PIO35,…,PIO41
( 高位在左,如果是 1K30,引脚分别对应,79,80,81,82,83,86、
87,88) ;电路模式不限,将 EDA系统左下方的拨码开关全部向上拨,
这时实验系统的 8个数码管构成图 5-24的电路结构,时钟 CLK可选择
clock0,通过跳线选择 16384Hz信号 。 引脚锁定后进行编译,下载和硬件测试实验 。 将实验过程和实验结果写进实验报告 。
(4) 实验内容 2,修改例 5-22的进程 P1中的显示数据直接给出的方式,增加 8个 4位锁存器,作为显示数据缓冲器,使得所有 8个显示数据都必须来自缓冲器 。 缓冲器中的数据可以通过不同方式锁入,如来自 A/D采样的数据,来自分时锁入的数据,来自串行方式输入的数据等 。
KX
康芯科技实 验 与 设 计
5-4 数控分频器的设计
(1) 实验目的,学习数控分频器的设计,分析和测试方法 。
(2) 实验原理,数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,例 6-22的数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可 。
(3) 实验内容 1,根据图 5-25的波形提示,分析例 5-23中的各语句功能,设计原理及逻辑功能,并详述进程 P_REG和 P_DIV的作用 。
(4) 实验内容 2,输入不同的 CLK频率和预置值 D,给出如图 5-25的时序波形 。
(5) 实验内容 3,在实验系统上硬件验证例 5-23的功能 。 如果目标器件是 EF1K30,
建议选实验电路模式 1( 参考附录 2,图 F-14),键 2/键 1(PIO7-PIO0)负责输入 8位预置数 D; CLK由 clock0输入,频率可选 65536Hz或更高 (确保分频后落在音频范围 );输出 FOUT接扬声器 (SPKER)。 编译下载后进行硬件测试:改变键 2/键 1的输入值,可听到不同音调的声音 。
KX
康芯科技实 验 与 设 计
(6) 实验附加内容,将例 5-23扩展成 16位分频器,并提出此项设计的数项实用示例,
如 PWM的设计等 。
(7) 思考题,怎样利用 2个例 5-23给出的模块设计一个电路,使其输出方波的正负脉宽的宽度分别由两个 8位输入数据控制?
(8) 实验报告,根据以上的要求,将实验项目分析设计,仿真和测试写入实验报告 。
图 5-25 当给出不同输入值 D时,FOUT输出不同频率 (CLK周期 =50ns)
KX
康芯科技实 验 与 设 计【 例 5-23】LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PULSE IS
PORT ( CLK,IN STD_LOGIC;
D,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT,OUT STD_LOGIC );
END;
ARCHITECTURE one OF PULSE IS
SIGNAL FULL,STD_LOGIC;
BEGIN
P_REG,PROCESS(CLK)
VARIABLE CNT8,STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF CNT8 = "11111111" THEN
KX
康芯科技实 验 与 设 计CNT8,= D; --当 CNT8计数计满时,输入数据 D被同步预置给计数器 CNT8FULL <= '1'; --同时使溢出标志信号 FULL输出为高电平
ELSE CNT8,= CNT8 + 1; --否则继续作加 1计数
FULL <= '0'; --且输出溢出标志信号 FULL为低电平
END IF;
END IF;
END PROCESS P_REG ;
P_DIV,PROCESS(FULL)
VARIABLE CNT2,STD_LOGIC;
BEGIN
IF FULL'EVENT AND FULL = '1' THEN
CNT2,= NOT CNT2; --如果溢出标志信号 FULL为高电平,D触发器输出取反
IF CNT2 = '1' THEN FOUT <= '1'; ELSE FOUT <= '0';
END IF;
END IF;
END PROCESS P_DIV ;
END;
KX
康芯科技实 验 与 设 计
5-5 8位 16进制频率计设计
(1) 实验目的,设计 8位 16进制频率计,学习较复杂的数字系统设计方法 。
(2) 实验原理,根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为 1秒的输入信号脉冲计数允许的信号; 1秒计数结束后,
计数值锁入锁存器的锁存信号并为下一测频计数周期作准备的计数器清 0
信号 。 这 3个信号可以由一个测频控制信号发生器产生,即图 5-26中的
TFCTRL。
设计要求是,TFCTRL的计数使能信号 CNT_EN能产生一个 1秒脉宽的周期信号,
并对频率计中的 32位二进制计数器 COUNTER32B( 图 5-27) 的 ENABL使能端进行同步控制 。 当 CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数 。 在停止计数期间,首先需要一个锁存信号 LOAD的上跳沿将计数器在前 1秒钟的计数值锁存进各锁存器 REG32B中,并由外部的 16进制 7段译码器译出,
显示计数值 。 设置锁存器的好处是数据显示稳定,不会由于周期性的清 0信号而不断闪烁 。 锁存信号后,必须有一清 0信号 RST_CNT对计数器进行清零,为下 1秒的计数操作作准备 。 其工作时序如图 5-26。
KX
康芯科技实 验 与 设 计
(3) 实验内容 1,分别仿真测试模块例 5-24,例 5-25和例 5-26,再结合例 5-
27完成频率计的完整设计和硬件实现,并给出其测频时序波形及其分析 。
如果目标器件是 EP1K30,建议选实验电路模式 5,8个数码管以 16进制形式显示测频输出;待测频率输入 FIN由 clock0输入,频率可选 4Hz,256HZ、
3Hz...50MHz等; 1HZ测频控制信号 CLK1HZ可由 clock2输入 (用跳线选
1Hz)。 注意,这时 8个数码管的测频显示值是 16进制的 。
(4) 实验内容 2,参考例 5-3,将频率计改为 8位 10进制频率计,注意此设计电路的计数器必须是 8个 4位的 10进制计数器,而不是 1个 。 此外注意在测频速度上给予优化 。
(5) 实验内容 3,参考第 8章,用 LPM模块取代例 5-25和例 5-26,再完成同样的设计任务 。
(6) 实验报告,给出频率计设计的完整实验报告 。
KX
康芯科技实 验 与 设 计图 5-26 频率计测频控制器 TFCTRL测控时序图
KX
康芯科技实 验 与 设 计图 5-27 频率计原理图
KX
康芯科技实 验 与 设 计图 5-27 频率计原理图
【例 5-24】
LIBRARY IEEE; --测频控制电路
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FTCTRL IS
PORT (CLKK,IN STD_LOGIC; -- 1Hz
CNT_EN,OUT STD_LOGIC; -- 计数器时钟使能
RST_CNT,OUT STD_LOGIC; -- 计数器清零
Load,OUT STD_LOGIC ); -- 输出锁存信号
END FTCTRL;
ARCHITECTURE behav OF FTCTRL IS
SIGNAL Div2CLK,STD_LOGIC;
BEGIN
PROCESS( CLKK )
BEGIN
KX
康芯科技
IF CLKK'EVENT AND CLKK = '1' THEN -- 1Hz时钟 2分频
Div2CLK <= NOT Div2CLK;
END IF;
END PROCESS;
PROCESS (CLKK,Div2CLK)
BEGIN
IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1';--产生计数器清零信号
ELSE RST_CNT <= '0'; END IF;
END PROCESS;
Load <= NOT Div2CLK; CNT_EN <= Div2CLK;
END behav;
KX
康芯科技实 验 与 设 计图 5-27 频率计原理图
【例 5-25】
LIBRARY IEEE; --32位锁存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT ( LK,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END REG32B;
ARCHITECTURE behav OF REG32B IS
BEGIN
PROCESS(LK,DIN)
BEGIN
IF LK'EVENT AND LK = '1' THEN DOUT <= DIN;
END IF;
END PROCESS;
END behav;
KX
康芯科技实 验 与 设 计图 5-27 频率计原理图
【例 5-26】
LIBRARY IEEE; --32位计数器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER32B IS
PORT (FIN,IN STD_LOGIC; -- 时钟信号
CLR,IN STD_LOGIC; -- 清零信号
ENABL,IN STD_LOGIC; -- 计数使能信号
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); -- 计数结果
END COUNTER32B;
ARCHITECTURE behav OF COUNTER32B IS
SIGNAL CQI,STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
PROCESS(FIN,CLR,ENABL)
BEGIN
IF CLR = '1' THEN CQI <= (OTHERS=>'0'); -- 清零
ELSIF FIN'EVENT AND FIN = '1' THEN
IF ENABL = '1' THEN CQI <= CQI + 1; END IF;
END IF;
END PROCESS;
DOUT <= CQI;
END behav;
KX
康芯科技实 验 与 设 计图 5-27 频率计原理图
【例 5-27】
LIBRARY IEEE; --频率计顶层文件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FREQTEST IS
PORT ( CLK1HZ,IN STD_LOGIC;
FSIN,IN STD_LOGIC;
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END FREQTEST;
ARCHITECTURE struc OF FREQTEST IS
COMPONENT FTCTRL
PORT (CLKK,IN STD_LOGIC; -- 1Hz
CNT_EN,OUT STD_LOGIC; -- 计数器时钟使能
RST_CNT,OUT STD_LOGIC; -- 计数器清零
Load,OUT STD_LOGIC ); -- 输出锁存信号
END COMPONENT;
COMPONENT COUNTER32B
PORT (FIN,IN STD_LOGIC; -- 时钟信号
CLR,IN STD_LOGIC; -- 清零信号
ENABL,IN STD_LOGIC; -- 计数使能信号
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); -- 计数结果
END COMPONENT;
KX
康芯科技实 验 与 设 计COMPONENT REG32BPORT ( LK,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END COMPONENT;
SIGNAL TSTEN1,STD_LOGIC;
SIGNAL CLR_CNT1,STD_LOGIC;
SIGNAL Load1,STD_LOGIC;
SIGNAL DTO1,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL CARRY_OUT1,STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
U1,FTCTRL PORT MAP(CLKK =>CLK1HZ,CNT_EN=>TSTEN1,
RST_CNT =>CLR_CNT1,Load =>Load1);
U2,REG32B PORT MAP( LK => Load1,DIN=>DTO1,DOUT => DOUT);
U3,COUNTER32B PORT MAP( FIN => FSIN,CLR => CLR_CNT1,
ENABL => TSTEN1,DOUT=>DTO1 );
END struc;
KX
康芯科技实 验 与 设 计
5-6 32位并进 /并出移位寄存器设计仅用例 5-12一个 8位移位寄存器,再增加一些电路,如 4个 8位锁存器等,设计成为一个能为 32位二进制数进行不同方式移位的移位寄存器,。这个电路模型十分容易用到 CPU的设计中。