第 5章 VHDL基本语句(二)
<EDA技术 与应用 > 课程讲义
合肥工业大学 彭良清
下一章上一章
上一章内容 回顾
1,先看一个 VHDL代码的例子
2,简单代码结构:端口定义和电路逻辑表达
3,代码文件命名
4,进程 (PROCESS)
5,VHDL代码中的,Port,Siganl,Variable
6,学会简单 VHDL设计的三板斧
7,VHDL与 C 代码中的函数 的区别?
8,操作符 & 数据类型 & 赋值语句
9,逻辑分支语句,IF; CASE,
10,循环语句 (LOOP)
本章内容
7,VHDL代码中的时序逻辑和组合逻辑表达
8,语句的执行时间问题
( 顺序语句 & 并行语句 )
9,基本单元电路的 VHDL代码
(三态门,双向缓冲器,计数器,D触发器,译码器 …… )
11,复杂代码结构
(子程序 ; 元件 ; 块 ; 包 )
12,属性定义语句
13,库的使用
VHDL代码中的
时序逻辑 和 组合逻辑表达
1,不完整的
条件语句 构成
时序电路
2,完整的
条件语句 构成
组合逻辑电路
? Q,何为
时序电路 和 组合逻辑电路?
不完整的 条件语句 的 VHDL
1,ENTITY COMP_BAD IS
2,PORT ( a1, IN BIT;
3,b1, IN BIT;
4,q1, OUT BIT
5,);
6,END ENTITY COMP_BAD;
7,ARCHITECTURE one OF COMP_BAD IS
8,BEGIN
9,PROCESS(a1,b1)
10,BEGIN
11,IF a1 > b1 THEN
12,q1 <= '1';
13,ELSIF a1 < b1 THEN
14,q1 <= '0';
15,END IF;
16,END PROCESS;
17,END ARCHITECTURE one;
请看图
不完整的 条件语句 的电路图
IF a1 > b1 THEN
q1 <= '1';
ELSIF a1 < b1 THEN
q1 <= '0';
END IF;
1,ENTITY COMP_GOOD IS
2,PORT ( a1, IN BIT;
3,b1, IN BIT;
4,q1, OUT BIT
5,);
6,END ENTITY COMP_GOOD;
7,ARCHITECTURE one OF COMP_GOOD IS
8,BEGIN
9,PROCESS(a1,b1)
10,BEGIN
11,IF a1 > b1 THEN -- comparing it with example 4_9,p82
12,q1 <= '1';
13,ELSE
14,q1 <= '0';
15,END IF;
16,END PROCESS;
17,END ARCHITECTURE one;
改进的 代码
请看
改进代码的电路图
请将 a1,b1的
数据位数 变成 8 位,
观察
RTL 图??
IF a1 > b1 THEN
q1 <= '1';
ELSE
q1 <= '0';
END IF;
时序逻辑之:信号边沿检测
1,信号边沿( 或者 )触发

