|
最近做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
SIGNAL a : STD_LOGIC_VECTOR (7 DOWNTO 0); -- DFF that stores
-- value from input.
SIGNAL b : 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损坏?——但是数据可以正常读写,只是读出的错误数据都是发生跳变的数据
这个问题已经好几天没有解决了,希望大家可以给点建议,谢谢!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|