Рабочая группа предоставила шаблоны и правила для создания стилей кодирования. В приведенных выше примерах показаны некоторые возможные варианты использования. Конечно, я недавно не видел первый стиль кодирования, хотя, как я уже говорил, я думаю, что в то время я смог найти такой регистр в библиотеке ASIC, которая использовала его для логики сканирования.
Однако сегодня, если мы немного изменим показанный шаблон кода (но все еще совместимый с 1076.6-2004), мы получим кое-что полезное. Примечание. Я заменил «elsif» на «конец, если» и отдельное «если», что является моим предпочтительным способом кодирования.
MemProc : process (ClkA, ClkB)
type MemType is array (0 to 1023) of std_logic_vector(7 downto 0) ;
variable Mem : MemType ;
begin
if rising_edge(ClkA) then
DataOutA <= Mem(to_integer(unsigned(AddrA))) ;
if WriteA = '1' then
Mem(to_integer(unsigned(AddrA))) := DataInA ;
end if ;
end if ;
if rising_edge(ClkB) then
DataOutB <= Mem(to_integer(unsigned(AddrB))) ;
if WriteB = '1' then
Mem(to_integer(unsigned(AddrB))) := DataInB ;
end if ;
end if ;
end process ;
Вы также можете подумать, что стиль кодирования, который требуют некоторые поставщики FPGA, не является допустимым для языка. Тип общей переменной должен быть защищенным. Общие переменные с обычными типами были временно разрешены в VHDL-93, но, как отмечено в VHDL-93, это было исправлено в следующей версии VHDL-2000/2002.
Если поставщики FPGA хотят сделать что-то эффективное и легальное для языка, они могут заменить свой незаконный код кодом OSVVM MemoryPkg, чтобы реализовать модели памяти как надлежащий защищенный тип. Причина, по которой я говорю, что это эффективно, заключается в том, что MemoryPkg реализует структуру данных, которая реализует память только по мере ее использования. Вы можете найти OSVVM на github и osvvm.org.
library OSVVM;
use OSVVM.MemoryPkg.all;
architecture ...
shared variable ptRam : MemoryPType ;
begin
ptRam.MemInit(
AddrWidth => Address'length, DataWidth => Data'length
) ;
MemAProc : process (ClkA)
begin
if rising_edge(ClkA) then
DataOutA <= ptRam.MemRead(AddrA) ; ;
if WriteA = '1' then
ptRam.MemWrite(AddrA, DataInA) ;
end if ;
end if ;
end process ;
MemBProc : process (ClkB)
begin
if rising_edge(ClkB) then
DataOutB <= ptRam.MemRead(AddrB) ; ;
if WriteB = '1' then
ptRam.MemWrite(AddrB, DataInB) ;
end if ;
end if ;
end process ;
Вы можете сказать, что синтезировать защищенный тип слишком сложно. Простой ответ: вам не нужно. Вы не можете синтезировать большую часть кода ни в std_logic_1164, ни в numeric_std — не верьте мне, попробуйте взять код изrising_edge и использовать все это в операторе if для создания триггера.
person
Jim Lewis
schedule
08.01.2019