5.1 微操作和寄存器传送语言 5.2 用 rtl 表示数字系统 5.3 复杂数字系统和...
Post on 15-Jan-2016
172 Views
Preview:
DESCRIPTION
TRANSCRIPT
5.1 微操作和寄存器传送语言
5.2 用RTL表示数字系统
5.3 复杂数字系统和RTL
5.4 实例:VHDL-VHSIC硬件描述语言
第五章 寄存器传送语言
微操作:大部分时序数字系统的基础。
是更简单的行为。
• 数据从一个寄存器、存储器单元或者 I/O 设备
到另一个的传送
• 修改存储的值
• 执行算术或逻辑功能
• 修改已存储的值
确定时序数字系统:确定正确的微操作传送及其条件。
(这些条件保证微操作按正确的顺序执行)
设计时序数字系统: 首先用微操作表述系统的行为 设计硬件来匹配这些表述
硬件描述语言( hardware description language , HDL )
(说明与系统需求对应的微操作的条件和传送)
电路分析和设计( circuit analysis and design , CAD )软件
(可以在用户规定的各种条件下仿真电路的行为)
设计时序数字系统:
5 . 1 微操作和寄存器传送语言
首先用微操作表述系统的行为 设计硬件来匹配这些表述
一、微操作的格式
考虑有两个 1 位寄存器 X 和 Y 的一个数字系统。
拷贝寄存器 Y 的内容到寄存器 X 中的微操作: X←Y
( 有时也可以表示为 Y→X)
两种实现: 由直接连接实现 通过总线连接实现
X
二、传送发生的条件
1. 假定传送应发生在输入控制 α 为高时,
则传送过程可以写为 IF α THEN X←Y
2. 表示微操作和它们发生的条件:
条件:微操作
当所有冒号左边的条件满足时,执行微操作
(可以是多个)规定的数据传送。
3. 上面的传送可以写为
α : X←Y
4. 具有控制信号的数据传送 α : X←Y 的实现(a) 用直接通路
(b) 用总线
X
三、提高系统性能的一种方法
同时执行两个或多个微操作。
1. 如果某系统在 α= 1 时执行 X←Y 和 Y←Z 的传
送,则这种情况可以表示成
α: X←Y , Y←Z
或者
α: Y←Z , X←Y
数据传送 α: X←Y,Y←Z 的实现
2 .同时拷贝相同的数据到多个目的地。
考虑 α : X←Y , Z←Y
实现数据传送 α: X←Y , Z←Y
3 .数字系统不能同时往同一寄存器中写入两个不同的值。
例如: 表示 α: X←Y , X←Z 无效
四、传送常量的有效条件和微操作
α: X←0
β: X←1
实现这两个传送的三种不同方法:
◆ 通过两个传送通路装载数据来设置 X 的值。
◆ 装载数据与第一个完全相同,但它的数据直接由
信号 β 产生。
◆ 为简化硬件可使用寄存器的清除输入功能。
数据传送 α: X←0 与 β: X←1 的三种实现:
(a) 用一个多路选择器来选择输入的数据
(b) 用 β 作为数据输入
(c) 用 CLR 信号
问题:当 α 和 β 同时为 1 时,怎么办?
两种解决方法:
◆ 产生 α 和 β 的硬件能保证它们决不会被同时置为 1
◆ 修改条件使它们互斥
αβ’: X←0 α: X←0 αβ’: X←0
β : X←1 α’β: X←1 α’β: X←1
五 . 寄存器之间的多位数据传送
1. 同样大小寄存器对应位之间传送数据
例如 : 当 α = 1 时,从 4 位寄存器 Y 传送数据到 4 位寄存器 X
用符号表示 α : X←Y
4 比特数据传送 α : X←Y 的实现:
(a) 用直接连接
(b) 用总线
2. 访问一个寄存器的某一位或位组。
表示每一位:如 X3 或 Y2 。
3. 表示位组(用一个域表示)
如 X3 、 X2 和 X1 可以写成 X(3-1) 或 X(3:1)
α: X(3-1)←Y(2-0)
β: X3←X2
γ: X(3-0)←X(2-0),X3
( X(2-0,3) 或 X3←X2 , X2←X1 , X1←X0 , X0←X3
)
六、执行数据的算术运算、逻辑运算和移位运算的微操
作
1 .一些常用的算术运算和逻辑运算的微操作 操 作 示 例
Add X←X + Y
Subtract X←X – Y 或 X←X + Y’ + 1
Increment X←X + 1
Decrement X←X–1
And X←X ∧ Y 或 X←XY
OR X←X ∨ Y
XOR X←X ⊕ Y
NOT X←/X 或 X←X’
2 .移位微操作
◆ 线性移位:每一位的值依次向左(或右)移位。
最后 1 位被丢弃,空位补入 0 值。
例如: X = 1011
左移一位: 0110
右移一位: 0101
◆ 循环移位:将在线性移位中被丢弃的位循环回来
替代补入的 0 值。
例如: X = 1011
循环左移: 0111
循环右移: 1101
◆ 算术移位:用于带符号数的移位。
运算规则:符号位在移位操作中保持不变,工作原理
与线性移位相似。
例如: X = 1011
算术左移: 1110
算术右移: 1101
◆ 十进制移位:专门用于 BCD表示。十进制移位与线性
移位很相似,但它移动 1 个数字或 4 位,
而不是移动 1 位。
例如: X = 1001 0111
十进制左移: 0111 0000
十进制右移: 0000 1001
操 作 示 例
线性左移 shl(X)
线性右移 shr(X)
循环左移 cil(X)
循环右移 cir(X)
算术左移 ashl(X)
算术右移 ashr(X)
十进制左移 dshl(X)
十进制右移 dshr(X)
◆ 移位操作和它们的表示法
例如: X←shl(X) 和 shl(X) 是等价的。
Y←shl(X) 两个寄存器均需指定
七、寄存器与存储器之间的数据传送
例如: M[55]←AC 和 AC←M[55]
寄存器 AC 与存储器中 55号单元之间的数据传送
更好的方法:把地址存入寄存器中,然后由寄存器提供
存储器的访问地址。
(地址寄存器,标示为 AR )
AR←55
M[AR]←AC 或者 AC←M[AR]( M←AC 和 AC←M)
5.2.1 数字元件表示 一、第一个例子( D触发器)
1. 用 RTL 描述: LD : Q←D
D触发器: (a) 无清 0 输入端 (b) 有清 0 输入端
5 . 2 用 RTL 表示数字系统
2. 有一同步清 0 输入端的 D触发器
LD: Q←D
CLR : Q←0
◆ 当 D、 LD和 CLR都等于 1 时,系统会失败。
解决方法:改变条件使得两者互斥。
CLR’LD: Q←D LD: Q←D
CLR : Q←0 LD’CLR : Q←0
二、第二个例子(一个没有 CLR 输入端的 JK触发器)
用 RTL 描述: J’K: Q←0
JK’ : Q←1
JK : Q←Q’
三、最后一个例子(一个 n位的移位寄存器)
◆ Qn-1 是最高位, Q0 是最低位。
◆ 当 SHL 信号为高时,它将其中的数据左移一位。
◆ 输入 Sin 移进最低位。
移位寄存器: SHL : Q←Q(n-2:0),Sin
5.2.2 简单系统的表示与实现 例如: 一个有 4 个 1 位触发器的系统
◆ 用 RTL代码表示传送
(假设条件 j , o , h 和 n 是互斥的)
j: M←A
o: A←Y
h: R←M
n: Y←R , M←R
◆ 几种不同的方法实现
1 .用直接连接实现系统的数据通路
◆ 用直接连接实现的该 RTL代码的系统的数据通路
◆ 用直接连接实现该 RTL代码的系统的完整设计
在合适的时间激励触发器的 LD 信号来装载数
据,从而完成传送。
▲ 当 j=1 ( M←A )或 n=1(M←R) 时,触发器M
装载数据。
▲ 在满足单个条件 o 、 h 和 n 时,触发器 A 、 R和 Y
装载数据。
2 .用总线和三态门实现
j: M←A
o: A←Y
h: R←M
n: Y←R ,M←R
3. 用总线和多路选择器实现
j: M←A
o: A←Y
h: R←M
n: Y←R ,M←R
5 . 3 . 1 模 6 计数器 目的 : 设计一个模 6 计数器
步骤:
模 6 计数器 :
000→001→010→011→100→101→000→…
(0→1→2→3→4→5→0…)
5 . 3 更复杂数字系统和 RTL
• 用 RTL 表示计数器的功能
• 用数字逻辑实现 RTL 的代码
假设:
输入端 U :控制计数
当 U = 1 时,计数器在时钟的上升沿增加它的值。
当 U = 0 时,不管时钟的值如何,它都保持当前值不变。
输出 V2V1V0 :计数器的值
进位输出: C
状态: S0→S1→S2→S3→S4→S5→S0→…
(两个另外状态 S6 和 S7 )模 6 计数器的状态表和状态图
当前状态 U 下一状态 C V2V1V0
S0 0 S0 1 000 S0 1 S1 0 001 S1 0 S1 0 001 S1 1 S2 0 010 S2 0 S2 0 010 S2 1 S3 0 011 S3 0 S3 0 011 S3 1 S4 0 100 S4 0 S4 0 100 S4 1 S5 0 101 S5 0 S5 0 101 S5 1 S0 1 000 S6 X S0 1 111 S7 X S0 1 111
一、用 RTL 表示系统
( S0+S1+S2+S3+S4 ) U : V←V+1 , C←0
S5U : V←0 , C←1
S6 + S7 : V←0 , C←1
在条件( S0+S1+S2+S3+S4+S5 ) U’ 下,计数器保持当
前值与 C 值不变。
可以用两条 RTL 语句表示:( S5U 和 S6 + S7触发相同
的微操作)
( S0+S1+S2+S3+S4 ) U : V←V+1 , C←0
S5U+ S6+ S7 : V←0 , C←1
二、模 6 计数器 RTL代码的两种实现
◆ 用一个寄存器
( S0+S1+S2+S3+S4 ) U
S5U+ S6+ S7
◆ 用一个计数器(简单)
U(V 2 ’ + V1 ’ V0 ’)
V 2 V1 + V 2 V0 U
5 . 3 . 2 收费站控制器 ◆ 两个外部传感器
▲ C显示车辆是否在收费站中
当车在时, C = 1 ,否则 C = 0 。
▲ 显示硬币是否已经投到收费站的收集篮中以及
硬币的面值。• 没有硬币投入 I1I0 = 00
• 投入五分硬币 I1I0 = 01
• 投入一角硬币 I1I0 = 10
• 投入 25 分硬币 I1I0 = 11
◆ 两个输出指示灯和一个警报灯
▲ 当一辆汽车驶入收费站时,红灯( R )亮,
直到司机投入 35 分硬币,此时红灯熄灭,绿灯 (G)亮,
绿灯保持亮着直到汽车离开收费站;
▲ 当绿灯灭时,红灯又亮了。
▲ 如果没有付足够的通行费,汽车离开,红灯一直保
持亮着且警报( A )响。
▲ 警报维持到另一辆汽车驶入收费站;然后停止。
一、控制器的状态表和状态图
状态 条 件 R G A
SNOCAR 车站中无车 1 0 0
S0 站中有车,未付费 1 0 0
S5 站中有车,已付费 5 分 1 0 0
S10 站中有车,已付费 10 分 1 0 0
S15 站中有车,已付费 15 分 1 0 0
S20 站中有车,已付费 20 分 1 0 0
S25 站中有车,已付费 25 分 1 0 0
S30 站中有车,已付费 30 分 1 0 0
SPAID 站中有车,已付足过路费 0 1 0
SCHEAT 未付足过路费就离开车站 1 0 1
当 前 状 态
C I1I0 下 一状态
R
G
A
当 前状态
C I1I0 下 一状态
R
G
A
SNOCAR 1 XX S0 1 0 0 S15 0 XX SCHEA
T
1 0 1
SPAID 0 XX SNOCA
R
1 0 0 S15 1 01 S20 1 0 0
SCHEAT 1 XX S0 1 0 0 S15 1 10 S25 1 0 0
S0 0 XX SCHEA
T
1 0 1 S15 1 11 SPAID 0 1 0
S0 1 01 S5 1 0 0 S20 0 XX SCHEA
T
1 0 1
S0 1 10 S10 1 0 0 S20 1 01 S25 1 0 0
S0 1 11 S25 1 0 0 S20 1 10 S30 1 0 0
S5 0 XX SCHEA
T
1 0 1 S20 1 11 SPAID 0 1 0
S5 1 01 S10 1 0 0 S25 0 XX SCHEA
T
1 0 1
S5 1 10 S15 1 0 0 S25 1 01 S30 1 0 0
S5 1 11 S30 1 0 0 S25 1 10 SPAI
D
0 1 0
S10 0 XX
SCH
EAT
1 0 1 S25 1 11 SPAI
D
0 1 0
S10 1 01 S15 1 0 0 S30 0 XX SCH
EAT
1 0 1
S10 1 10 S20 1 0 0 S30 1 01 SPAI
D
0 1 0
S10 1 11 SPAI
D
0 1 0 S30 1 10 SPAI
D
0 1 0
S30 1 11 SPAI
D
0 1 0
状 态 T R G A
SNOCAR 0000 1 0 0
S0 0001 1 0 0
S5 0010 1 0 0
S10 0011 1 0 0
S15 0100 1 0 0
S20 0101 1 0 0
S25 0110 1 0 0
S30 0111 1 0 0
SPAID 1000 0 1 0
SCHEAT 1001 1 0 1
Unused 1010-1111 1 0 0
收费站控制器状态赋值
二、将状态表转换成 RTL 语句
1. 当控制器状态为 SNOCAR且 C = 1 ,它转换到状态S0 ,
此状态值为 0001 。
(假设状态值存于 4 位寄存器 T 中)
SNOCAR C : T←0001
如果我们想在每次传送后设置输出值,此状
态不得不包含微操作 R←1 , G←0 和 A←0 。
2. 状态 SPAID 和 SCHEAT 各仅有一个转移情况。
SPAIDC’ : T←0000
SCHEATC : T←0001
3. 状态 S0 在状态表中有四种可能的转移情况。
S0C’ : T←1001
S0CI1’I0 : T←0010
S0CI1I0’ : T←0011
S0CI1I0 : T←0110
4. 对于其他状态,可以用同样的方法得到其 RTL代码。
5. 最终的入口是所有的无用状态均无条件转移到状态
0000 。
6. 整个控制器除输出之外的代码
SNOCARC : T←0001 S15CI1’I0 : T←0101
SPAIDC’ : T←0000 S15CI1I0’ : T←0110
SCHEATC : T←0001 S15CI1I0 : T←1000
S0C’ : T←1001 S20C’ : T←1001
S0CI1’I0 : T←0010 S20CI1’I0 : T←0110
S0CI1I0’ : T←0011 S20CI1I0’ : T←0111
S10CI1I0 : T←1000 S30CI1I0 : T←1000
S15C’ : T←1001 T3(T2+T1) :← 0000
S0CI1I0 : T←0110 S20CI1I0 : T←1000
S5C’ : T←1001 S25C’ : T←1001
S5CI1’I0 : T←0011 S25CI1’I0 : T←0111
S5CI1I0’ : T←0100 S25CI1I0’ : T←1000
S5CI1I0 :← 0111 S25CI1I0 : T←1000
S10C’ : T←1001 S30C’ : T←1001
S10CI1’I0 : T←0100 S30CI1’I0 : T←1000
S10CI1I0’ : T←0101 S30CI1I0’ : T←1000
三、扩展 RTL代码产生输出
SPAIDC’ : R←1 , G←0
SCHEATC’ : R←1 , G←0 , A←
0
SNOCARC : R←1 , G←0 , A←
0
S0C’ : A←1
S5C’ : A←1
S10C’ : A←1
S10CI1I0 : R←0 , G←1
S15C’ : A←1
S15CI1I0 : R←0 , G←1
当进入 SPAID状态, 输出 R : 1→0;
当离开 SPAID状态时,输出 R : 0 → 1 。
输出 G 正好相反,当进入 SPAID状态时变成 1 ,离开时变成 0 。
最后,无论何时进入SCHEAT状态,输出 A
变成 1 ,离开 SCHEAT
状态时变成 0 。
S20C’ : A←1
S20CI1I0 : R←0 , G←1
S25C’ : A←1
S25CI1I0’ : R←0 , G←1
S25CI1I0 : R←0 , G←1
S30C’ : A←1
S30CI1’I0 : R←0 , G←1
S30CI1I0’ : R←0 , G←1
S30CI1I0 : R←0 , G←1
T3(T2+T1) : R←1 , G←0 , A←0
四、收费站控制器的完整 RTL代码
(S0+S5+S10+S15+S20+S25+S30)C’ : T←1001
SPAIDC’ : T←0000
(SNOCAR+SCHEAT)C : T←0001
S0CI1’I0 : T←0010
S0CI1IO’ : T←0011
S0CI1I0 : T←0110
S5CI1’I0 : T←0011
S5CI1IO’ : T←0100
S5CI1I0 : T←0111
S10CI1’I0 : T←0100
S10CI1IO’ : T←0101
S10CI1I0 : T←1000
S15CI1’I0 : T←0101
S15CI1IO’ : T←0110
S15CI1I0 : T←1000
S20CI1’I0 : T←0110
S20CI1IO’ : T←0111
S20CI1I0 : T←1000
S25CI1’I0 : T←0111
S25CI1 : T←1000
S30C(I1+I0) : T←100
T3(T2+T1) : T←0000
SPAIDC’ : R←1 , G←0
(SNOCAR+SCHEAT)C : R←1 , G←0 , A←0
(S0+S5+S10+S15+S20+S25+S30)C’ : A←1
(S10+S15+S20+S25+S30)CI1I0 : R←0 , G←1
(S25+S30)CI1I0’ : R←0 , G←1
S30CI1’I0 : R←0 , G←1
T3(T2+T1) : R←1 , G←0 , A←0
5 . 4 . 1 VHDL 语法 超高速集成电路硬件描述语言
( VHSIC hardware description language , VHDL )
用途:
5.4 实例: VHDL - VHSIC 硬件描述语言
• 设计通用集成电路( IC )
• 设计专用集成电路
( application-specific IC , ASIC )
• 调整设计以适合现有的可编程逻辑电路
( programmable logic device , PLD )
优点:• 可移植性
• 设备独立
• 允许设计者在程序下载到硬件上之前检验设计
的性能
• 提供了很好的系统设计的文档支持
• 允许设计者在不同的层次表示系统
• 源代码很长且难于调试
• 对同一系统,不同的工具会产生不同的、但均有
效的设计结果。
缺点:
VHDL代码主要有三部分:
1 .库说明( library declaration )
由说明需访问的库和库中要用到模块的语句构成。
最常用到的库: IEEE库
最常用的模块: std_logic_1164模块
(描述了设计者需用的输入、输出的说明)
库、模块说明可写成如下代码:
library IEEE;
use IEEE.std_logic_1164.all;
所有用到的库与模块都列在 VHDL 设计文件中。
2 .实体部分( entity section )
在实体部分,设计者指定实体的名称和它的输
入、输出。
实体部分的基本格式如下:
entity module_name is
port(
input1 , input2 ,… inputp : in std_logic;
output1 , output2 ,… outputo : out std_logic;
inout1 , inout2 , ..inoutn : inout std_logic;
buffer1 , buffer2 ,… bufferm : buffer std_logic;
invec1 , invec2 ,… invecl : in std_logic_vector(range);
outvec1 , outvec2 , ..outveck : out std_logic_vector(range);
iovec1 , iovec2 ,… iovecj : inout std_logic_vector(range);
bufvec1 , bufvec2 ,… bufveci : buffer std_logic_vector(range);
);
end module_name;
in std_logic类型:表明设计的输入。
out std_logic类型: 定义设计的输出信号。
inout std_logic类型: 定义双向信号,它既可以输入也
可以输出数据。
buffer std_logic类型:定义设计中的内部信号。
范围( range ):(每个范围可用独立的语句定义)
invector1 : in std_logic_vector(3 downto 0);
invector2 : in std_logic_vector(4 downto 2);
invector3 : in std_logic_vector(1 to 8);
3. 结构体部分( architecture section )
指定系统的行为以及内部逻辑。
基本形式如下:
architecture arch_name of module_name is
(指定结构体名称及它所属的实体)
type and additional signal declarations;
(指定新的类型( type )和结构体中的新信号)
begin
process1 : process(signal list)
begin
statements defining behavior/logic;
end process process1;
.
.
.
processn : process(signal list)
begin
statement defining behavior/logic;
end process processn;
end arch_name;
5.4.2 高层抽象的 VHDL 设计 在不同抽象层次设计时序系统。
• 高层抽象:描述系统的有限状态机。• 低层抽象:数字逻辑设计。
1 .模 6 计数器的库说明与实体部分• 两个输入端• U端和系统时钟端 clk
• 1 位输出 C
• 3 位输出 V
(定义 V 为一个 3 位向量,下标为 2 , 1 ,和0 。)
该设计的库说明与实体部分如下:
library IEEE;
use IEEE.std_logic_1164.all;
entity mod6 is
port(
U , clk : in std_logic;
C : out std_logic;
V : out std_logic_vector(2 downto 0)
);
end mod6;
2. 扩展模 6 计数器的结构体部分 ◆ 结构体描述了一个新的枚举类型 : 状态( state )
这种类型有 8 个可能值 S0 到 S7 ,对应于计数器 的 6 个有 效状态和两个无效状态。 ◆ 申明了两个这种类型的信号
present_state :指示模 6 计数器的当前状态是 S0 到S7
中的哪一个; next_state :指示计数器的下一状态。
◆ 用下列 VHDL代码实现 architecture amod6 of mod6 is
type states is (s0 , s1 , s2 , s3 , s4 , s5 , s6 , s7);
signal present_state , next_state : states;
◆ 两个进程
• 第一个着眼于计数器的当前状态和它的输入值,
并产生期望的输出和下一状态值。
• 第二个进程执行从当前状态到下一状态的转移。
◆ 过程 state_mod6 的 VHDL代码
state_mod6 : process(present_state , u)
begin
case present_state is
when S0 => V<=”000”; C<=’1’;
if (U=’1’) then next_state <= S1;
else next_state <= S0;
end if ;
when S1 => V<=”001”; C<=’0’;
if (U=’1’) then next_state <=S2;
else next_state <= S1;
end if ;
when S2 => V<=”010”; C<=’0’;
if (U=’1’) then next_state <=S3;
else next_state <= S2;
end if ;
when S3 => V<=”011”; C<=’0’;
if (U=’1’) then next_state <=S4;
else next_state <= S3;
end if ;
when S4 => V<=”100”; C<=’0’;
if (U=’1’) then next_state <= S5;
else next_state <= S4;
end if ;
when S5 => V<=”101”; C<=’0’;
if (U=’1’) then next_state <= S0;
else next_state <= S5;
End if ;
when S6 => V<=”111”;C<=’0’;
next_state <= S0;
when S7 => V<=”111”;C<=’0’;
next_state <= S0;
end case;
end process state_mod6;
◆ state_transition模块的源代码
在时钟的上升沿,它将进程 state_mod6 产生的
next_state 的值拷贝给 present_state 。
state_transition : process(clk)
begin
if rising_edge(clk) then present_state <= next_state;
end if;
end process state_transition;
3. 用高层抽象设计的模 6 计数器的完整 VHDL代码
5 . 4 . 3 低层抽象的 VHDL 设计 一、模 6 计数器的数字逻辑设计
二、系统的完
整 VHDL 代码
实践视角: VHDL 的一些高级性能
1 .元件
例如:模 6 计数器可作为一个元件用于数
字时钟中,来计算几十秒和几十分。
2 .定时
用 after子句指定传送延时。
C <= not(q2 or q1 or q0) after 5ns;
3 .仿真
top related