求助:用VHDL写74l373遇到的问题
最近用用Verilog HDL语言写373后,把程序烧进CPLD,然后在单片机里运行读写外部RAM(HY8400,512K)时发现有些地址写不进去,比如以FF结尾的地址,我用的单片机是PHILIPS的P89C51RD2HBA,各位大侠以前遇到过这样的问题吗?以下是我写的VHDL代码,Verilog HDL 也写了,效果多一样。
下面使用VHDL语言,采用传统的自下而上的方法设计74373。
首先设计锁存器(Latch),将实现Latch的VHDL程序保存在文件latch.vhd中。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Latch IS
PORT ( D: IN STD_LOGIC;
ENA : IN STD_LOGIC;
Q : OUT STD_LOGIC );
END Latch;
ARCHITECTURE one OF Latch IS
SIGNAL sig_save : STD_LOGIC;
BEGIN
PROCESS ( D,ENA )
BEGIN
IF ENA = ’1’ THEN
Sig_save <= D;
END IF;
Q <= sig_save;
END PROCESS;
END one;
SN74LS373的VHDL语言设计程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_II64.ALL;
ENTITY SN74373 IS
PORT ( D : IN STD_LOGIC_VECTOR( 8 DOWNTO 1);
OEN, G : IN STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR( 8 DOWNTO 1 ) );
END SN74373;
ARCHITECTURE one OF SN74373 IS
COMPONENT Latch
PORT ( D, ENA : IN STD_LOGIC;
Q : OUT STD_LOGIC);
END COMPONENT;
SIGNAL sig_mid : STD_LOGIC_VECTOR(8 DOWNTO 1);
BEGIN
GeLatch : FOR iNum IN 1 TO 8 GENERATE
Latchx : Latch PORT MAP( D(iNum), G, sig_mid(iNum) );
END GENERATE;
Q <= sig_mid WHEN OEN = ‘0’ ELSE “ZZZZZZZZ”;
END one;
ARCHITECTURE two OF SN74373 IS
SIGNAL sigvec_save : STD_LOGIC_VECTOR( 8 DOWNTO 1);
BEGIN
PROCESS ( D, OEN, G)
BEGIN
IF OEN = ‘0’ THEN
Q <= sigvec_save;
ELSE
Q <= “ZZZZZZZZ”;
END IF;
IF G = ‘1’ THEN
Sigvec_save <= D;
END IF;
END PROCESS;
END two;
以下是Verilog HDL代码:
以下是Verilog HDL代码:
module cpld(l_addr_out,ale);
output [7:0] l_addr_out;
input ale;
always @(negedge ale)
begin
mcu_8400_data = mcu_data;
end
assign l_addr_out = mcu_8400_data ;
endmodule
这个写的有点简单,我只用上面的64K做实验,HY8400的高三位一直附0。
"然后在单片机里运行读写外部RAM(HY8400,512K)时发现有些地址写不进去"
这会是程序问题吗?单片机和外部ram又没有问题?
 ROCESS ( D,ENA )
BEGIN
IF ENA = ’1’ THEN
Sig_save <= D;
END IF;
Q <= sig_save;
END PROCESS;
END one;
这个程序很简单,不会有什么竞争冒险,也就是不会出现时行,时不行的情况。你再检查一下。
楼主有QQ吗
可否加258162863
请教问题
程序问题~~
我练习用COMPONENT元件例化,可写出来的程序不能正确锁存,也是373的
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shaoxie373 IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
EN0,EN1,EN2,EN3,EN4,EN5,EN6:IN STD_LOGIC;
G:IN STD_LOGIC;
P1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P3:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P4:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P5:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P6:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
P7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END shaoxie373;
ARCHITECTURE structure OF shaoxie373 IS
COMPONENT three
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
EN:IN STD_LOGIC;
G:IN STD_LOGIC;
P:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT;
BEGIN
U1:three
PORT MAP(D,EN0,G,P1);
U2:three
PORT MAP(D,EN1,G,P2);
U3:three
PORT MAP(D,EN2,G,P3);
U4:three
PORT MAP(D,EN3,G,P4);
U5:three
PORT MAP(D,EN4,G,P5);
U6:three
PORT MAP(D,EN5,G,P6);
U7:three
PORT MAP(D,EN6,G,P7);
END structure;
--373描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY three IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
EN:IN STD_LOGIC;
G:IN STD_LOGIC;
P:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END three;
ARCHITECTURE struct OF three IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(EN)
BEGIN
IF(G='1')THEN
P<="ZZZZZZZZ";
ELSIF(EN='1')THEN
P<=D;
END IF;
END PROCESS;
END struct;
PROCESS ( D,ENA )
BEGIN
IF ENA = ’1’ THEN
Sig_save <= D;
END IF;
是的,这种没有else的非同步电路就是锁存器的标准写法,除非是专门写,在同步电路中应该避免。
你写的代码没有问题,就是iNUM没有定义,你可用直接写成是i,再就是两个文件要再同一个工程下编译,我已经按这要求改好并且编译和仿真成功
恩,好像没有inum哦,楼上是不是弄错了哦
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY LS373 IS
PORT( D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
OE:IN STD_LOGIC;
LE:IN STD_LOGIC
);
END LS373;
ARCHITECTURE ONE OF LS373 IS
SIGNAL Q_TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(LE,OE,D)
BEGIN
IF OE='0' THEN
IF LE='1' THEN
Q_TEMP<=D;
END IF;
ELSE Q_TEMP<="ZZZZZZZZ";
END IF;
END PROCESS;
Q<=Q_TEMP;
END ONE;
下面是RTL
[此贴子已经被作者于2008-12-26 10:23:31编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |