第 6章 VHDL程序设计
<EDA技术 与应用 > 课程讲义
合肥工业大学 彭良清
下一章上一章
上一章内容 回顾
1,先看一个 VHDL代码的例子
2,简单代码结构:端口定义和电路逻辑表达
3,代码文件命名
4,进程 (PROCESS)
5,VHDL代码中的,Port,Siganl,Variable
6,学会简单 VHDL设计的三板斧
7,VHDL与 C 代码中的函数 的区别?
8,操作符 & 数据类型 & 赋值语句
9,逻辑分支语句,IF; CASE,
10,循环语句 (LOOP)
11,VHDL代码中的时序逻辑和组合逻辑表达
12,语句的执行时间问题
(顺序语句 & 并行语句)
13,基本单元电路的 VHDL代码
(三态门,双向缓冲器,计数器,D触发器,译码器 …… )
本章内容
14,复杂代码设计要领
15,层次化设计与元件语句( component )
16,代码复制( generate定义语句)
17,复杂电路的代码结构
(function,procedure,block,package)
18,库的使用
复杂代码 设计要领
1,合理划分 模块
2,使用 层次化 结构来 编码
3,使用 同步电路 设计
4,对 基本单元电路 的 VHDL代码应熟练掌握
5,使用 FSM (有限状态机) 来设计电路
6,使用 全局时钟 & 全局复位 信号(如果需
要时钟的话)
层次化设计与元件语句( component )
U1A & U2A的源代码
1,ENTITY demo1_01 IS
2,PORT ( A,IN STD_LOGIC;
3,B,OUT
STD_LOGIC
4,);
5,END ENTITY demo1_01;
6,ARCHITECTURE bhv OF demo1_01 IS
7,BEGIN
8,B <= not A;
9.
10,END ARCHITECTURE bhv;
1,ENTITY demo1_02 IS
2,PORT ( X, IN STD_LOGIC;
3,Y, IN STD_LOGIC;
4,Z, OUT STD_LOGIC
5,);
6,END ENTITY demo1_02;
7,ARCHITECTURE bhv OF demo1_02 IS
8,BEGIN
9,Z <= X AND Y;
10.
11,END ARCHITECTURE bhv;
详细参见:
hfut04_component_demo1_02
详细参见:
hfut04_component_demo1_01
1,ENTITY demo1 IS
2,PORT ( IN1, IN STD_LOGIC;
3,IN2, IN STD_LOGIC;
4,OUT1, OUT STD_LOGIC
5,);
6,END ENTITY demo1;
7,ARCHITECTURE bhv OF demo1 IS
8,COMPONENTdemo1_01 IS -- inverter component
9,PORT ( A, IN STD_LOGIC;
10,B, OUT STD_LOGIC
11,);
12,END COMPONENT demo1_01;
13,COMPONENTdemo1_02 IS -- two and gate component
14,PORT ( X, IN STD_LOGIC;
15,Y, IN STD_LOGIC;
16,Z, OUT STD_LOGIC
17,);
18,END COMPONENT demo1_02;
19,SIGNAL sigIN3, STD_LOGIC;
20.
21,BEGIN
22,U1,demo1_01 PORT MAP( A => IN1,B => sigIN3 );
23,U2,demo1_02 PORT MAP( X => sigIN3,Y => IN2,Z =>OUT1 );
24,END ARCHITECTURE bhv;
U1A+U2A的源代码
详细参见:
hfut04_component_demo1
元件例化( component instance)
sigIN3
SIGNAL sigIN3, STD_LOGIC;
U1,demo1_01 PORT MAP( A => IN1,B => sigIN3 );
U2,demo1_02 PORT MAP( X => sigIN3,Y => IN2,Z =>OUT1 );
这就是一个 层次化设计 的例子
demo1_01.vhd
demo1.vhd
demo1_02.vhd
元件例化,语法
1,元件定义语句
COMPONENT 元件名 IS
PROT ( 端口名表 );
END COMPONENT 元件名;
3,元件连接信号申明语句
SIGNAL 信号名:类型 ;
2,元件例化语句
例化名:元件名 PORT MAP( [端口名 =>] 连接端口名 ……);
取一个元件
插在 PCB的对应插座上
制作 PCB的布线
元件例化 & PCB
元件例化:全加器的例子
? 一位全加器由:
2个 1位半加器
1个 2输入 或门 组成
1位全加器,Top-Level VHDL
1,ENTITY f_adder IS
2,PORT ( ain,bin,cin, IN STD_LOGIC;
3,cout,sum, OUT STD_LOGIC
4,);
5,END ENTITY f_adder;
6,ARCHITECTURE fd1 OF f_adder IS
7,COMPONENT h_adder -- see example 4_19,or 4_20,4_21
8,PORT( a,b, IN STD_LOGIC;
9,co,so, OUT STD_LOGIC
10,)
11,END COMPONENT;
12,COMPONENT or2a -- see example 4_18
13,PORT( a,b, IN STD_LOGIC;
14,c, OUT STD_LOGIC
15,)
16,END COMPONENT;
17,SIGNAL d,e,f, STD_LOGIC;
18,BEGIN
19,u1,h_adder PORT MAP( a => ain,b=>bin; co=>d,so=>e );
20,u2,h_adder PORT MAP( a => e,b=>cin; co=>f,so=>sum );
21,u3,or2a PORT MAP( a => d,b=>f; c=>out );
22,END ARCHITECTURE fd1;
h_adder
被例化了
2次
详细参见:
p88_ex4_22_f_adder
1位全加器, 元件
1位半加器 & 2输入或门
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY h_adder IS
4,PORT ( a,b, IN STD_LOGIC;
5,co,so, OUT STD_LOGIC
6,);
7,END ENTITY h_adder;
8,ARCHITECTURE fh1 OF oh_adder IS
9,BEGIN
10,so <= NOT ( a XOR ( NOT b) );
11,co <= a AND b;
12,END ARCHITECTURE fh1;
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY or2a IS
4,PORT ( a,b, IN STD_LOGIC;
5,c, OUT STD_LOGIC
6,);
7,END ENTITY or2a;
8,ARCHITECTURE one OF or2a IS
9,BEGIN
10,c <= a or b;
11,END ARCHITECTURE one;
详细参见:
p87_ex4_18_or2a 详细参见:p87_ex4_19_h_adder
层次化设计的 4种 类别
GDF
VHDL
VHDL
1
VHDL
GDF
GDF
4
VHDL
VHDL
VHDL
3
GDF
GDF
GDF
2
第 1种:图形文件 (GDF) 调用
文本文件 (VHD)
代码复制( generate语句)
1,ENTITY shift IS
2,PORT ( a,clk, IN STD_LOGIC;
3,b, OUT STD_LOGIC
4,);
5,END ENTITY shift;
6,ARCHITECTURE bhv OF shift IS
7,COMPONENT dff
8,PORT ( d,clk, IN STD_LOGIC;
9,q, OUT STD_LOGIC
10,};
11,END COMPONENT dff;
12,SIGNAL z, OUT STD_LOGIC_VECTOR ( 0 TO 4 );
13,BEGIN
14,z(0) <= a;
15,g1,FOR i IN 0 TO 3 GENERATE
16,dffx,dff PORT MAP ( z(i),clk,z(i+1) );
17,END GENERATE;
18,b <= z(4) ;
19,END ARCHITECTURE bhv;
详细参见:
xd_p116_ex5_39_shift
代码复制:
用 4个 D触发器 构成 移位寄存器
相同的元件
Z(0) Z(1) Z(2) Z(3) Z(4)
代码复制:元件例化
1,ENTITY shift IS
2,PORT ( a,clk, IN STD_LOGIC;
3,b, OUT STD_LOGIC
4,);
5,END ENTITY shift;
6,ARCHITECTURE bhv OF shift IS
7,COMPONENT dff
8,PORT ( d,clk, IN STD_LOGIC;
9,q, OUT STD_LOGIC
10,) ;
11,END COMPONENT dff;
12,SIGNAL z, OUT STD_LOGIC_VECTOR ( 0 TO 4 );
13,BEGIN
14,z(0) <= a;
15.
16,dff0,dff PORT MAP ( z(0),clk,z( 1 ) );
17,dff1,dff PORT MAP ( z(1),clk,z( 2 ) );
18,dff2,dff PORT MAP ( z(2),clk,z( 3 ) );
19,dff3,dff PORT MAP ( z(3),clk,z( 4 ) );
20,b <= z(4) ;
21,END ARCHITECTURE bhv;
详细参见:
xd_p116_ex5_40_shift
如果构成
24位移位寄存器,
则例化语句有 X 句

