سؤال
لدي الكود التالي للعد حتى 59.يبدأ الأمر بشكل جيد ولكن بعد 31 عامًا، يبدأ في عرض أحرف ASCII مثل '('، '$'، '#' وما إلى ذلك، بدلاً من الأرقام.هل لديك أي فكرة أين أخطئ؟
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
entity counter is
port(clk: IN STD_LOGIC;
secs:OUT INTEGER RANGE 0 to 59);
end counter;
architecture counter_behav of counter is
signal countSVal: INTEGER RANGE 0 to 59:=0;
begin
process(clk)
begin
if(rising_edge(clk)) then
if(countSVal>=59) then
countSVal <= 0;
else
countSVal <= countSVal + 1;
end if;
secs <= countSVal;
end if;
end process;
end counter_behav;
المحلول
ومنذ كنت لا تطبع أي شيء، وأفترض أنك تبحث في هذه في المشاهد الموجي. تعيين نوع تبين أن عدد صحيح، قد يكون ذلك كما ASCII كما قال AnthonyWJones.
نصائح أخرى
ليس لدي أي فكرة عن ماهية vhdl، ومع ذلك، يبدو على الأرجح أن ما تستخدمه لمراقبة الإخراج هو لا يعرض لك أحرف ASCII قبل 32 لأن هذه ستكون أحرف تحكم، لذلك فهو يعرض قيمها للخطر ويظهر لك.نظرًا لأن 32 وما فوق عبارة عن أحرف قابلة للطباعة، فإنه يتحول إلى استخدام هذه الأحرف لأن هذا هو ما تعتقد الأداة أنه القيم.
وإدراج إشارة إضافية:
signal my_char: character;
وبعد قيام التحويل من عدد صحيح إلى الحرف:
my_char <= character'val(countSVal);
وتحقق إشارة my_char تحت المصحح أو في المشاهد الموجي وسترى الأحرف ASCII. لقد تأكدت منه مع ALDEC النشطين-HDL 6.1.