时序逻辑
的 基本单元
2,那么,在 VHDL中
如何
检测信号的跳变?
VHDL代码中的
边沿信号检测( EVENT 语句)
1,上升沿检测
IF CLK'EVENT AND CLK = '1' THEN
Q <= D;
END IF;
2,下降沿检测
IF CLK'EVENT AND CLK = ‘0' THEN
Q <= D;
END IF;
3,更多的沿检测代码
更多的:
边沿 信号检测 的 VHDL代码 表达(一)
1,ENTITY DFF1 IS
2,PORT ( CLK, IN BIT;
3,D, IN BIT;
4,Q, OUT BIT
5,);
6,END ENTITY DFF1;
7,ARCHITECTURE bhv OF DFF1 IS
8,BEGIN
9,PROCESS(CLK)
10,BEGIN
11,IF CLK'EVENT AND (CLK='1') AND ( CLK'LAST_VALUE = '0') THEN
12,Q <= D;
13,END IF;
14,END PROCESS;
15,END ARCHITECTURE bhv;
详细参见:
p83_ex4_11
更多的:
边沿 信号检测 的 VHDL代码 表达(二)
1,ENTITY DFF1 IS
2,PORT ( CLK, IN BIT;
3,D, IN BIT;
4,Q, OUT BIT
5,);
6,END ENTITY DFF1;
7,ARCHITECTURE bhv OF DFF1 IS
8,BEGIN
9,PROCESS(CLK)
10,BEGIN
11,IF CLK = '1' AND CLK'LAST_VALUE = '0' THEN
12,-- comparing with example 11
13,Q <= D;
14,END IF;
15,END PROCESS;
16,END ARCHITECTURE bhv;
详细参见:
p83_ex4_12
更多的:
边沿 信号检测 的 VHDL代码 表达(三)
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY DFF13 IS
4,PORT ( CLK, IN STD_LOGIC;
5,D, IN STD_LOGIC;
6,Q, OUT STD_LOGIC
7,);
8,END ENTITY DFF13;
9,ARCHITECTURE bhv OF DFF13 IS
10,SIGNAL Q1:STD_LOGIC;
11,BEGIN
12,PROCESS(CLK)
13,BEGIN
14,IF rising_edge(CLK) THEN
15,-- comparing with example 4-11,4_12
16,-- "rising_edge" defined in STD_LOGIC_1164 libary
17,Q1 <= D;
18,END IF;
19,Q <= Q1;
20,END PROCESS;
21,END ARCHITECTURE bhv;
详细参见:
p83_ex4_13
他们有何不同?
萝卜白菜,各人所爱
都是
填胞肚子 ^_^
再看 3段 沿检测? 代码
1,PROCESS
2,BEGIN
3,wait until CLK = '1';
4,Q <= D;
5,END PROCESS;
1,PROCESS( CLK )
2,BEGIN
3,IF CLK = '1' THEN
4,Q <= D;
5,END IF;
6,END PROCESS;
1,PROCESS( CLK,D)
2,BEGIN
3,IF CLK = '1' THEN
4,Q <= D;
5,END IF;
6,END PROCESS;
详细参见:
p84_ex4_16
详细参见:
p84_ex4_15
详细参见:
p84_ex4_14
不 推 荐 使 用!!
VHDL语句的 执行时间顺序 问题
1,和 软件语言的 重要差异。
2,很 令人困惑 的 问题!!
3,眼见为实,先看 example:
执行时间:例子
1,PROCESS( A,B,C,D )
2,BEGIN
3,D <= A;
4,X <= B + D;
5,D <= C;
6,Y <= B + D;
7,END PROCESS
1,PROCESS(A,B,C)
2,VARIABLE D,
STD_LOGIC_VECTOR(3
DOWNTO 0);
3,BEGIN
4,D,= A ;
5,X <= B + D;
6,D,= C;
7,Y <= B + D;
8,END PROCESS
详细参见:
xd_p35_ex3_1A
详细参见:
xd_p35_ex3_1B
X=? (B+A)
Y=? (B+C)
X=? (B+C)
Y=? (B+C)
结论:
关于 VHDL代码的
执行时间 顺序问题
1,signal 和 variable 代入语句的 执行时间不同
2,variable 代入后,其数值 立即发生改变!
3,signal 代入后,数值 不 立即 改变,只有在下次
PROCESS启动后才改变。
4,利用 siganl的特性可设计
多级缓冲器电路 更多论述 参考
8位 4级 缓冲器电路
1,PROCESS( CLK,RESET )
2,BEGIN
3,IF( RESET = '0 ') THEN
4,sgIDATA1 <= X"00";
5,sgIDATA2 <= X"00";
6,sgIDATA3 <= X"00";
7,sgIDATA4 <= X"00";
8,ELSIF ( CLK'event AND CLK='0') THEN
9,sgIDATA1 <= IDATA;
10,sgIDATA2 <= sgIDATA1;
11,sgIDATA3 <= sgIDATA2;
12,sgIDATA4 <= sgIDATA3;
13,END IF;
14,ODATA <= sgIDATA4;
15,END PROCESS; 详细参见:Hfut01_buffer4
电路图
Signal?
8位 4级 缓冲器电路:电路图
代码参见:
Hfut01_buffer4
8位 4级 缓冲器电路:仿真图
再看 2个 signal和 variable的例子
1,ARCHITECTURE body_mux4 OF mux4 IS
2,SIGNAL muxval, integer 7 downto 0;
3,BEGIN
4,PROCESS ( i0,i1,i2,i3,a,b )
5,BEGIN
6,muxval <= 0;
7,IF ( a= '1' ) THEN
8,muxval <= muxval + 1;
9,END IF;
10,IF ( b= '1' ) THEN
11,muxval <= muxval + 2;
12,END IF;
13.
14,CASE muxval is
15,WHEN 0 => q <= i0;
16,WHEN 1 => q <= i1;
17,WHEN 2 => q <= i2;
18,WHEN 3 => q <= i3;
19,WHEN OTHERS => null;
20,END CASE;
21,END PROCESS;
22,END ARCHITECTURE body_mux4;
1,ARCHITECTURE body_mux4 OF mux4 IS
2,BEGIN
3,PROCESS ( i0,i1,i2,i3,a,b )
4,VARIABLE muxval, integer 7 downto 0;
5,BEGIN
6,muxval,= 0;
7,IF ( a= '1' ) THEN
8,muxval,= muxval + 1;
9,END IF;
10,IF ( b= '1' ) THEN
11,muxval,= muxval + 2;
12,END IF;
13.
14,CASE muxval is
15,WHEN 0 => q <= i0;
16,WHEN 1 => q <= i1;
17,WHEN 2 => q <= i2;
18,WHEN 3 => q <= i3;
19,WHEN OTHERS => null;
20,END CASE;
21,END PROCESS;
22,END ARCHITECTURE body_mux4;
详细参见:
p123_ex5_10
详细参见:
p123_ex5_11
图 图
4选 1 选择器的电路图( 5-10代码 )
4选 1 选择器的电路图( 5-11代码 )
差之毫厘
谬之千里
上面 2 个图的 差异?
1,看似 相似的代码,
生成的 电路

大相径庭!!
2,产生了 不需要的
时序电路单元 ( DFF)
顺序语句 & 并行语句
1,多个 顺序语句 的 执行时间顺序

代码书写的 先后次序
2,多个 并行语句 的 执行时间
相同,与
代码书写的次序 无关
顺序语句
? VHDL那些语句是 顺序语句?,共 11种
1,Case Statement
2,Exit Statement
3,Loop Statement
4,If Statement
5,Next Statement
6,Null Statement
7,Procedure Call Statement
8,Return Statement
9,Signal Assignment Statement
10.Variable Assignment Statement
11.Wait Statement
并行语句
? VHDL那些语句是 并行语句?,共 6种
1,Block Statement
2,Component Instantiation Statement
3,Concurrent Procedure Call Statement
4,Concurrent Signal Assignment Statement
5,Generate Statement
6,Process Statement
Signal Assignment Statement
&
Concurrent Signal Assignment Statement
1,[ <Label>, ]
<Target> <= [ <Delay Mechanism> ] <Waveform> ;
2,[ <Label>, ]
[ POSTPONED ] <Conditional Signal Assignment>
| [ <Label>, ]
[ POSTPONED ] <Selected Signal Assignment>
基本单元电路的 VHDL代码
1,三态门
2,双向缓冲器
3,计数器
4,移位寄存器
5,D触发器
6,译码器
7,多路选择器
8,加法器
9,乘法器
三态门:要点
1,三态电路是 总线电路 设计的必须状态
2,CPLD/FPGA器件
不能
在 内部 产生 三态电路
只能 在
端口处 产生 三态电路
2,内部三态 电路
必须用
选择器电路 代替
三态门:图
VHDL 应如何表达?
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY tri_s IS
4,PORT ( enable,,IN STD_LOGIC;
5,datain, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
6,dataout, OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
7,);
8,END ENTITY tri_s;
9,ARCHITECTURE BEHAV OF tri_s IS
10,BEGIN
11,PROCESS ( enable,datain )
12,BEGIN
13,IF enable = '1' THEN
14,dataout <= datain;
15,ELSE
16,dataout <= "ZZZZZZZZ"; -- error code,dataout <= "zzzzzzzz";
17,END IF;
18,END PROCESS;
19,END ARCHITECTURE BEHAV;
详细参见:
p127_ex5_13
三态门:代码
双向缓冲器:图
VHDL 应如何表达?
双向缓冲器:代码
? ENTITY bitri_stateok IS
1,PORT ( control, IN STD_LOGIC;
2,in1, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
3,x, OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
4,q, INOUT STD_LOGIC_VECTOR(7 DOWNTO 0)
5,);
6,END ENTITY bitri_stateok;
7,ARCHITECTURE BEHAV OF bitri_stateok IS
8,BEGIN
9,PROCESS ( control,q,in1 )
10,BEGIN
11,IF control = ?0' THEN
12,x <= q;
13,q <= "ZZZZZZZZ"; -- correct code,compare with example 5_14;
14,ELSE
15,q <= in1;
16,x <= "ZZZZZZZZ"; -- the code can be omitted !!!
17,END IF;
18,END PROCESS;
19,END ARCHITECTURE BEHAV;
详细参见:
p129_ex5_15
双向缓冲器:一个错误的代码
1,ENTITY bitri_state IS
2,PORT ( control, IN STD_LOGIC;
3,in1, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
4,x, OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
5,q, INOUT STD_LOGIC_VECTOR(7 DOWNTO 0)
6,);
7,END ENTITY bitri_state;
8,ARCHITECTURE BEHAV OF bitri_state IS
9,BEGIN
10,PROCESS ( control,q,in1 )
11,BEGIN
12,IF control = '1' THEN
13,x <= q; -- error code,compare with example 5_15;
14,ELSE
15,q <= in1;
16,x <= "ZZZZZZZZ"; -- the code can be omitted !!!
17,END IF;
18,END PROCESS;
19,END ARCHITECTURE BEHAV;
详细参见:
p129_ex5_14
电路图是?
双向端口,ex5_14 & ex5_15
ex5_14
ex5_14
双向端口:设计提示
?如果一个双向端口
用于输入模式,
必须使得
原来呈现 输出模式 的端口
为,Z”状态
4位计数器(一)
1,ENTITY CNT4 IS
2,PORT ( CLK, IN BIT;
3,Q, BUFFER INTEGER RANGE 15 DOWNTO 0
4,);
5,END ENTITY CNT4;
6,ARCHITECTURE bhv OF CNT4 IS
7,BEGIN
8,PROCESS(CLK)
9,BEGIN
10,IF CLK'EVENT AND CLK = '1' THEN
11,Q <= Q + 1;
12,END IF;
13,END PROCESS;
14,END ARCHITECTURE bhv;
详细参见:
p108_ex5_1
不推荐类型:
BUFFER
4位计数器(二)
1,ENTITY CNT4 IS
2,PORT ( CLK, IN BIT;
3,Q, OUT STD_LOGIC_VECTOR( 3 DOWNTO 0 )
4,);
5,END ENTITY CNT4;
6,ARCHITECTURE bhv OF CNT4 IS
7,SIGNAL Q1, STD_LOGIC_VECTOR( 3 DOWNTO 0 );
8,BEGIN
9,PROCESS(CLK)
10,BEGIN
11,IF CLK'EVENT AND CLK = '1' THEN
12,Q1 <= Q1 + 1;
13,END IF;
14,END PROCESS;
15,Q<=Q1;
16,END ARCHITECTURE bhv;
详细参见:
p110_ex5_2
可以吗?
Q1 <= Q1 + ‘1’;?
1,ENTITY CNT10 IS
2,PORT ( CLK,RST,EN, IN STD_LOGIC;
3,CQ, OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
4,COUT, OUT STD_LOGIC );
5,END ENTITY CNT10;
6,ARCHITECTURE bhv OF CNT10 IS
7,BEGIN
8,PROCESS(CLK,RST,EN)
9,VARIABLE CQI,STD_LOGIC_VECTOR( 3 DOWNTO 0);
10,BEGIN
11,IF RST = '1' THEN
12,CQI,= (OTHERS >='0' );
13,ELSIF CLK'EVENT AMD CLK = '1' THEN
14,IF EN = '1' THEN
15,IF CQI < 9 THEN
16,CQI,= CQI + 1;
17,ELSE
18,CQI,= (OTHERS >='0' );
19,END IF;
20,END IF;
21,END IF;
22.
23,IF CQI = 9 THEN
24,COUT <= '1' ;
25,ELSE
26,COUT <= '0';
27,END IF;
28,CQ <= CQI
29,END PROCESS;
30,END ARCHITECTURE bhv;
有复位和时钟使能的
10进制 异步 计数器
详细参见:
p113_ex5_3
移位寄存器 74HC164
VHDL表达?
移位寄存器 74HC164 VHDL表达
1,ENTITY dev164 IS
2,PORT(a,b,nclr,clock, IN BIT;
3,q, BUFFER BIT_VECTOR(0 TO 7));
4,END dev164;
5,ARCHITECTURE version1 OF dev164 IS
6,BEGIN
7,PROCESS(a,b,nclr,clock)
8,BEGIN
9,IF nclr = '0' THEN
10,q <= "00000000";
11,ELSE
12,IF clock'EVENT AND clock = '1'
13,THEN
14,FOR i IN q'RANGE LOOP
15,IF i = 0 THEN
16,q(i) <= (a AND b);
17,ELSE
18,q(i) <= q(i-1);
19,END IF;
20,END LOOP;
21,END IF;
22,END IF;
23,END PROCESS;
24,END version1;
详细参见:
hfut03_TTL74164_SHIFT
同步并行置位 移位寄存器
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY SHFRT IS
4,PORT ( CLK,LOAD, IN STD_LOGIC;
5,DIN, IN STD_LOGIC_VECTOR(7 DOWNTO 0);
6,QB, OUT STD_LOGIC
7,);
8,END ENTITY SHFRT;
9,ARCHITECTURE behav OF SHFRT IS
10,BEGIN
11,PROCESS ( CLK,LOAD )
12,VARIABLE REG8, STD_LOGIC_VECTOR( 7 DOWNTO 0);
13,BEGIN
14,IF CLK'EVENT AND CLK = '1' THEN
15,IF LOAD = '1' THEN
16,REG8,= DIN;
17,ELSE
18,REG8( 6 DOWNTO 0),= REG8 ( 7 DOWNTO 1 );
19,END IF;
20,END IF;
21,QB <= REG8 ( 0);
22,END PROCESS;
23,END ARCHITECTURE behav;
详细参见:
p115_ex5_4
D触发器
1,ENTITY DFF14 IS
2,PORT ( CLK, IN STD_LOGIC;
3,D, IN STD_LOGIC;
4,Q, OUT STD_LOGIC
5,);
6,END ENTITY DFF14;
7,ARCHITECTURE bhv OF DFF14 IS
8,BEGIN
9,PROCESS
10,BEGIN
11,wait until CLK = '1';
12,Q <= D;
13.
14,END PROCESS;
15,END ARCHITECTURE bhv;
详细参见:
p84_ex4_14
3-8 译码器
1,ARCHITECTURE RTL OF decoder_3_to_8 IS
2,SIGNAL indata, STD_LOGIC_VECTOR ( 2 DOWNTO 0 );
3,BEGIN
4,indata<= C & B & A;
5,PROCESS ( indata,G1,G2A,G2B )
6,BEGIN
7,IF ( G1= '1' AND G2A = '1' AND G2B = '1' ) THEN
8,CASE muxval is
9,WHEN "000" => y <= "11111110";
10,WHEN "001" => y <= "11111101";
11,WHEN "010" => y <= "11111011";
12,WHEN "011" => y <= "11110111";
13,WHEN "100" => y <= "11101111";
14,WHEN "101" => y <= "11011111";
15,WHEN "110" => y <= "10111111";
16,WHEN "111" => y <= "01111111";
17,WHEN OTHERS => y <= "XXXXXXXX";
18,END CASE;
19,ELSE
20,y <= "11111111";
21,END IF;
22,END PROCESS;
23,END ARCHITECTURE RTL;
3-8 译码器,
VHDL表达
详细参见:
xd_p141_ex7_11
2选 1 多路选择器
详细参见:
p70_ex4_1
1,ENTITY mux21a IS
2,PORT ( a,b, IN BIT;
3,S, IN BIT;
4,y, OUT BIT
5,);
6,END ENTITY mux21a;
7,ARCHITECTURE ONE OF mux21a IS
8,BEGIN
9,y <= a when s='0' else
10,b;
11,END ARCHITECTURE ONE;
2选 1 多路选择器,RTL图
加法器:问题
1,加法器是 硬件 实现数学运算 的最重要元件
2,乘法器和除法器均 可分解 为加法运算
3,在位数较多时,加法运算的 时间控制 很重要
4,超前 进位位 是 缩短 加法运算的重要技术
5,如何 实现 加法器:
6,A = B + C?
7,一个 重要参考文献:
蒋维隆 算 术 逻 辑 部 件
http://www.pld.com.cn/advance.htm
一位全加器:真值表
一位全加器,VHDL表达
1,entity adder is
2,port ( a, in std_logic;
3,b, in std_logic;
4,cin, in std_logic; -- 进位位
5,sum, out std_logic; -- 和位
6,cout, out std_logic); -- 进位位
7,end adder;
8,-- description of adder using concurrent signal assignments
9,architecture rtl of adder is
10,begin
11,sum <= (a xor b) xor cin;
12,cout <= (a and b) or (cin and a) or (cin and b);
13,end rtl; RTL 图
一位全加器,RTL图
全加器的延时问题
高位运算
必须等
低位进位 来到后
才能进行。
因此,它的延迟
非常可观。
无法胜任 高速运算肯定
问题的解决:
1,采用 超前进位链
2,具体过程,请参考:
蒋维隆 算 术 逻 辑 部 件
http://www.pld.com.cn/advance.htm
The end.
以下内容

正文的引用,
可不阅读。
如何使用 VHDL来设计电路?
? VHDL设计电路的的 5步曲
1,语言编码
2,逻辑综合
3,功能和时序仿真
4,器件适配
5.
返回
MAX+PLUS II BNF
? MAX+PLUS II Help uses the Backus-Naur Form (BNF) to define the
syntax of the text file formats and message variables,BNF uses the
following notation,
? Characters,Meaning:
1.,:=,Is defined as” 定义为
2,<...> Identifiers (i.e.,variables) 标识符(如变量标识符)
3,[...] Optional items 可选项
4,{,.,} Repeated items (zero or more times) 重复条目
5.,..|..,Indicates a choice between items 在 2个条目间选择一个 (或 )
6.,n:n Suffix indicates a range (e.g.,<name char>:1:8 means "from 1 to 8
name characters")
7,italics Variables in syntax descriptions 可变量
8,Courier font Literal text in syntax descriptions,Bold Courier
font is also sometimes used to help distinguish literal text from italic
variables in syntax descriptions,
返回
STD_LOGIC的取值
1,TYPE std_ulogic IS ( 'U',-- Uninitialized
2,'X',-- Forcing Unknown
3,'0',-- Forcing 0
4,'1',-- Forcing 1
5,'Z',-- High Impedance
6,'W',-- Weak Unknown
7,'L',-- Weak 0
8,'H',-- Weak 1
9,'-' -- Don't care
10,);
返回
详细参见
STD1164.VHD
VHDL信号和变量
带入(赋值)语句的 时间问题
更多论述 参考
1,候伯亨 顾新 VHDL 硬件描述语言与数字逻
辑电路设计 修订版 西安电子科技大学
1999年 1月 page 24~35
2,潘松,黄继业 ; EDA技术实用教程(第二
版) ;科学出版社 ; 2005年 2月
page119~p127 返回