新方法
generate语句 !
代码复制( generate语句)
1,ENTITY shift IS
2,PORT ( a,clk, IN STD_LOGIC;
3,b, OUT STD_LOGIC
4,);
5,END ENTITY shift;
6,ARCHITECTURE bhv OF shift IS
7,COMPONENT dff
8,PORT ( d,clk, IN STD_LOGIC;
9,q, OUT STD_LOGIC
10,) ;
11,END COMPONENT dff;
12,SIGNAL z, STD_LOGIC_VECTOR ( 0 TO 4 );
13,BEGIN
14,z(0) <= a;
15,g1,FOR i IN 0 TO 3 GENERATE
16,dffx,dff PORT MAP ( z(i),clk,z(i+1) );
17,END GENERATE;
18,b <= z(4) ;
19,END ARCHITECTURE bhv;
详细参见:
xd_p116_ex5_39_shift
生成( generate)语句:语法
?格式一
[标号,] FOR 循环变量 IN 取值范围 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
?格式二
[标号,] IF条件 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
问题:
? 请用 GENERATE语句
构成
8位锁存器 74373?
复杂电路的代码结构
构成复杂电路的代码除了上述的
使用 元件 的 层次化 设计
之外,还有:
? 函数 (function)
? 过程 (procedure)
? 块 (block)
? 包 (package)
下面分述之
函数 (function)
1,LIBRARY ieee;
2,USE ieee.std_logic_1164.all;
3,USE WORK.packexp.all;
4,ENTITY axamp IS
5,PORT
6,(
7,dat1,dat2, IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
8,dat3,dat4, IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
9,out1,out2, OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
10,);
11,END axamp;
12,ARCHITECTURE behav OF axamp IS
13,BEGIN
14,out1 <= max (dat1,dat2);
15,PROCESS ( dat2,dat4 )
16,BEGIN
17.
18,out2 <= max (dat3,dat4);
19,END PROCESS;
20,END ARCHITECTURE behav;
? LIBRARY ieee;
? USE ieee.std_logic_1164.all;
? PACKAGE packexp IS
? FUNCTION max ( a,b, IN STD_LOGIC_VECTOR )
? RETURN STD_LOGIC_VECTOR;
? FUNCTION func1 ( a,b,c, REAL )
? RETURN REAL;
? FUNCTION "*" ( a,b, IN STD_LOGIC_VECTOR )
? RETURN INTEGER;
? FUNCTION as2 ( SIGNAL in1,in2, REAL ) -- SIGNAL
? RETURN STD_LOGIC_VECTOR;
? END;
? PACKAGE BODY packexp IS
? FUNCTION max ( a,b, IN STD_LOGIC_VECTOR )
? RETURN STD_LOGIC_VECTOR IS
? BEGIN
? IF a > b THEN
? RETURN a;
? ELSE
? RETURN b;
? END IF;
? END FUNCTION max;
? END BODY packexp ;
The end.
以下内容

正文的引用,
可不阅读。
返回