Несколько дополнительных моментов для рассмотрения:
1) Несоответствие в увеличении адресов ввода / вывода: addressin<=addressin+"01";
и addressout<=addressout+1;
. Поведение этих назначений будет зависеть от типа сигнала операндов, поэтому эта информация полезна, хотя это может и не быть реальной проблемой.
2) Должно быть относительно безопасно предположить, что любые изменения в адресных сигналах напрямую связаны с включением y
, поскольку это единственный сигнал в списке чувствительности этого процесса. Вы проверяли значение y
рядом с адресами в средстве просмотра формы сигнала?
3) Пол предложил это, но я просто хочу уточнить, почему вы можете захотеть, чтобы эта схема была «синхронизирована» (синхронно). Без часов в списке чувствительности этот процесс чувствителен только к изменениям y
. Поэтому любые элементы памяти, подразумеваемые этим процессом, будут полностью не знать о часах и будут затронуты только изменениями на входе y
. Другими словами, чтобы продвинуть указатель чтения, y
должен был бы переключить между состояниями idle
и reed
. Вам нужно будет решить, предназначено ли это или логика должна продвигать указатель чтения каждый такт, когда состояние reed
присутствует на y
. Может быть нетрадиционным для элемента памяти не получать назначенные часы, потому что часы получают специальную обработку для упрощения статического анализа синхронизации, но это не запрещено языком (не может обещать то же самое для последующих инструментов).
В целом, похоже, у вас есть хорошее представление о том, чего вы пытаетесь достичь, и вы понимаете некоторые нюансы VHDL, поэтому следующим шагом будет дальнейшая изоляция неожиданного поведения. Большее количество кода поможет исключить некоторые потенциальные проблемы, но, возможно, лучший способ одновременно протестировать ваши предположения и предоставить воспроизводимый пример - создать тестовую среду, которая иллюстрирует неожиданное поведение.
Например, вот тестовая среда для проверки синхронизированной копии вашего процесса.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Entity test Is
End Entity;
Architecture main of test Is
Signal enable, clock : std_logic := '0';
Signal addressin, addressout, addressall : unsigned(0 to 1) := "00";
Type op_t is (reed, idle, rite);
Signal y : op_t;
Signal done : boolean;
Begin
clocks: process
begin
if not done then
clock <= not clock;
wait for 0.5 ns;
else
wait;
end if;
end process;
PROCESS (clock, y)
BEGIN
if rising_edge(clock) then
CASE y IS
WHEN idle=>
enable<='0';
WHEN reed=>
enable<='0';
IF (addressin="00" OR addressin="01" OR addressin="10") THEN
addressin<=addressin+1;
ELSE
addressin<="00";
END IF;
addressall<=addressin;
WHEN rite=>
enable<='1';
IF (addressout="00" OR addressout="01" OR addressout="10") THEN
addressout<=addressout+1;
ELSE
addressout<="00";
END IF;
addressall<=addressout;
END CASE;
end if;
END PROCESS;
main: Process
Begin
y <= idle;
wait for 1 ns;
y <= reed;
wait for 1 ns;
assert addressall = "00";
wait for 1 ns;
assert addressall = "01";
wait for 1 ns;
assert addressall = "10";
wait for 1 ns;
assert addressall = "11";
y <= idle;
wait for 1 ns;
done <= true;
wait;
End Process;
End Architecture;