EDA复习

EDA复习

数据类型

BIT和STD_LOGIC区别

TYPE BIT IS(‘0’,’1’) 只有两种取值,而 TYPE STD_LOGIC IS (‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘); –有9种取值

image-20211209165313117

顺序语句

**信号赋值语句 <= 变量赋值语句 := **

CASE语句

1
2
3
4
5
6
7
8
9
10
11
CASE <表达式> IS
When <选择值或标识符> => <顺序语句>; ... ; <顺序语句> ;
When <选择值或标识符> => <顺序语句>; ... ; <顺序语句> ;
...
WHEN OTHERS => <顺序语句>;
END CASE ;
可选方式:
单个普通数值,如6。
数值选择范围,如(2 TO 4),表示取值为2、3或4。
并列数值,如35,表示取值为3或者5。
混合方式,以上三种方式的混合。

PROCESS语句

1
2
3
4
5
[进程标号: ] PROCESS [ ( 敏感信号参数表  ) ] [IS]
[进程说明部分]
BEGIN
顺序描述语句
END PROCESS [进程标号];

image-20211209170050919

IF语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
case 1:
IF 条件句 Then
顺序语句
END IF ;

case 2:
IF 条件句 Then
顺序语句
ELSE
顺序语句
END IF ;

case 3:
IF 条件句 Then
顺序语句
ELSIF 条件句 Then
顺序语句
...
ELSE
顺序语句
END IF

case 4:
IF 条件句 Then
IF 条件句 Then
...
END IF
END IF

应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--含异步复位和时钟使能的D触发器的VHDL描述 

LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF1 IS
PORT (CLK, RST, EN, D: IN STD_LOGIC ;
Q : OUT STD_LOGIC );
END ;
ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1 : STD_LOGIC;
BEGIN
PROCESS (CLK,Q1, RST, EN)
BEGIN
IF RST=‘1’ THEN Q1<=‘0’;
ELSIF CLK'EVENT AND CLK = '1‘ THEN
IF EN=‘1’ THEN Q1 <= D;
END IF;
END IF;
END PROCESS ;
Q <= Q1 ;
END bhv;
--说明:若将IF RST=‘1’ THEN Q1<=‘0’ 写在检测上升沿外面就是异步复位,若写在里面则是同步复位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
--十进制同步使能异步复位加法计数器
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.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 < 9 THEN CQI := CQI + 1;
ELSE CQI := (OTHERS =>'0');
END IF;
END IF;
END IF;
IF CQI = 9 THEN COUT <= '1';
ELSE COUT <= '0';
END IF;
CQ <= CQI;
END PROCESS;
END behav;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--移位寄存器带有同步并行预置功能的8位右移移位寄存器。CLK是移位时钟信号,DIN是8位并行预置数据端口,LOAD是并行数据预置使能信号,QB是串行输出端口
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;

LOOP语句

1
2
3
4
5
6
L2 : LOOP
a := a+1;
EXIT L2 WHEN a >10 ; -- 当a大于10时跳出循环
END LOOP L2;


并行语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
--赋值语句
ARCHITECTURE curt OF bc1 IS
SIGNAL s1, e, f, g, h : STD_LOGIC ;
BEGIN
output1 <= a AND b ;
output2 <= c + d ;
g <= e OR f ;
h <= e XOR f ;
s1 <= g ;
END ARCHITECTURE curt;
--条件赋值语句
ARCHITECTURE behv OF mux IS
BEGIN
z <= a WHEN p1 = '1' ELSE
b WHEN p2 = '1' ELSE
c ;
END;
--选择信号赋值语句
WITH 选择表达式 SELECT
赋值目标信号 <= 表达式 WHEN 选择值
表达式 WHEN 选择值
...
表达式 WHEN 选择值;

instruction <= c & b & a ;
WITH instruction SELECT
dataout <= data1 AND data2 WHEN "000" ,
data1 OR data2 WHEN "001" ,
data1 NAND data2 WHEN "010" ,
data1 NOR data2 WHEN "011" ,
data1 XOR data2 WHEN "100" ,
data1 XNOR data2 WHEN "101" ,
'Z' WHEN OTHERS ;
-- 元件例化语句

COMPONENT 元件名 IS
GENERIC (类属表); -- 元件定义语句
PORT (端口名表);
END COMPONENT 文件名;

例化名 :元件名 PORT MAP( -- 元件例化语句
[端口名 =>] 连接端口名,...) ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--例:半加器例化全加器
LIBRARY IEEE; --1位二进制全加器顶层设计描述
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; --定义3个信号作为内部的连接线。
BEGIN
u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>d,so=>e); --例化语句
u2 : h_adder PORT MAP(e, cin, f,sum);
u3 : or2a PORT MAP(a=>d, b=>f, c=>cout);
END ARCHITECTURE fd1;

