Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: VHDL - как реализовать такую вещь...
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Kuzmi4
Здравствуйте.

Есть такой код:
Код
hf_dep1:    process (half_full,signal2foto) is
        begin
            if ( half_full'event and half_full='1' ) then --аналогично (rising_edge(half_full)) then
            ---+++
                rd <= '1';
                rd_clk <= clock;
            ---+++
            end if;
            if ( signal2foto'event and signal2foto='1' ) then --аналогично (rising_edge(signal2foto)) then
                ---+++
                    rd <= '0';
                    rd_clk <= '0';
                ---+++
            end if;
        end process;

и ему подобный
Код
reset_proc: process (rst,start) is
            begin
                if ( (rst'event and rst='1') and start='0' ) then --аналогично (rising_edge(rst) and start='0') then
                --+++                
                in_rst_signal <= '1';                
                --+++                
                end if;
                if ( start'event and start='1' ) then --аналогично (rising_edge(start)) then
                    --+++
                        in_rst_signal <= '0';--return back reset signal to ZERO
                        rst <= '0';
                    --+++
                    end if;
            end process;

Матюкаеться так 1111493779.gif :
Цитата
Error (10820): Netlist error at my_fifo.vhd(148): can't infer register for in_rst_signal because its behavior depends on the edges of multiple distinct clocks

Error (10820): Netlist error at my_fifo.vhd(112): can't infer register for rd_clk because its behavior depends on the edges of multiple distinct clocks

Error (10820): Netlist error at my_fifo.vhd(112): can't infer register for rd because its behavior depends on the edges of multiple distinct clocks

В принципе могу понатыкивать компонентов с библиотек и посоединять их как нужнов коде, но есть желание разобраться с VHDL - а то как то я его знаю со схематической стороны sad.gif
Что же я не так делаю ? smile3046.gif
--
Имею книженцию <Суворова,Шейнин..> - по ней и выучил азы sad.gif
Самурай
Цитата(Kuzmi4 @ May 15 2008, 20:27) *
Здравствуйте.

Есть такой код:
...

В принципе могу понатыкивать компонентов с библиотек и посоединять их как нужнов коде, но есть желание разобраться с VHDL - а то как то я его знаю со схематической стороны sad.gif
Что же я не так делаю ? smile3046.gif


Боюсь, что даже в принципе у Вас ничего не получитсяsmile.gif))
Есть сомнение, что Вы сможете найти библиотеки триггеров тактируемых двумя клокамиsmile.gif)))
А чего нет, того и на VHDLе не описатьsmile.gif))))
Kuzmi4
Это так сказать квинтэсенция чего хочется получить.

А на счёт не получится - на рассыпухе такая система работает прекрасно smile.gif .
Видимо я как то не так описал чего хочется на VHDL...
Вот и прошу наставить на путь истинный..

И есчё вопрос такой - есть у меня в generic`ах N например, а в коде от него вот так Log2[N] зависит величина. Как правильно это написать ?
vetal
Цитата
А на счёт не получится - на рассыпухе такая система работает прекрасно

В настольном варианте при комнатной температуре и в единственном экземпляре - да. В серийной аппаратуре, во всем диапазоне температур и различных вариациях техпроцесса - нет.

RS триггер вам поможет!
tolik1
Цитата(Kuzmi4 @ May 15 2008, 20:38) *
Это так сказать квинтэсенция чего хочется получить.

А на счёт не получится - на рассыпухе такая система работает прекрасно smile.gif .
Видимо я как то не так описал чего хочется на VHDL...
Вот и прошу наставить на путь истинный..

И есчё вопрос такой - есть у меня в generic`ах N например, а в коде от него вот так Log2[N] зависит величина. Как правильно это написать ?

