Jump to content
    

Не понятные глюки АЦП, ЦАП на Spartan-3E Starter Kit

Hi...

Никак не могу понять странное поведение АЦП и ЦАП на отладочной плате Spartan-3E Starter Kit. АЦП и ЦАП работают но spi сидят на одной шине (хотя для АЦП используется spi_sdo шина, для ЦАП spi_sdi - конфликтовать по данным не должны (у ЦАП lt2624 хоть и есть возможность передавать в spi_sdo данные предыдущей записи, но при 24 битной загрузке (вместо 32х) на spi_sdo ничего не идет))

 

И так проблема: при изменении дизайна начинаються глюки АЦП не правильно преобразует входой аналоговый сигнал в код. например, когда 4 бит кода становиться единичкой, то при дальнешем увеличени входного сигнала этот бит никогда уже в ноль не переходит. а такого при нормальной работе происходить не должно

 

Как вобще правильно построить дизайн для работы с несколькими spi устройствами?

Дизайн должен делать следующие:

1. оцифровка входного сигнала

2. если уровень выше определенной величины, то выдать на ЦАП1 код номер1; если уровень ниже определенной величины, то выдать на ЦАП1 код номер2

3. на ЦАП2 выдать код напряжения на входе АЦП + величина зивисящая от вх.сигнала на АЦП. Т.е. ЦАП2 выдает напряжение равное напряжению на входе АЦП + небольшое смещешие в большую или меньшую сторону

 

Может по кусочкам дизайна посоветуете чего :05:

 

1. правильно ли так передавать данные ЦАП'у?

dac: process(clk, dac_en)

begin

if clk'event and clk='0' then

if dac_en='1' then

dac_count <= dac_count + 1;

else

dac_count <= 0;

end if;

end if;

 

case dac_count-1 is

when 0 =>

spi_dac_cs <='0';

dac_spi_sdi <= dac_data(19);

when 1 =>

dac_spi_sdi <= dac_data(18);

when 2 =>

dac_spi_sdi <= dac_data(17);

when 3 =>

dac_spi_sdi <= dac_data(16);

when 4 =>

dac_spi_sdi <= dac_data(15);

when 5 =>

dac_spi_sdi <= dac_data(14);

when 6 =>

dac_spi_sdi <= dac_data(13);

when 7 =>

dac_spi_sdi <= dac_data(12);

when 8 =>

dac_spi_sdi <= dac_data(11);

when 9 =>

dac_spi_sdi <= dac_data(10);

when 10 =>

dac_spi_sdi <= dac_data(9);

when 11 =>

dac_spi_sdi <= dac_data(8);

when 12 =>

dac_spi_sdi <= dac_data(7);

when 13 =>

dac_spi_sdi <= dac_data(6);

when 14 =>

dac_spi_sdi <= dac_data(5);

when 15 =>

dac_spi_sdi <= dac_data(4);

when 16 =>

dac_spi_sdi <= dac_data(3);

when 17 =>

dac_spi_sdi <= dac_data(2);

when 18 =>

dac_spi_sdi <= dac_data(1);

when 19 =>

dac_spi_sdi <= dac_data(0);

when 20 =>

dac_spi_sdi <= 'Z';

when 24 =>

spi_dac_cs <='1';

when others =>

null;

end case;

 

end process dac;

 

2. можно ли таким же образом принимать данные с АЦП?

adc: process(clk, adc_en)

begin

if (clk'event and clk='0') then

if adc_en='1' then

adc_count <= adc_count + 1;

else

adc_count <= 0;

end if;

 

case adc_count-1 is

when 0 =>

spi_adc_conv <= '1';

when 1 =>

spi_adc_conv <= '0';

 

when 4=>

reg(13) <= spi_sdo;

when 5=>

reg(12) <= spi_sdo;

when 6=>

reg(11) <= spi_sdo;

when 7=>

reg(10) <= spi_sdo;

when 8=>

reg(9) <= spi_sdo;

when 9=>

reg(8) <= spi_sdo;

when 10=>

reg(7) <= spi_sdo;

when 11=>

reg(6) <= spi_sdo;

when 12=>

reg(5) <= spi_sdo;

when 13=>

reg(4) <= spi_sdo;

when 14=>

reg(3) <= spi_sdo;

when 15=>

reg(2) <= spi_sdo;

when 16=>

reg(1) <= spi_sdo;

when 17=>

reg(0) <= spi_sdo;

when 18=>

adc_data <= reg;

when others =>

null;

end case;

end if;

end process adc;

 

P.S. В сегодняшнем варианте дизайн работает, но при изменении, например, сигнала с 1 на 0 в цепи FPGA подключенной к сведодиоду начинаются глюки!

ПОМГИТЕ ПОЖАЛУЙСТА!!

design.txt

Share this post


Link to post
Share on other sites

Не надо в одном процессе смешивать синхронные и асинхронные части схемы. Опишите их в разных процессах.

process(clk)
  begin
   if falling_edge(clk) then
   if dac_en = '1' then
      dac_count <= dac_count + 1;
   else    
      dac_count <= 0;
   end if;
    end if;
        end process;

process(dac_count, dac_data)
begin
        case dac_count - 1 is
                when 0 => 
                           spi_dac_cs <='0';
                           dac_spi_sdi <= dac_data(19);
-- много опущено
                when 20 =>
                        dac_spi_sdi <= 'Z';
                when 24 => 
                        spi_dac_cs <='1';
                when others =>
                        null;
            end case;
-- тут надо определить значения spi_dac_cs и dac_spi_sdi для всех значений dac_count,
-- иначе будет вместо комбинаторной логики синтезироваться защелка. Вы уверены, что
-- вам это надо?
-- Или эту часть схемы тоже надо сделать синхронной.
end process;

 

То же самое и для ADC-части.

Share this post


Link to post
Share on other sites

Не надо в одном процессе смешивать синхронные и асинхронные части схемы. Опишите их в разных процессах.

<skip>

-- тут надо определить значения spi_dac_cs и dac_spi_sdi для всех значений dac_count,

-- иначе будет вместо комбинаторной логики синтезироваться защелка. Вы уверены, что

-- вам это надо?

-- Или эту часть схемы тоже надо сделать синхронной.

 

Я просто не знаю как правильно организовать работу с spi шиной...

к fpga подключен ЦАП с spi_clk и spi_sdi. spi_clk = общий клок (CLK) в дизайне.

Асинхронно case сделан потому, что, я думаю, как только по спаду СLK изменилось значение dac_count, асинхронно меняеться значение данных на spi_sdi и по фронту CLK данные забирает ЦАП.

Если делать синхронно, то не понятно как будет меняться dac_count... асинхронно быстрее сработает, не нужно такт ждать. нужен ли здесь синхронизм? (опять о вопросе как работать с spi шиной).

А защелок мне нигде не надо :) От них избавляються прописыванием всех значение сигналов для всех значений dac_count?

 

Да, а ADC уже сделано синхронно т.к. данные надо забирать по спаду CLK.

 

спасибо за ответ.

Edited by KPiter

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...