Есть куча вещей, которые не совсем подходят для вашей реализации. Совершенно независимо от того, чего вы пытаетесь достичь, есть некоторые вещи с VHDL, которые следует помнить:
- Каждое вступительное заявление должно иметь заключительное.
- Каждый уровень вложенности должен иметь закрывающий оператор, чтобы «разложить» его.
- Вы не можете поместить части одного набора операторов (внутренние элементы case) в другой оператор (цикл for), это кажется странным, но подумайте об этом, к какому case он будет присоединяться.
- VHDL и аппаратное программирование в целом смехотворно параллельны, от одной итерации к другой процесс полностью независим от всех других процессов.
Теперь, глядя на ваш код, я вижу то, что вы хотите сделать, и это прекрасный пример того, почему вы должны немного знать скрипты на другом языке, чтобы помочь программированию на аппаратном уровне. Вы должны быть как можно более конкретными при создании процесса, знать, чего вы хотите достичь и в каких пределах, я знаю, что это похоже на любой другой язык, но аппаратное программирование дает вам все инструменты, чтобы полностью повесить себя. Вот лучшее, что я могу сделать из вашего кода, чтобы навести порядок.
async_process : process (r_addr, fifo_data_out, array_reg)
begin
case r_addr is
when "0000000000" => fifo_data_out <= array_reg(0);
when "0000000001" => fifo_data_out <= array_reg(1);
when "0000000002" => fifo_data_out <= array_reg(2);
when others => fifo_data_out <= array_reg(ADRESS_WIDTH-1);
end case;
end process;
r_addr_inc_process : process (clock <or other trigger>, reset)
<This is where you would deal with the bounds of the register address.
If you still want to deal with that variable, do it here.>
end process;
Итак, как вы можете видеть из этого, вы хотите обновлять как можно меньше вещей, когда имеете дело с процессом, таким образом, ваш список конфиденциальности является чрезвычайно конкретным, и вы можете заставить большинство обновлений происходить синхронно, а не асинхронно. Причина, по которой ваш асинхронный процесс может быть таким, заключается в том, что он будет обновляться каждый раз, когда обновляется r_addr, и это происходит при каждом чтении часов или при каком-либо флаге, и это дает вам согласованное состояние сброса.
С учетом того, насколько итеративным является процесс, вы можете видеть, как использование языка сценариев для заполнения сотен значений регистров поможет сократить его трудоемкость.
person
Jeff Langemeier
schedule
17.06.2013