Freezing_ 发表于 2013-5-21 11:40:06

如何处理bidir(inout)端口才能让输出数据稳定?

最近做flash读写,用到了altera的inout端口,发现了一个奇怪的问题,纠结了好几天
使用inout端口输出数据时,使用SignalTAP观察到inout口的数据有跳变,如下图:


data_to_flash 端口的数据,直接赋给f_io,但是遇到高四位包含0010或者0001数据的,都会自动变成0000,例如:
图中
11H-->01H
22H-->02H
33H,44H就是正确的
55H-->45H
66H-->46H
......
最后总结出,第6 5为是10 或01的时候就会变成00,11的时候正常
0001-->0000
0010-->0000
0101-->0100
0110-->0100
1001-->1000
1101-->1100
1110-->1100

当我将inout口直接修改为output时,数据完全正确,如下图:

reg_a是f_io输出缓冲寄存器,是为了观察数据是否在模块内部就发生了变化(后附代码)

确定问题是inout口引起的后,将管脚类型改回inout,但是只作为输出口用,结果依然正确

在网上查询资料后,在altera官网上他们给出了bidir口的使用例子,如下:
---------------------------------------------------------------------------------------------------------------
idir.vhd (Tri-state bus implementation)        LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
        ENTITY bidir IS
    PORT(
      bidir   : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
      oe, clk : IN STD_LOGIC;
      inp   : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
      outp    : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END bidir;
        ARCHITECTURE maxpld OF bidir IS
SIGNALa: STD_LOGIC_VECTOR (7 DOWNTO 0);-- DFF that stores
                                             -- value from input.
SIGNALb: STD_LOGIC_VECTOR (7 DOWNTO 0);-- DFF that stores
BEGIN                                        -- feedback value.
    PROCESS(clk)
    BEGIN
    IF clk = '1' AND clk'EVENT THEN-- Creates the flipflops
      a <= inp;                  
      outp <= b;                  
      END IF;
    END PROCESS;   
    PROCESS (oe, bidir)          -- Behavioral representation
      BEGIN                  -- of tri-states.
      IF( oe = '0') THEN
            bidir <= "ZZZZZZZZ";
            b <= bidir;
      ELSE
            bidir <= a;
            b <= bidir;
      END IF;
    END PROCESS;
END maxpld;
---------------------------------------------------------------------------------------------------------------

我根据例子自己编写了对应的代码,应该说就是复制粘贴,如下:


但是在实际的观察中,数据的错误依旧存在,如下:


观察综合后的电路如下:



自己总结:
1.是否是io口数据变化太快,我的数据变化是10MHz——但是单纯output口输出是同样的速度,也没有错误
2.是否综合出的电路有错?
3.是否flash损坏?——但是数据可以正常读写,只是读出的错误数据都是发生跳变的数据

这个问题已经好几天没有解决了,希望大家可以给点建议,谢谢!

Freezing_ 发表于 2013-5-22 08:37:08

没人关注啊

hughqfb 发表于 2013-5-23 09:15:33

inout端口把我也折磨死了。
我看你两个进程中的敏感信号不一样哦!你试着同步一下!
页: [1]
查看完整版本: 如何处理bidir(inout)端口才能让输出数据稳定?