Скачать 1.44 Mb.
|
Приложение 4Разработанная программаlibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; ENTITY PIOX_PackDecode IS PORT ( aclr : IN STD_LOGIC; -- сброс конечного автомата PIOX_DATA_IN : IN STD_LOGIC_VECTOR(15 DOWNTO 0); -- входные линии пио PIOX_DATA_OUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- выходные линии в пио aPIOX_WR : IN STD_LOGIC; -- сигнал управления на пио (не синхронный) (запись) sPIOX_RD : IN STD_LOGIC; -- сигнал управления на пио (синхронный) (чтение) sPIOX_WR : IN STD_LOGIC; -- сигнал управления на пио (синхронный) (запись) ADDR : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- адрес из заголовка пакета DATA_IN : IN STD_LOGIC_VECTOR(15 DOWNTO 0); -- данные для пакета DATA_OUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- данные из пакета PIOX_ERR : OUT STD_LOGIC; -- ошибка пакета (неверный формат пакета) сбрасывается успешной обработкой пакета и сигналом aclr (начальной установки) BORDER : OUT STD_LOGIC; -- границы пакета DOUBLE_STROB_OUT: OUT STD_LOGIC; -- парные стробы записи в память SINGLE_STROB_OUT: OUT STD_LOGIC; -- одиночный строб записи в регистр DOUBLE_STROB_IN: OUT STD_LOGIC; -- парные стробы чтения из памяти SINGLE_STROB_IN: OUT STD_LOGIC; -- одиночный строб чтения из регистра PACK_SUM : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- cумма данных пакета из регистра GR_SUM 10011000=0x98 CLK: IN STD_LOGIC; -- F = 20 МГц -- debug -- VEC8 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- VEC2 : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); deb_a : OUT STD_LOGIC; deb_b : OUT STD_LOGIC ); END PIOX_PackDecode; ARCHITECTURE AUTOMAT OF PIOX_PackDecode IS signal State : STD_LOGIC_VECTOR(1 downto 0); -- текущее состояние автомата signal N : std_logic_vector (7 downto 0); -- номер обрабатываемого слова из пакета signal ssUnion:STD_LOGIC; -- обединение выравненых стробов PIOX_WR и PIOX_RD signal Reset:STD_LOGIC; -- сборка aclr и SelfReset signal SelfReset:STD_LOGIC; -- сброс при некорректном пакете signal tSTROB_IN:STD_LOGIC; -- сигнал служит признаком генерации парных стробов signal tData_Out: std_logic_vector (15 downto 0); -- данные на PIOX в момент PIOX_WR signal tADD:STD_LOGIC; -- задержка границ пакета BORDER для проходжения всех стробов tSTROB_OUT signal tBORDER:STD_LOGIC; -- граница инф. части пакета - предвестник сигнала занятия RAM signal HOLD_sPIOX_WR:STD_LOGIC; -- задержаный сигнал PIOX_WR используется для определения запись/чтение в смешанном сигнале ssUnion существует в положительной области, те не как PIOX_WR signal Delay_sPIOX_RD:STD_LOGIC; -- задержаный сигнал PIOX_RD signal tPACK_SUM : STD_LOGIC_VECTOR(15 DOWNTO 0); signal tADDR : STD_LOGIC_VECTOR(7 DOWNTO 0); signal C_SIGN : STD_LOGIC; BEGIN --V1<=Reset; --V2<=SelfReset; ADDR<=tADDR; PACK_SUM<=tPACK_SUM; DATA_OUT<=tDATA_OUT; ssUnion<= sPIOX_RD AND sPIOX_WR ; -- объединение нужно, так как подсчет количества слов идет и в записи и в чтении Reset<=(SelfReset and (NOT (sPIOX_WR AND sPIOX_RD))) or aclr; -- сброс происходит по aclr или по ошибке протокола, сброс по ошибке протокола удерживается до конца импульса PIOX_RD/WR вызвавшего его; после сброса возобновляется и Selfeset освобождается BORDER<=tBORDER OR tADD; -- границы пакета формируются от конца заголовка пакета до конца последнего слова пакета + время на формирование импульсов записи PIOX_DATA_OUT<=DATA_IN; -- просто сквозное прохождение -- задержанный сигнал PIOX_RD для выделения переднего фронта в импульсе PIOX_RD Delay_sPIOX_RD_drive: PROCESS(sPIOX_RD,CLK) BEGIN if CLK'event and CLK='0' then Delay_sPIOX_RD<=sPIOX_RD; else NULL; end if; END PROCESS Delay_sPIOX_RD_drive; -- данные на запись действительны в момент переднего фронта PIOX_WR DATA_OUT_drive: PROCESS(aPIOX_WR) BEGIN if aPIOX_WR'event and aPIOX_WR='1' then tDATA_OUT<=PIOX_DATA_IN; else NULL; end if; END PROCESS DATA_OUT_drive; -- Адрес формируется из заголовка пакета при записи или при чтении между пакетами -- Количество слов непрерывно отслеживается для определения границ пакета ADDR_N_drive: PROCESS(Delay_sPIOX_RD,sPIOX_RD,State,ssUnion,HOLD_sPIOX_WR) variable HOLD_sPIOX_RD:STD_LOGIC; BEGIN HOLD_sPIOX_RD:=Delay_sPIOX_RD and sPIOX_RD; if HOLD_sPIOX_RD='0' and State="00" then tADDR<="00011000"; elsif ssUnion'event and ssUnion='1' then if HOLD_sPIOX_WR='1' and State="00" then N<=tDATA_OUT(15 downto 8); tADDR<= tDATA_OUT(7 downto 0); if tDATA_OUT="10011000" then NULL; -- в начале пакета счетчик сбрасывается else tPACK_SUM<="0000000000000000"; end if; -- сумма подсчитывается в конце записи, если это не запись заголовка (State=0) и не регистр GR_sum -- при цикле чтения этого регистра его значение гарантированно не изменяется elsif State="11" OR State="10" OR State="01" then if State="11" OR State="10" then N<= N-1; else NULL; end if; -- при обращении по адресу RG_sum счета не происходит if tADDR="10011000" then NULL; -- в записи счет значений в момент aWR elsif HOLD_sPIOX_WR='1' then tPACK_SUM<=tPACK_SUM+tDATA_OUT; --при чтении в момент sRD elsif HOLD_sPIOX_WR='0' then tPACK_SUM<=tPACK_SUM+DATA_IN; end if; else NULL; end if; else NULL; end if; END PROCESS ADDR_N_drive; BORDER_drive: PROCESS (ssUnion,sPIOX_RD,Reset) BEGIN if Reset='1' then tBORDER<='0'; elsif ssUnion'event and ssUnion='1' then if State="00" then if HOLD_sPIOX_WR='1' then tBORDER<='1'; else NULL; end if; elsif State="11" OR State="10" then if N="00000001" then tBORDER<='0'; else NULL; end if; elsif State="01" then if N="00000000" then tBORDER<='0'; else NULL; end if; else NULL; end if; else NULL; end if; END PROCESS BORDER_drive; -- парные стробы записи формируются после импульса PIOX_WR STROB_OUT_drive: PROCESS (CLK,State,Reset) variable count: std_logic_vector(2 downto 0); BEGIN -- sPIOX изменяется по переднему фронку CLK if Reset='1' then count:="000"; tADD<='0'; HOLD_sPIOX_WR<='0'; DOUBLE_STROB_OUT<='0'; SINGLE_STROB_OUT<='0'; elsif CLK'event and CLK='0' then if sPIOX_WR='0' then count:="111"; elsif sPIOX_WR='1' AND count="000" then NULL; else count:=count-1; end if; -- в первом такте nCLK зависимые от него State и count еще не изменились и в случае если State = 0 они пропускают свой такт установки и не выставляют tADD if count="111" and State="000" then tADD<='0'; -- если State не мешает tADD выставляется уже в началн PIOX_WR elsif count="111" then tADD<='1'; -- по концу счета сигнал возврвщается в исходное состояние elsif count="000" then tADD<='0'; else NULL; end if; -- HOLD_sPIOX_WR продливает сигнал на 8,5 тактов if count="000" then HOLD_sPIOX_WR<='0'; elsif count="111" then HOLD_sPIOX_WR<='1'; else NULL; end if; -- двойной строб для записи if tADD='1' then CASE count IS when "110"=> DOUBLE_STROB_OUT<='1'; SINGLE_STROB_OUT<='1'; when "101"=> DOUBLE_STROB_OUT<='0'; SINGLE_STROB_OUT<='0'; when "100"=> DOUBLE_STROB_OUT<='1'; SINGLE_STROB_OUT<='0'; WHEN OTHERS =>DOUBLE_STROB_OUT<='0'; SINGLE_STROB_OUT<='0'; END CASE; end if; else NULL; end if; END PROCESS STROB_OUT_drive; -- стробы чтения формируются в начале импульса PIOX_RD STROB_IN_drive: PROCESS (CLK,State,tSTROB_IN) variable count: std_logic_vector(2 downto 0); BEGIN if CLK'event and CLK='0' then if tSTROB_IN='0' then count:="111"; -- tSTROB_IN признак начала генерации elsif count="000" then NULL; else count:=count-1; end if; CASE count IS when "110"=> DOUBLE_STROB_IN<='1'; SINGLE_STROB_IN<='0'; when "101"=> DOUBLE_STROB_IN<='0'; SINGLE_STROB_IN<='1'; when "100"=> DOUBLE_STROB_IN<='1'; SINGLE_STROB_IN<='0'; WHEN OTHERS =>DOUBLE_STROB_IN<='0'; SINGLE_STROB_IN<='0'; END CASE; else NULL; end if; END PROCESS STROB_IN_drive; -- конечный автомат отслеживает фазы обработки пакета данных MAIN: PROCESS (CLK,sPIOX_RD,sPIOX_WR,Reset,State,aclr) variable StatePrepare :std_logic_vector (1 downto 0); -- следующее состояние автомата BEGIN -- сброс состояния автомата if Reset='1' then if aclr='1' then PIOX_ERR<='0'; else NULL; end if; tSTROB_IN<='0'; State<="00"; StatePrepare:="00"; elsif CLK'event AND CLK='0' then if sPIOX_RD='0' then CASE State IS WHEN "00" => tSTROB_IN<='1'; StatePrepare:="00"; WHEN "01" => tSTROB_IN<='1'; if N="00000000" then StatePrepare:="00"; PIOX_ERR<='0'; else StatePrepare:="10"; end if; WHEN "10" => tSTROB_IN<='1'; if N="00000001" then StatePrepare:="00"; PIOX_ERR<='0'; else StatePrepare:="10"; end if; WHEN "11" => PIOX_ERR<='1'; SelfReset<='1'; StatePrepare:="00"; WHEN OTHERS => NULL; END CASE; elsif sPIOX_WR='0' then CASE State IS WHEN "00" => StatePrepare:="01"; WHEN "01" => if N="00000000" then StatePrepare:="00"; PIOX_ERR<='0'; else StatePrepare:="11"; end if; WHEN "11" => if N="00000001" then StatePrepare:="00"; PIOX_ERR<='0'; else StatePrepare:="11"; end if; WHEN "10" => PIOX_ERR<='1'; StatePrepare:="00"; SelfReset<='1'; WHEN OTHERS => NULL; END CASE; -- поскольку оба нуля уже удалены в LineUp в else - случай когда оба '1' else State<=StatePrepare; -- сменить состояние SelfReset<='0'; tSTROB_IN<='0'; end if; else NULL; end if; -- main if deb_a<=tSTROB_IN; deb_b<=sPIOX_RD; END PROCESS MAIN; END AUTOMAT; |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
Правительство Российской Федерации Федеральное государственное автономное... Федеральное государственное автономное образовательное учреждение высшего профессионального образования |
||
Правительство Российской Федерации Федеральное государственное автономное... «Формирования и реализация инновационной политики коалиционного правительства Великобритании» |
Правительство Российской Федерации федеральное государственное автономное... Маркетинговый план для усиления конкурентоспособности компании «Прогноз» 53 |
||
Правительство Российской Федерации Федеральное государственное автономное... Регрессионный анализ влияния макрофакторов на показатели банковской деятельности 21 |
Правительство Российской Федерации Федеральное государственное автономное... Зона свободной торговли асеан – Австралия и Новая Зеландия |
Поиск |