第八
讲
第八
讲
移动计算研究中心
向琳向琳
xl@ftcl.hit.edu.cn
..所谓自顶向下的设计方法,就是从系统总
体要求出发,自顶向下地逐步将设计内容
细化,,最后完成系统硬件的整体设计
细节级别行为域表示
结构域结构域
基本部件
系统性能规格说明(自然性能规格说明(自然
语言)计算机/磁盘/部件
芯片(算法级)算法微处理器/RAM/ROM/微处理器/RAM/ROM/
串行端口/并行端口
寄存寄存器数据流数据流寄存器/ALU/计数器/寄存器/ALU/计数器/
多路复用器/ROM
门门布尔方程布尔方程与/或/异或/触发器与/或/异或/触发器
电路微分方程晶体管/电阻/电感/电容
版图/硅片电子和空穴迁移方程几何形状
..
..串行接口中接收控制逻辑的设计串行接口中接收控制逻辑的设
计
.该串行接口是8位接口,数据缓冲区的大小是一个字节
即接口每次只能保存一个字节的接收数据,需要等CPU
即接口每次只能保存个字节的接收数据,需要等CPU
取走缓冲区的数据后才能接收后面的串行数
.接口利用一个中断引脚,以电平触发的方式发送中断
中断引脚在接口初始化时为高电平1发送中断请求
中断引脚在接口初始化时为高电平1,发送中断请求时
变为低电平0,并一直保持,直到主机向接口发出中断
清除的命令后方可重新置为1。需要注意的是,,发出中
断请求的中断源包括数据正确接收、校验出错、数据溢
出(缓冲区未被处理时,就有新的串行数据进入),不同
的中断源要使用不同的中断清除命令
的中断源要使用不同的中断清除命令
一位串行数据流空闲时为高电平1
..(..) 一位串行数据流,空闲时为高电平1
数据传送以帧为单位每帧数据按如下顺
..数据传送以帧为单位,每帧数据按如下顺
序依次在总线上出现
:
.
1位起始位(信息0)
.
8位数据位(高位在前,低位在后
)
.
1位校验位(偶校验)
.
1位校验位(偶校验)
.
2位停止位(信息1)
外设
串行
接口
CPU
外设
串行
接口
CPU
DATA输入数据起始位的检测,
启动接收控制逻辑模块和串
并转换模块;
产生中断请求信号的逻辑电
路,输出中断请求信号,并
由地址线产生不同种类的中
可以分为接收起始控制、地址
译码逻辑、中断控制逻辑和数
据总线三态控制逻辑四个模块
控制逻辑
中断请求
中断清除
CLK
将串并转换模块接收到的有效
出据总线三态控制逻辑四个模块
处数据缓冲模块
数据线
由锁存器实现理
器串并转换模块
DATA
将串行输入的DATA数据存储在
由移位逻辑实现
接收控制逻辑
DATA
输入数据的计数,控制数据缓
可以由计数模块和译码模块实
接收控制逻辑
可以由计数模块和译码模块实
现
DATA输入数据起始位的检测,
启动接收控制逻辑模块和串
并转换模块;
产生中断请求信号的逻辑电
路,输出中断请求信号,并
由地址线产生不同种类的中
可以分为接收起始控制、地址
译码逻辑、中断控制逻辑和数
据总线三态控制逻辑四个模块
控制逻辑
中断请求
中断清除
CLK
将串并转换模块接收到的有效
出据总线三态控制逻辑四个模块
处数据缓冲模块
数据线
由锁存器实现理
器串并转换模块
DATA
将串行输入的DATA数据存储在
由移位逻辑实现
接收控制逻辑
DATA
输入数据的计数,控制数据缓
可以由计数模块和译码模块实
接收控制逻辑
可以由计数模块和译码模块实
现
clk
接收起始控制
校验
中断
计
数
译
码
clkserialintlk
结束
溢出
中断
控制
逻辑
数
器
码
器dataclk
移
位
寄
锁
存
数据
寄
存
器
存
器
地址译
码逻辑
数据
通道serialaddr内部控制码逻辑
addr内部控制
clk
serial
起始
数据接
收开始
校验
结束
标
志
通
计
数
器
译
码
器
中断
溢出
通
道
移
位
数据
寄
存
器
锁
存
器
通道
器
地址译
码逻辑内部控制内部控制
int
clkdata
data
serialaddr
计数器
Q8
CLK
CLK
QQ((33..00)
)
D((33..00)
)
译码器
Q9
CLRN
ENABLE
Q11
接收控制逻辑模块
CLRN
移位
Q(7..0)
D(7..0)
CLKQ(70)
CLKCLRN
寄存器
D(7..0)Q(7..0)
SERIAL
串并转换模块
锁存器锁存器
数据缓冲模块
串行接口口中中接接收收控控制制逻逻辑辑设设
◆
◆◆
◆
◆◆
◆
◆
15
◆
15
.
entity count4 is
.
port(
.
clk : in std_loggic;
.
clrn : in std_logic;
.
q : out std_logic_vector(3 downto 0)
.
););
.
end count4 ;
.
architecture main of count4 is main of count4 is
.
architecture
.
begin
计
.
process( clk, clrn )
..
.
variable num : integer;
variable num : integer;
数..
.
begin
if clrn = '0' then
.
q<= "00000000 ; ";
.
q <=
.
num := 0; 器(器)
.
elsif clk = '0' and clk'event then ..(..) num:= num+ 1;
num:= num+ 1;
.
q <= conv_std_logic_vector(num, 4);
.
end if;
.
end process;
..end process;
..end main;
.
entity decode4 is
.
port(
..(..) d: in std logic vector(3 downto 0);
d : in std_logic_vector(3 downto 0);
.
enable : in std_logic;
.
q8, q9, q11 : out std_logic
..
.
);)
;
.
end decode4 ;
.
architecture main of decode4 is
.
process( enable, d )
译
..
.
beginbegin
码
.
if enable = '1' then
.
case d is
.
when "1000" => q8 <= '0'; q9 <= '1'; q11 <= '1';
器
. whe(h) "1001" '1' '0' 11 <= '1';
器
n "1001" => q8(8) <= '1'; q9(9) <= '0'; q11'1'
.
when "1011" => q8 <= '1'; q9 <= '1'; q11 <= '0';
.
when others => q8 <= '1'; q9 <= '1'; q11 <= '1'; ..(..) end case;
end case;
.
else
.
q8 <= '1'; q9 <= '1'; q11 <= '1'
end if;
....end if;
..end process;
..end main;
移
位
寄
存存
器
.
entity sreg is
.
port(
.
clk, clrn, serial : in std_logic;
.
q : out std_logic_vector(7 downto 0)
.
);
.
end sreg ;
.
architecture main of sregg is
.
signal t : std_logic_vector(7 downto 0);
.
begin
.
pprocess((clk,, clrn))
.
begin
.
if clrn = '0' then
..
.
t<="0000000000000000 ";
t< ;
.
elsif clk = '1' and clk'event then
.
t(0) <= serial;
..
.
t(7 downto 1) <= t(6 downto 0);
t(7 downto 1) <= t(6 downto 0);
.
end if;
.
q <= t;
.
end process;
..end process;
..end main;
.
.
..
.
.
.
..
.
.
锁
..
锁
存
..
..
器
..
..
.
.
.
..
.
.
.
entity reg8 is
port(
clrn, clk :in std logic;
clrn, clk : in std_logic;
d : in std_logic_vector(7 downto 0)
q : out std_logic_vector(7 downto 0)
);
);
end reg8 ;
architecture main of reg8 is
architecture main of reg8 is
beginprocess(clk, clrn)
bi
begin
if clrn = '0' then
q <= "00000000";;
qelsif clk = '1' and clk'event then
q <= d;
end if;
end if;
end process;
end main;
.
entity ctrl is
.
port(
po t(
.
d9, d11 : in std_logic;
.
sq0, sq1 : in std_logic;
.
rq : iin std td_llogiic_vecttor(7 d (7 downtto 0) 0);
.
clrn : inout std logic;: inout std_logic;
.
clrn
.
start : out std_logic; 控(控)
制
.
serial, clk : in std_logic;
制
.
csn, wrn, rdn : in std_logic;
逻
.
addr : in std logic vector(1 downto 0);downto 0);
.
addr : in std_logic_vector(1
.
data : inout std_logic_vector(7 downto 0);
辑
.
intn : out std_logic
.
));
.
end ctrl;
起
始
数
据据
接
收收
开
.
process(clrn, clk)
.
begin
.
if clrn = '0' then
.
startm <= '0';
..
.
elsif clk = '11' and clk'event then
elsif clk and clk event then
.
startm <= not serial;
.
end if;
.
end process;
.
process(process(clrnclrn, startm)
.
startm)
.
begin
.
if clrn = '0' then
.
start <= '0';
.
elsif startm = '1' and startm'event then
.
start <= '11;';
.
start <=
.
end if;
..end process;
始始
.
process(sq0, rq)
.
bi
begin
.
odd <= sqq0 xor rq(0) xor rqq(()1)
校
q()
验
xor rq(2) xor rq(3) xor rq(4)
xor rq(5) xor rq(6) xor rq(7);
xor rq(5) xor rq(6) xor rq(7);
.
end process;
..
.
process(sq0 sq1)
process(sq0, sq1)结
.
begin
束
.
endddd <= sq00 andd sq11;
束
.
end process;;
p
.
process(clrint2, d9)
..
.
begin
begin
.
if clrint2 = '0' then
.
perr <= '0';
.
elsif d9 = '1' and d9'event then
.
perr <= odd;
..
.
end if;
end if;
.
end process;
中
.
process(clrint1, d11)
断
..
.
begin
if clrint1 = '0' thenthen
.
if clrint1
.
'0';buff <= (0)
.
elsif d11 = '1' and d11'event then
.
buff <= endd;
.
end if;
.
end process;
..end process;
.
process(clrint3, startm)
..
.
begin
begin