请高手帮忙改一个vhdl数字钟程序

请高手帮忙改一个vhdl数字钟程序,这个是显示模块的程序,由于自己能力有限改不好。请各位大侠给出修改后的正确程序,最好能说明一下错误原因,小女子非常感谢~!!

模块的主要功能是:当SHOW_NEW_TIME端口输入信号为高电平时,根据NEW_TIME端口输入的时间数据,产生相应的6个七段数码显示器的驱动数据,并在DISPLAY端口输出该信号;当SHOW_NEW_TIME端口输入信号为低电平时,若SHOW_ALARM端口的输入信号为高电平,则根据ALARM_TIME端口输入的时间数据,产生相应的6个七段数码显示器的驱动数据,并在DISPLAY端口输出该信号;当SHOW_NEW_TIME端口和SHOW_ALARM端口的输入信号都为低电平时,若ALARM_TIME端口的输入信号值与CURRENT_TIME端口的输入信号值相同,SOUND_ALARM端口输出高电平。

我写的程序如下

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.PACK_CLOCK.ALL;
ENTITY C_DISPLAY IS
PORT(ALARM_TIME,CURRENT_TIME,NEW_TIME:IN T_CLOCK_TIME;
SHOW_NEW_TIME,SHOW_ALARM:IN STD_LOGIC;
SOUND_ALARM :OUT STD_LOGIC;
DISPLAY:OUT T_DISPLAY);
END ENTITY C_DISPLAY;
ARCHITECTURE ART OF C_DISPLAY IS
SIGNAL A:T_CLOCK_TIME;
BEGIN
CTRL:PROCESS(ALARM_TIME,CURRENT_TIME,NEW_TIME,SHOW_ALARM,SHOW_NEW_TIME)
BEGIN
SOUND_LP: FOR I IN ALARM_TIME'RANGE LOOP
IF NOT(ALARM_TIME(I) = CURRENT_TIME(I)) THEN
SOUND_ALARM<='0';
EXIT SOUND_LP;
ELSE
SOUND_ALARM<='1';
END IF;
END LOOP SOUND_LP;
IF SHOW_NEW_TIME = '1' THEN
A <= NEW_TIME;
ELSIF SHOW_ALARM = '1' THEN
A <= ALARM_TIME;
ELSIF SHOW_ALARM = '0' THEN
A <= CURRENT_TIME;
END IF;
END PROCESS;
PROCESS(A)
BEGIN
CASE A IS
WHEN "0000"=> DISPLAY <="0111111";
WHEN "0001"=> DISPLAY <="0000110";
WHEN "0010"=> DISPLAY <="1011011";
WHEN "0011"=> DISPLAY <="1001111";
WHEN "0100"=> DISPLAY <="1100110";
WHEN "0101"=> DISPLAY <="1101101";
WHEN "0110"=> DISPLAY <="1111101";
WHEN "0111"=> DISPLAY <="0000111";
WHEN "1000"=> DISPLAY <="1111111";
WHEN "1001"=> DISPLAY <="1110011";
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;
END ARCHITECTURE ART;

其中,PACK_CLOCK这个是 程序包 主要是定义了
SUBTYPE T_DIGITAL IS INTEGER RANGE 0 TO 9;
SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;
TYPE T_CLOCK_TIME IS ARRAY (5 DOWNTO 0) OF T_DIGITAL;
TYPE T_DISPLAY IS ARRAY (5 DOWNTO 0) OF T_DIGITAL;

编译出现错误 Can't interpret expression 在 case A is 这一句,还有个错误是该vhdl程序prevent further processing

首先你要弄清系统的硬件原理,你是想用六个数码管显示时,分,秒对吧,其次你要明白明白七段数码管显示的原理,要么是静态输出驱动电平,要么是动态扫描,我看了你的code感觉你是想静态输出6个数码管的段码,所以你的Packet里对于显示的数组应该定义成6个成员的8位数组,而对时间位码的定义应该是0到9的整形数,也是6个,对应时分秒,所以你在code里用case把显示的时间映射为数码管的七段显示码应该要用6次的LOOP。代码我改好了,你要有问题可以HI找我。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.PACK_CLOCK.ALL;
ENTITY C_DISPLAY IS
PORT(ALARM_TIME,CURRENT_TIME,NEW_TIME:IN T_CLOCK_TIME;
SHOW_NEW_TIME,SHOW_ALARM:IN STD_LOGIC;
SOUND_ALARM :OUT STD_LOGIC;
DISPLAY:OUT T_DISPLAY);
END ENTITY C_DISPLAY;
ARCHITECTURE ART OF C_DISPLAY IS
SIGNAL A:T_CLOCK_TIME;
BEGIN
CTRL:PROCESS(ALARM_TIME,CURRENT_TIME,NEW_TIME,SHOW_ALARM,SHOW_NEW_TIME)
BEGIN
SOUND_LP: FOR I IN ALARM_TIME'RANGE LOOP
IF NOT(ALARM_TIME(I) = CURRENT_TIME(I)) THEN
SOUND_ALARM<='0';
EXIT SOUND_LP;
ELSE
SOUND_ALARM<='1';
END IF;
END LOOP SOUND_LP;
IF SHOW_NEW_TIME = '1' THEN
A <= NEW_TIME;
ELSIF SHOW_ALARM = '1' THEN
A <= ALARM_TIME;
ELSIF SHOW_ALARM = '0' THEN
A <= CURRENT_TIME;
END IF;
END PROCESS;
PROCESS(A)
BEGIN
DD: FOR I IN ALARM_TIME'RANGE LOOP
CASE A(I) IS
WHEN 0=> DISPLAY(I) <="0111111";
WHEN 1=> DISPLAY(I) <="0000110";
WHEN 2=> DISPLAY(I) <="1011011";
WHEN 3=> DISPLAY(I) <="1001111";
WHEN 4=> DISPLAY(I) <="1100110";
WHEN 5=> DISPLAY(I) <="1101101";
WHEN 6=> DISPLAY(I) <="1111101";
WHEN 7=> DISPLAY(I) <="0000111";
WHEN 8=> DISPLAY(I) <="1111111";
WHEN 9=> DISPLAY(I) <="1110011";
WHEN OTHERS=> NULL;
END CASE;
END LOOP DD;
END PROCESS;
END ARCHITECTURE ART;

-----------
SUBTYPE T_DIGITAL IS INTEGER RANGE 0 TO 9;
SUBTYPE T_DISPL IS STD_LOGIC_VECTOR(7 DOWNTO 0);
-- SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;
TYPE T_CLOCK_TIME IS ARRAY (5 DOWNTO 0) OF T_DIGITAL;
TYPE T_DISPLAY IS ARRAY (5 DOWNTO 0) OF T_DISPL;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-03
你定义的T_CLOCK_TIME是INTEGER类型的,而且还是一个二维数组,后面在对它的情况说明时又是用得STD_LOGIC类型( "1000")。我觉得不应该这样用。试一下将A得类型改为:STD_LOGIC_VECTOR(3 DOWNTO 0).