摘要:对三态门作分析,并用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或者Ain;不作赘述,下面开始分析代码;

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;   

  很容易发现我在这里也有置高阻的操作,否则仿真结果也不会是预期,回到之前实现部分的代码,由内部对双向总线置高阻的操作,在起到让内部可读的作用的同时,还起到了外部此时可以向总线写数据的作用,同理,内部在想要向双向总线输出的时候,也要由外部把双向总线置高阻,以便内部的输出。下面是仿真结果:

三·仿真结果

图示