TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& a( t; K9 p) x4 O1 i
1. 关于端口
g) e9 z/ X% G4 ~3 P, RVHDL 共定义了 5 种类型的端口,分别是 In, Out,Inout, Buffer 及 Linkage,实际设计时只会用 到前四种。In 和 Out 端口的使用相对简单。这里,我们主要讲述关于 buffer 和 inout 使用时的注意 事项。
2 L- ~1 D5 o: z* o4 K# S4 iinout 和 buffer 区别
5 ~" q. q% u( v, z8 UINOUT 为输入输出双向端口,即从端口内部看,可以对端口进行赋值,即输出数据。也可以从 此端口读入数据,即输入;
# C9 I4 O0 S! W7 ]+ sBUFFER 为缓冲端口,功能与 INOUT 类似,区别在于当需要读入数据时,只允许内部回读内 部产生的输出信号,即反馈。举个例子,设计一个计数器的时候可以将输出的计数信号定义为 BUFFER,这样回读输出信号可以做下一计数值的初始值。 8 G" ^. b, v; l" ` d2 R
buffer 顾名思义就是缓存,它是作为输出使用的,因为在模块内,是不可以将输出赋值给其他 信号的,例如定义 b: out std_logic;我们现在要将 b 赋值给信号 a,就会出错,但是如果 b 的类型为 buffer 就可以执行操作;
5 E* B6 X d5 w) Cinout是双向端口,即可以作为输入也可以作为输出,跟buffer的作用完全不同,要注意的是inout 类型的数据在不作为输入使用时必须被置为高阻“Z”状态,否则它作为输出的功能将不能正确执行。 " g6 I; R! ]9 Q3 I- y
与 Out 端口比,Buffer 端口具有回读功能,也即内部反馈,但在设计时好不要使用 buffer, 因为 buffer 类型的端口不能连接到其他类型的端口上,无法把包含该类型端口的设计作为子模块元 件例化,不利于大型设计和程序的可读性。若设计时需要实现某个输出的回读功能,可以通过增加 中间信号作为缓冲,由该信号完成回读功能。 1 t4 m' G; Q0 ]* x* f! w- d
双向端口 Inout 是四种端口类型中为特殊的一种,难以学习和掌握,为此专门提供一个简 单程序进行阐述,部分程序如下: # R! d$ v3 c2 J6 g7 A
... … ① DataB<=Din when CE=’1’ and Rd=’0’ else ② (others=>’Z’); ③ Dout<=DataB when CE=’1’ and Rd=’1’ else ④ ( others=>’1’ ); … … 程序中 DataB 为双向端口,编程时应注意的是,当 DataB 作为输出且空闲时,必须将其设为高 阻态挂起,即有类似第②行的语句,否则实现后会造成端口死锁。而当 DataB 作为有效输入时, DataB 输出必须处于高阻态,对于该例子中即,当 CE=’1’ and Rd=’1’时,输出 DataB 应处于高阻 态。 1 E0 w2 P# Q2 ~/ o
3 S( Q/ y0 k' O8 n0 i/ P4 c7 e& [0 ?! e; V
|
|