Здравствуйте, уважаемые товарищи Инженеры!
Вчера отлаживал схему многоканального частотомера,а именно ту её часть, где производится получение пакета по UART с технологического компьютера, и был повержен такой обьективной реальностью:
CODE
SUBDESIGN 1
(
clk : INPUT =GND; -- 33 МГц
IN, INP[7..0] : INPUT;
OUT, OUTP[7..0] : OUTPUT;
)
VARIABLE
SS: MACHINE WITH STATES (idle, INI, RX_START_BYTE, RX_CMD, RX_CHS, RX_CHECK, RX_STOP_BYTE, RX_ERR, CH_START, CH_123);
DT:DFF;
BEGIN
DT.CLK = !CLK;
Ss.clk = CLK;
CASE SS IS
WHEN idle =>
SS = ini;
WHEN ini =>
OUTP=0;
SS = CH_START;
WHEN CH_START =>
OUTP=5;
DT.D=VCC;
SS = CH_123;
WHEN CH_123 =>
SS = CH_123;
WHEN RX_ERR =>
IF OUTP==5 THEN SS = IDLE; END IF;
WHEN OTHERS =>
SS = idle;
END CASE;
OUT=DT.Q;
END;
временная диаграмма сигналов - файл 1.жпг во вложении.
Смущает следующее - при записи принятых байтов в "переменные" типа node или dff в одних состояниях автомата, не получается работать с ними в других состояниях, они чудесным для меня образом обнуляются. Мозг, засраный парадигмой структурного программирования контроллеров, отказывается понять концепцию программирования конфигурации ПЛИС.
Худо-бедно удалось реализовать желаемое через lpm_ff:
CODE
INCLUDE "LPM_FF.INC";
SUBDESIGN 1
(
clk : INPUT =GND; -- 33 МГц
IN, INP[7..0] : INPUT;
OUTP[7..0] : OUTPUT;
)
VARIABLE
SS: MACHINE WITH STATES (idle, INI, RX_START_BYTE, RX_CMD, RX_CHS, RX_CHECK, RX_STOP_BYTE, RX_ERR, CH_START, CH_123);
DTT:LPM_FF WITH (LPM_WIDTH=8);
CLR:NODE;
BEGIN
DTT.CLOCK = VCC;
Ss.clk = CLK;
CASE SS IS
WHEN idle =>
SS = ini;
WHEN ini =>
CLR=VCC;
SS = CH_START;
WHEN CH_START =>
DTT.DATA=5;
DTT.aload=VCC;
SS = CH_123;
WHEN CH_123 =>
SS = CH_123;
WHEN OTHERS =>
SS = idle;
END CASE;
DTT.sclr = !CLR;
OUTP[]=DTT.Q;
END;
диаграмма сигналов - рис. 2 во вложении
Но такой способ,мягко говоря, притянут за уши.
Посоветуйте неграмотному,как строить схемотехнику в таких случаях. Перейти на vhdl/verilog не предлагать)
Всем заранее благодарен!
Изучение внутренностей lpm_ff показало,что асинхронная установка реализуется примитивом latch.
Можно ли реализовать в таком случае вообще "переменные" через синхронные триггеры? Была попытка уменьшить частоту тактирования автомата относительно триггеров "переменных", результата это не дало..
Сообщение отредактировал Кузнецофф Ю. - Dec 10 2013, 08:26