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),表示取值为234
并列数值,如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=‘1THEN Q1<=‘0’;
ELSIF CLK'EVENT AND CLK = '1THEN
IF EN=‘1THEN 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 = ‘1THEN 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,状态机的输出是当前状态和当前输入的函数,不与时钟同步。