Я сталкивался с подобными конструкциями. Работаю на ISE 9.2. Похоже что он воспринимает конструкцию if signal'event and signal = bit как некую клоковую и пытается положить signal на клоковые ресурсы. В результате выкручивался используя signal как сигнал разрешения и.т.д
Kuzmi4
2 vetal - я там неправильно описал, привязка идёт по входному клоку - от него и пляшет вся схема..
На счёт "единственного экземпляра" - было 2 штуки, одну сам ЛИЧНО собрал и прозвонил - работала как надо... Там рассыпухи многовато конечно....

Я тут попытался привязать эту всю богодельню к входному клогу(как на расспухе - там генератор - тикает всегда пока есть питалово) как то он его хитро просинтезировал, хотя верещать перестал ерорами - опять наверно как то квинтэссенционно описал. sad.gif
Счас посмотрю - может я опять что-то где то.... smile3046.gif

2 tolik1 - спасибо за идейку, а можно примерчик ?

---
В результате получил вот такой код ( всё пляшет от входного клока ) :
Код
main_process:    process (clock) is
                begin
                ---============                
                ---/////////////////////
                    if (rising_edge(clock)) then
                        --counting and cmp
                            if ( (counted_value) = ("00111111111") ) then--cmp with half
                            half_full <= '1';
                            end if;
                        --counting and cmp
                        
                        --HF dep
                            if ( half_full='1' ) then
                            ---+++
                                rd <= '1';
                                rd_clk <= clock;
                            ---+++
                            end if;
                            if ( signal2foto='1' ) then
                            ---+++
                                rd <= '0';
                                rd_clk <= '0';
                            ---+++
                            end if;
                        --HF dep
                        
                        --
                            if ( rst='1' and start='0' ) then
                            --+++                
                                in_rst_signal <= '1';
                                isr <= '0';    
                                done <= '0';
                                busy <= '0';
                            --+++                
                            end if;
                            if ( start='1' ) then --
                            --+++
                                in_rst_signal <= '0';--return back reset signal to ZERO
                                rst <= '0';
                                busy <= '1';
                            --+++
                            end if;
                        --                    
                        
                        --
                            if (full='1') then
                            --+++
                                start <= '0';
                                done <= '1';
                            --+++
                            end if;
                        --
                        
                        --
                            if (int_enable='1' and full='1' ) then
                                --+++
                                    isr <= '1';
                                --+++
                            end if;
                        --
                                            
                    end if;
                ---/////////////////////                
                ---============
                end process;
                        
--fifo declaration
my_fifo_component    :    dcfifo
    GENERIC MAP (
        intended_device_family => "Cyclone II",
        lpm_hint => "MAXIMIZE_SPEED=7,RAM_BLOCK_TYPE=M4K",
        lpm_numwords => 1024,
        lpm_showahead => "OFF",
        lpm_type => "dcfifo",
        lpm_width => 16,
        lpm_widthu => 10,
        overflow_checking => "ON",
        rdsync_delaypipe => 5,
        underflow_checking => "ON",
        use_eab => "ON",
        --write_aclr_synch => "OFF",
        wrsync_delaypipe => 5
    )
    PORT MAP (
        wrclk => wr_clk,--
        rdreq => rd,--
        aclr => in_rst_signal,--
        rdclk => rd_clk,--
        wrreq => wr,--
        data => indata,--
        rdempty => empty,--
        wrfull => full,--
        q => outdata--
    );
-- counter maping
lpm_counter_component : lpm_counter
    GENERIC MAP (
        lpm_direction => "UP",
        lpm_port_updown => "PORT_UNUSED",
        lpm_type => "LPM_COUNTER",
        lpm_width => 10
    )
    PORT MAP (
        aclr => in_rst_signal,--
        clock => clock,--
        q => counted_value--
    );

В результате получил в RTL`e вроде бы удобоваримую схемку с кучей MUX`ов.
...
Однако опять не то ...... crying.gif
help.gif
rv3dll(lex)
чёта я не пойму как можно один и тот-же сигнал менять под двумя разными ифами - они могут присутствовать отдельно или вместе

