У меня простая конструкция, где я считываю входящие байты из порта RS-232, а затем «разбираю» их.Процесс оценивается слишком много раз
Я попытался разделить это на 2 процесса:
первый один получает биты от последовательного порта и пытается их кадр - если это удастся, он присваивает результат на сигнал с именем
next_byte
типаunsigned(7 downto 0)
:-- simplified version rxbits := serial_rx & rxbits(...); if (rxbits contain a frame) then: next_byte <= ....; rxbits := (others => '1'); end if;
второй один имеет
next_byte
в списке чувствительности; он преобразует ascii'0'
/'1'
в значения бит. Я предполагал, что это будет оценено, когдаnext_byte
назначается:-- simplified version num <= num(...) & ascii_to_bit(next_byte);
Похоже, процесс 2 оценивается слишком много раз, когда next_byte
изменения:
- Если я пошлю
'1'
на FPGA,num
сразу же изменяется на все'1'
(я позже показываю это на дисплее с семью сегментами * 4, поэтому я вижу это). - Если я пришлю
'0'
,num
немедленно изменится ко всем'0'
s.
Почему это происходит? Какие события заставляют его оценивать так много раз? Может быть, это не «простой» сигнал (а не std_logic
)?
Кстати, запуск его в ISim Xilinx ISE не воспроизводит эти результаты - после отправки '1'
, num
обновлений, как ожидалось.
Кроме того, если я удалю второй процесс, и просто модифицировать первый быть:
-- simplified version
-- next_byte is a variable this time
rxbits := serial_rx & rxbits(...);
if (rxbits contain a frame) then:
next_byte := ....;
num <= num(...) & ascii_to_bit(next_byte);
rxbits := (others => '1');
end if;
Все работает, как ожидалось ...
EDIT: Я модифицировал код немного до сумма значение полученных цифр (то есть '1'
добавляет 1
в num
, '5'
добавляет 5
...). Если я запустил его, используя эти 2 процесса, дисплей (показывая num
) просто мерцает навсегда (-> процесс 2 называется неопределенно ...); Если я запускаю его с использованием 1 процесса, он работает нормально.
EDIT 2: минимальная, но воспроизводит проблему:
signal a: unsigned(7 downto 0) := (others => '0');
signal num: unsigned(13 downto 0) := (others => '0');
...
process1: process(clk)
variable counter: unsigned(31 downto 0) := (others => '0');
begin
if rising_edge(clk) then
counter := counter + 1;
if counter(23 downto 0) = 0 then
a <= counter(31 downto 24);
end if;
end if;
end process;
process2: process(a)
begin
num <= num + a;
end process;
Дисплей num
мерцает навсегда.
Но здесь:
signal num: unsigned(13 downto 0) := (others => '0');
...
process1: process(clk)
variable counter: unsigned(31 downto 0) := (others => '0');
begin
if rising_edge(clk) then
counter := counter + 1;
if counter(23 downto 0) = 0 then
num <= num + counter(31 downto 24);
end if;
end if;
end process;
Это прекрасно работает, дисплей num
увеличивается, как и следовало ожидать.
Какой драйвер/баннер RS-232 вы использовали для чтения порта? –
Что это значит? сотрясать? – Jong
Вы изменили код? Без [минимального, полного и проверяемого примера] (http://stackoverflow.com/help/mcve) проверьте свои синтетические сообщения, скорость передачи бод и т. Д. Как вы ожидаете, что кто-нибудь будет комментировать, не видя процессов, деклараций (типа , индикация подтипа) и драйверов сигналов? Каков тип возврата ascii_to_bit? Почему next_byte без знака? Синтез эффективно игнорирует списки чувствительности, если ваш код имитирует, но не создает рабочего оборудования, ... – user1155120