标题: 求助:CPLD里Z状态如何实现74373 [打印本页]
作者: yangguohua78 时间: 2006-6-12 11:40 标题: 求助:CPLD里Z状态如何实现74373
各位大侠,兄弟我想编一个74373三态门逻辑锁存器的VHDL程序,可是Z状态总是通不过,MAXPLUS出现8条提示说是“TRI OR OPNDRN buffer':169' already OUTPUT pin,ti cannot also drive other types of primitives”请问这是为什么,难度只能用原理图方式输入?
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_UNSIGNED.all;
ENTITY M_74373 is
 ORT(DIN :IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
DLE :IN STD_LOGIC ;
DOE :IN STD_LOGIC ;
DOUT :OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END M_74373 ;
ARCHITECTURE B OF M_74373 IS
SIGNAL DDD: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
 ROCESS (DLE,DOE)
--VARIABLE TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF (DLE='1' AND DOE='0') THEN
DDD<=DIN;
ELSIF (DLE='1' AND DOE='1') THEN
DDD<="ZZZZ";
ELSIF (DLE='0' AND DOE='1') THEN
DDD<="ZZZZ";
END IF;
END PROCESS ;
DOUT<=DDD;
END B;
作者: stone133 时间: 2006-6-12 17:08
你把“DOUT<=DDD”去掉,直接把DDD替换为DOUT试试看
作者: A398356557 时间: 2006-6-12 17:31
ELSIF (DLE='1' AND DOE='1') THEN
DDD<="ZZZZ";
ELSIF (DLE='0' AND DOE='1') THEN
DDD<="ZZZZ";
这里两句有点问题呀 你自己好好看看咯
还有就是这ELSIF写完之后后面要接个
else
ddd<="????"; 其中的问号要看你实际电路了呀 着说名当DDD为其他状态时 怎么赋值呀
作者: anotherchen 时间: 2006-6-12 17:43
stone斑竹玩换头像啊??
楼上说得没错
最后要加一个else
作者: anotherchen 时间: 2006-6-12 17:58
应该与高阻状态有关
因为如果你将ZZZZ换成数值的话
不用加else也可以,因为dout会保持输出最后一个数值的数,
但dout应该不能保持输出ZZZZ
所以最后要加多一个else,将你所有情况下,都给dout一个数值输出
作者: yangguohua78 时间: 2006-6-13 09:32
1、把DDD改为DOUT,看起来没作用
2、ELSE 后是希望当(DLE='0' AND DOE='0')时保持当前输出(即使是 Z 状态时也要保持),不知该怎么写,另外我把OUT端口改为INOUT属性,就没有“TRI OR OPNDRN buffer':169' already OUTPUT pin,ti cannot also drive other types of primitives”提示了,但是不知道这样有没有问题,这样改后Z状态仍然没有保持,变成X状态了?
3、Z 状态该怎样保持?再谢!
作者: anotherchen 时间: 2006-6-13 10:10
就如A398356557所说的,在你发的程序里面加
else
ddd<="ZZZZ"; 就可以了,其他不需要改
作者: yangguohua78 时间: 2006-6-13 10:44
楼上所说仅仅改为else
ddd<="ZZZZ"; 是不对的,因为在(DLE='0' AND DOE='0')时锁存输出(是数据时保持当前输出的数据,是Z状态保持Z状态之前的数据),具体请参考74373真值表,如果照楼上说的改就都成了Z状态。另外我把程序改成下面了,ELSE之后希望程序能判断当前输出是否是数据,如果是数据就保持,但是程序没有正确判断。请指点,另外如果您有MAXPLUS的话请在机子上仿真一下,看是否符合74373的逻辑图,急切等待中。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_UNSIGNED.all;
ENTITY M_74373 is
PORT(DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0) ;
DLE :IN STD_LOGIC ;
DOE :IN STD_LOGIC ;
DOUT :INOUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END M_74373 ;
ARCHITECTURE A OF M_74373 IS
SIGNAL S1,S2,S3: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS (DLE,DOE,DIN)
VARIABLE T1,T2: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
S3<=DIN;
IF(DLE='1' AND DOE='0') THEN
S1<=DIN;
ELSIF (DLE='1' AND DOE='1') THEN
S1<="ZZZZZZZZ";
ELSIF (DLE='0' AND DOE='1') THEN
S1<="ZZZZZZZZ";
ELSE
IF (S2>="00000000" AND S2<="11111111") THEN
S1<=S2;
ELSE
S1<="ZZZZZZZZ";
END IF;
END IF;
END PROCESS ;
S2<=S1;
DOUT<=S1;
END A;
[此贴子已经被作者于2006-6-13 10:44:01编辑过]
作者: anotherchen 时间: 2006-6-13 14:59
是数据时保持当前输出的数据,是Z状态保持Z状态之前的数据
这样的话,试试在else里面加个条件来实现吧
作者: yangguohua78 时间: 2006-6-13 15:58
问题是我该在ELSE里加个什么语句来判断当前是数据还是Z状态,请高手指点迷津,我已经试了几天了,谢! 能不能说得具体点,或者用MAXPLUS仿真一下试试,再告诉我该怎么做,能想到的办法我都试了,刚学这个,不大懂。
作者: stone133 时间: 2006-6-14 10:56
不是我换头像玩,现在论坛好像出了点问题,每个帖子都以不同的头像发四次,正在解决;你的程序我拿去试一下
作者: stone133 时间: 2006-6-14 11:51
我试过了,只要加上else就可以的
作者: anotherchen 时间: 2006-6-15 16:32
你试试
else
当ddd=din时,dout=din
否则dout=ZZZZ
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |