三态门与双向数据总线
摘要:对三态门作分析,并用VHDL实现,主要应用在双向数据总线读写中,给出详细设计和测试代码
一·介绍
在设计CPU时如果是单总线结构,那不可避免的要用到双向总线,此时数据的读写会是一个令人头疼的问题,在此,并不详细地剖析其原理,而是尽量用大家能够理解的方式解读。
以下题为例
设计一个8位位宽的双向数据总线,由使能端s控制总线数据流向,当s-00,C的数据赋给A;当s=01,A的值赋给C;s为其他值时,B的数据赋给C。用VHDL编程设计该双向数据总线,并观察的仿真波形结果验证双向总线的功能。
二·分析
这里直接给出代码并分析
process(S,B,A,C)
BEGIN
IF S="00" THEN
C<="ZZZZZZZZ";A<=C;
ELSIF S="01" THEN
A<="ZZZZZZZZ";C<=A;
ELSE
C<=B;
END IF;
END process;
需要注意的是,这里图中的in
,out
都是针对内部来说的,相对而言,内部的out
就是C
或者A
的in
;不作赘述,下面开始分析代码;
process(S,B,A,C)
BEGIN
IF S="00" THEN --现在要读取C的数据赋值给A
C<="ZZZZZZZZ";--但是C是一个双向的总线,
--我们不希望读到内部的out
--或者说不希望内部的out干扰到本次的输入
--因此需要由内部告诉总线C我们现在不会输出
--或者说把输出暂时无效化
--方法就是由内部把C置高阻,以方便读入
A<=C;
ELSIF S="01" THEN--下面同理
A<="ZZZZZZZZ";
C<=A;
ELSE
C<=B;
END IF;
END process;
总结一下就是,在希望读双向总线数据前,要由内部把总线置高阻(即全Z
),来使内部的输出无效化,相当于此时总线的属性对内部来说只有in
,这时才能正确的读。
下面是testbench
stim_proc: process
begin
-- hold reset state for 100 ns.
S<="00";C<=X"5C";A<=(OTHERS=>'Z');
wait for 20 ns;
S<="01";A<=X"5A";C<=(OTHERS=>'Z');
wait for 20 ns;
S<="10";B<=X"5B";C<=(OTHERS=>'Z');
-- insert stimulus here
wait;
end process;
很容易发现我在这里也有置高阻的操作,否则仿真结果也不会是预期,回到之前实现部分的代码,由内部对双向总线置高阻的操作,在起到让内部可读的作用的同时,还起到了外部此时可以向总线写数据的作用,同理,内部在想要向双向总线输出的时候,也要由外部把双向总线置高阻,以便内部的输出。下面是仿真结果:
三·仿真结果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不听话的兔子君!