писать на vhdl и не знать архитектуры плис не получится
если вы можете нарисовать это схемотехнически на триггере то и компиллятор сможет

hf_dep1: process (half_full,signal2foto) is
begin
if ( half_full'event and half_full='1' ) then --аналогично (rising_edge(half_full)) then
---+++
rd <= '1';
rd_clk <= clock;
---+++
elsif ( signal2foto'event and signal2foto='1' ) then --аналогично (rising_edge(signal2foto)) then
---+++
rd <= '0';
rd_clk <= '0';
---+++
end if;
end process;

c точки зрения языка правильно но работать не будет

hf_dep1: process (half_full,signal2foto,main_clk) is
begin

if ( main_clk'event and main_clk='1' ) then
half_full_sdv <=half_full ;
signal2foto_sdv <=signal2foto ;

if ( half_full='1' and not(half_full_sdv)='1' ) then --аналогично (rising_edge(half_full)) then
---+++
rd <= '1';
rd_clk <= clock;
---+++
elsif (signal2foto='1' and not(signal2foto_sdv)='1') then --аналогично (rising_edge(signal2foto))
---+++
rd <= '0';
rd_clk <= '0';
---+++
end if;
end process;


типа того должно быть
Kuzmi4
2 rv3dll(lex) - а можете объяснить - отчего так ? smile3046.gif
Всмысле зачем нам нужны промежуточные сигналы вида
Цитата
half_full_sdv

и
Цитата
signal2foto_sdv

Заранее спасибо smile.gif
rv3dll(lex)
Цитата(Kuzmi4 @ May 16 2008, 16:54) *
2 rv3dll(lex) - а можете объяснить - отчего так ? smile3046.gif
Всмысле зачем нам нужны промежуточные сигналы вида

и

Заранее спасибо smile.gif



основной смысл перевести внешние сигналы на внутренний более высокий клок мейн_клк -
я думаю что у вас они и так все с ним синхронны

затем сдвигаем их относительно этого клока на 1 такт - получая сдвинутые сигналы - те про которые ваш вопрос

из изначальных и сдвинутых получаем стробы, соответствующие фронтам и по ним уже в соответствии с мейн_клк переключаем триггер.

если чего спрашивайте - может я не до конца понял задачу
Kuzmi4
2 rv3dll(lex) -
Задача в принципе не сложная - у нас есть данные параллельным кодом, который выдаётся с клоком частотой 20-50 МГц (с ацп поступают) . Рабочий цикл с начала - сброс памяти (я выбрал FIFO) и запись до половины. После начинаем дёргать RD/WR - типа читаем-пишем. В этом случае у нас ползущая картика реального времени (с дискретносью клока) получается. Как только приходит сигнал signal2foto (уровень с ДНУ - типа пришёл импульс) - перестаём дрыгать RD и дописываем до конца - в результате получаем N/2 значений до сигнала и N/2 значений после - эдакое фото сигнала.
Вот собсно и всё. smile.gif
В принципе вроде мой пост May 16 2008, 11:06 с кодом вроде описывает именно это... Только не работает блин....wacko.gif

А на счёт 19.05.2008, 07:20

main_clk - это типа наш входной клок ? И почему он более высокий клок ?
На счёт стробов - то тут как бы я понимаю как оно будет работать, не могу понять почему именно такая реализация нужна wacko.gif - зачем сдвигать там и распаралеливать....
smile3046.gif
rv3dll(lex)
Цитата(Kuzmi4 @ May 19 2008, 14:35) *
2 rv3dll(lex) -
Задача в принципе не сложная - у нас есть данные параллельным кодом, который выдаётся с клоком частотой 20-50 МГц (с ацп поступают) . Рабочий цикл с начала - сброс памяти (я выбрал FIFO) и запись до половины. После начинаем дёргать RD/WR - типа читаем-пишем. В этом случае у нас ползущая картика реального времени (с дискретносью клока) получается. Как только приходит сигнал signal2foto (уровень с ДНУ - типа пришёл импульс) - перестаём дрыгать RD и дописываем до конца - в результате получаем N/2 значений до сигнала и N/2 значений после - эдакое фото сигнала.
Вот собсно и всё. smile.gif
В принципе вроде мой пост May 16 2008, 11:06 с кодом вроде описывает именно это... Только не работает блин....wacko.gif

А на счёт 19.05.2008, 07:20

main_clk - это типа наш входной клок ? И почему он более высокий клок ?
На счёт стробов - то тут как бы я понимаю как оно будет работать, не могу понять почему именно такая реализация нужна wacko.gif - зачем сдвигать там и распаралеливать....
smile3046.gif


half_full_sdv зачем

мейн клок это самый высокочастотный клок системы - из него вы полччите короткие импульсы привязанные к фронтам 2х ваших сигналов

при этом происходит примерно тоже что вы пытаетесь 2мя фронтами управлять одним триггером - как бы эмуляция этих 2х фронтов
Kuzmi4
Спасибо, вроде вырисовывается картинка...
На счёт main_clk - я так понял это будет у меня вывод с PLL-ки плисины, которая тактирует её. Только зачем так - тобто зачем я отвязался от clock-а, который собсно и есть дёрижёр в системе которая выдаёт данные...
Kuzmi4
В обсчем написал такой код :
Код
main_process:    process (main_clk) is
                begin
                ---============                
                ---/////////////////////
                    if (main_clk'event and main_clk='1' ) then
                        --
                        --counting and cmp
                            if ( (counted_value) = ("00111111111") ) then--cmp with half
                            half_full <= '1';
                            end if;
                        --counting and cmp
                            
                        -- parallel
                            half_full_sdv <=half_full;
                            signal2foto_sdv <=signal2foto;
                        --
                            if ( half_full='1' and not(half_full_sdv)='1' ) then
                            ---+++
                                rd <= '1';
                                rd_clk <= clock;
                            ---+++
                                elsif (signal2foto='1' and not(signal2foto_sdv)='1') then                            ---+++
                                rd <= '0';
                                rd_clk <= '0';
                            ---+++
                            end if;
                        --
                            
                        --                                        
                    end if;
                ---/////////////////////                
                ---============
                end process;

Вылилось это в такую реализацию в плисине:
Нажмите для просмотра прикрепленного файла
Интересно получилось - я получается разбил и синхронизировал сигналы отностиельно моего main_clk.
Так и остался нераскрытый вопрос - зачем я отвязался от clock-а, который собсно и есть дёрижёр в системе которая выдаёт данные?
help.gif

---
По памяти набросал логику как она была рассыпухе :
Нажмите для просмотра прикрепленного файла
Там есчё процюк дирижировал этим всем , сборос всмысле памяти и сигнал с дну на него заводился (типа если сигнал с дну раньше чем HF выставлялся - то тоже сброс ), но это счас не важно..
rv3dll(lex)
так почему нельзя использовать твой клок для тактирования всей плисины?
Kuzmi4
2 rv3dll(lex) - понимаете - клок что на АЦП и фифо - будет порятка 20-35 МГц, а плисина как раз и ставится , чтоб засунуть внутрь рассупуху , процюк с обработкой данных и выдавать уже обработанные данные наружу, а для того чтоб это всё это в разумных пределах было , хотелось бы и пошустрей внутреннюю обработку сварагнить и передачу тож (USB например)..
Там как бы этот блок в принципе живёт жизнью синхронизированный с клоком на АЦП а потом когда набор данных закончен- уже можно считывать как хочется (меньше/больше скорость).
Я просто не могу понять - почему так сложно это реализовывать на VHDL - на рассыпухе сел, подумал и всё..
Может я куда то не в ту сторону думаю ??
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.