kpiter 0 June 15, 2007 Posted June 15, 2007 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 30 June 15, 2007 Posted June 15, 2007 · Report post Не надо в одном процессе смешивать синхронные и асинхронные части схемы. Опишите их в разных процессах. 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-части. Quote Share this post Link to post Share on other sites More sharing options...
kpiter 0 June 15, 2007 Posted June 15, 2007 (edited) · Report post Не надо в одном процессе смешивать синхронные и асинхронные части схемы. Опишите их в разных процессах. <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 June 15, 2007 by KPiter Quote Share this post Link to post Share on other sites More sharing options...