Я пытался написать конечный автомат в коде VHDL для простого 16-разрядного процессора, который я реализую на плате Altera DE1. В Finite State Machine у меня есть оператор CASE
, который обрабатывает различные 16-битные инструкции, которые вводятся в FSM 16-битным STD_LOGIC_VECTOR. Однако у меня возникли небольшие проблемы в состоянии декодирования, когда конечный автомат декодирует инструкцию. Одной из инструкций является ADD, который принимает два регистра в качестве операндов и третий в качестве регистра назначения. Тем не менее, у меня также есть инструкция ADD, которая принимает регистр и 5-битное непосредственное значение в качестве операндов и второй регистр для адресата. Моя проблема в том, что в операторе CASE
мне нужно различать две разные инструкции ADD. Итак, я подумал, что если я использую подстановочные значения, такие как «-» или «X» в операторе CASE
, я смогу провести различие между двумя с помощью всего двух случаев вместо перечисления всех возможных комбинаций регистр / непосредственное значение , Например:
CASE IR IS --(IR stands for "Instruction Register")
WHEN "0001------0-----" => (Go to 3-register add);
WHEN "0001------1-----" => (Go to 2-register/immediate value add);
WHEN OTHERS => (Do whatever);
END CASE;
Это не единственные две инструкции, которые я имею, я просто поместил эти две, чтобы сделать этот пост немного короче. Когда я компилирую и запускаю этот код, процессор перестает выполняться, когда он переходит в состояние «декодирования». Кроме того, Quartus выдает много-много предупреждений, таких как «Предупреждение о выборе VHDL в LC3FSM.vhd (37): игнорируемый выбор, содержащий мета-значение» «0001 ------ 0 -----" ""
Я в растерянности относительно того, как сделать это. Мне ДЕЙСТВИТЕЛЬНО не нужно и, вероятно, не нужно определять каждую 16-битную комбинацию, и я надеюсь, что в STD_LOGIC_VECTOR есть способ использовать подстановочные знаки, чтобы минимизировать количество комбинаций, которые мне придется определять.
Кто-нибудь знает, как этого добиться?
Спасибо