image-20211209201027090

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CONTROL IS
PORT ( clk,reset : IN STD_LOGIC;
inputs : IN STD_LOGIC_VECTOR (0 TO 1);
red,green,yellow : OUT STD_LOGIC );
END CONTROL;
ARCHITECTURE behv OF CONTROL IS
TYPE FSM_ST IS (s0, s1, s2);--数据类型定义,状态符号化
SIGNAL current_state, next_state: FSM_ST;
BEGIN
REG: PROCESS (reset,clk) --主控时序进程
BEGIN
IF reset = ‘1’ THEN current_state <= s0;
ELSIF clk='1' AND clk'EVENT THEN
current_state <= next_state;
END IF;
END PROCESS;

COM:PROCESS(current_state, inputs) --主控组合进程
BEGIN
CASE current_state IS
WHEN s0 => red='1';green='0';yellow='0';
IF state_inputs = "00" THEN next_state<=s0;
ELSE next_state<=s1;
END IF;
WHEN s1 => red='0';green='1';yellow='0';
IF state_inputs = "01" THEN next_state<=s1;
ELSE next_state<=s2;
END IF;
WHEN s2 => red='0';green='0';yellow='1';
IF state_inputs = "10" THEN next_state <= s0;
ELSE next_state <= s3;
END IF;
WHEN OTHERS => next_state <= s0;
END case;
END PROCESS;
END behv;

image-20211209201808521

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--八进制同步使能异步复位加法计数器
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --调用加法运算符时需要添加
ENTITY CNT8 IS
PORT (CLK,RST,EN,LOAD : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
DATA : IN STD_LOGIC_VECTOR(2 DOWNTO 0));
END CNT8;
ARCHITECTURE behav OF CNT8 IS
BEGIN
PROCESS(CLK, RST, EN, LOAD)
VARIABLE CQI : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS => '0');
ELSIF CLK'EVENT AND CLK = '1' THEN
IF EN = '1' THEN
IF LOAD = '1' THEN CQI := DATA;
ELSIF CQI < 7 THEN CQI := CQI + 1;
ELSE CQI := (OTHERS =>'0');
END IF;
END IF;
END IF;
IF CQI = '111' THEN COUT = '1';
ELSE COUT = '0';
END IF;
DOUT <= CQI;
END PROCESS;
END behav;

image-20211209203637046

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY EXPS IS
PORT(IN1, IN2, IN3 : IN STD_LOGIC;
OUT1, OUT2 :OUT STD_LOGIC);
END ENTITY EXPS;
ARCHITECTURE behav OF EXP IS
COMPONENT EXP
PORT(A1, A2 : IN STD_LOGIC;
Q1, Q2 : OUT STD_LOGIC);
END COMPONENT;
SIGNAL A, B, C, D : STD_LOGIC;
BEGIN
u1 : EXP PORT MAP(IN1, IN2, A, B);
u2 : EXP PORT MAP(A, IN3, C, D);
OUT2 <= NOT B;
OUT1 <= C AND B;
END ARCHITECTURE behav;

信号和变量定义区别

信号定义在进程外面,变量定义在进程里面。

常见上升沿表示方法

1
2
3
4
5
6
7
8
9
10
CLK'EVENT AND CLK= '1' 
rising_edge(CLK) -- 必须打开STD_LOGIC_1164程序包
wait until CLK = '1' ; --利用wait语句
CLK='1' AND CLK'LAST_VALUE='0'
CLK'EVENT AND (CLK='1') AND (CLK'LAST_VALUE='0')

--下降
CLK'EVENT AND CLK= '0'
CLK'EVENT AND (CLK='0') AND (CLK'LAST_VALUE='1')
falling_edge(CLK)

注意

写类似CASE···WHEN语句的条件判断语句时,一定得考虑到所有状态,不能有遗漏!

简答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FUNCTION 函数名(参数表) RETURN  数据类型         --函数首
FUNCTION 函数名(参数表)RETURN 数据类型 IS -- 函数体
[ 说明部分 ]
BEGIN
顺序语句 ;
END FUNCTION 函数名;


PROCEDURE 过程名(参数表) -- 过程首
 
PROCEDURE 过程名(参数表) IS -- 过程体
[说明部分]
BIGIN
顺序语句;
END PROCEDURE 过程名
--过程与函数的区别:
过程能返回多个变量,而函数则总是返回一个取值;
函数中的所有参数都是输入参数,而过程有输入参数、输出参数和双向参数;
过程在结构体或者进程中以语句的形式被调用,而函数经常在赋值语句或表达式中使用。   
--状态机
--优势
状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点;
由于状态机的结构相对简单,设计方案相对固定;
状态机容易构成性能良好的同步时序逻辑模块;
与VHDL的其他描述方式相比,状态机的VHDL表述丰富多样、程序层次分明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的好处;
在高速运算和控制方面,状态机更有其巨大的优势。
高可靠性。

--区别
基于状态的FSM即Moore(摩尔型)FSM,状态机的输出仅是当前状态的函数,且仅在时钟跃变时发生,通常与时钟同步。
基于输入的FSM即Mealy(米勒型)FSM,状态机的输出是当前状态和当前输入的函数,不与时钟同步。