|
|
  |
VHDL - как реализовать такую вещь..., немного не понимаю я тут.. |
|
|
|
May 15 2008, 16:27
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Здравствуйте. Есть такой код: Код 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; Матюкаеться так  : Цитата 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 - а то как то я его знаю со схематической стороны Что же я не так делаю ?  -- Имею книженцию <Суворова,Шейнин..> - по ней и выучил азы
|
|
|
|
|
May 15 2008, 16:36
|
Местный
  
Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066

|
Цитата(Kuzmi4 @ May 15 2008, 20:27)  Здравствуйте. Есть такой код: ... В принципе могу понатыкивать компонентов с библиотек и посоединять их как нужнов коде, но есть желание разобраться с VHDL - а то как то я его знаю со схематической стороны Что же я не так делаю ?  Боюсь, что даже в принципе у Вас ничего не получится  )) Есть сомнение, что Вы сможете найти библиотеки триггеров тактируемых двумя клоками  ))) А чего нет, того и на VHDLе не описать  ))))
|
|
|
|
|
May 15 2008, 16:38
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Это так сказать квинтэсенция чего хочется получить. А на счёт не получится - на рассыпухе такая система работает прекрасно  . Видимо я как то не так описал чего хочется на VHDL... Вот и прошу наставить на путь истинный.. И есчё вопрос такой - есть у меня в generic`ах N например, а в коде от него вот так Log2[N] зависит величина. Как правильно это написать ?
|
|
|
|
|
May 16 2008, 04:47
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 2-03-05
Из: МОСКВА
Пользователь №: 3 016

|
Цитата(Kuzmi4 @ May 15 2008, 20:38)  Это так сказать квинтэсенция чего хочется получить. А на счёт не получится - на рассыпухе такая система работает прекрасно  . Видимо я как то не так описал чего хочется на VHDL... Вот и прошу наставить на путь истинный.. И есчё вопрос такой - есть у меня в generic`ах N например, а в коде от него вот так Log2[N] зависит величина. Как правильно это написать ? Я сталкивался с подобными конструкциями. Работаю на ISE 9.2. Похоже что он воспринимает конструкцию if signal'event and signal = bit как некую клоковую и пытается положить signal на клоковые ресурсы. В результате выкручивался используя signal как сигнал разрешения и.т.д
|
|
|
|
|
May 16 2008, 08:06
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 vetal - я там неправильно описал, привязка идёт по входному клоку - от него и пляшет вся схема.. На счёт "единственного экземпляра" - было 2 штуки, одну сам ЛИЧНО собрал и прозвонил - работала как надо... Там рассыпухи многовато конечно.... Я тут попытался привязать эту всю богодельню к входному клогу(как на расспухе - там генератор - тикает всегда пока есть питалово) как то он его хитро просинтезировал, хотя верещать перестал ерорами - опять наверно как то квинтэссенционно описал. Счас посмотрю - может я опять что-то где то....  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`ов. ... Однако опять не то ......
|
|
|
|
|
May 16 2008, 12:54
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 rv3dll(lex) - а можете объяснить - отчего так ? Всмысле зачем нам нужны промежуточные сигналы вида Цитата half_full_sdv и Цитата signal2foto_sdv Заранее спасибо
|
|
|
|
|
May 19 2008, 04:20
|

Полное ничтожество
    
Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354

|
Цитата(Kuzmi4 @ May 16 2008, 16:54)  2 rv3dll(lex) - а можете объяснить - отчего так ? Всмысле зачем нам нужны промежуточные сигналы вида и Заранее спасибо  основной смысл перевести внешние сигналы на внутренний более высокий клок мейн_клк - я думаю что у вас они и так все с ним синхронны затем сдвигаем их относительно этого клока на 1 такт - получая сдвинутые сигналы - те про которые ваш вопрос из изначальных и сдвинутых получаем стробы, соответствующие фронтам и по ним уже в соответствии с мейн_клк переключаем триггер. если чего спрашивайте - может я не до конца понял задачу
|
|
|
|
|
May 19 2008, 10:35
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

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

Полное ничтожество
    
Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354

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

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
В обсчем написал такой код : Код 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-а, который собсно и есть дёрижёр в системе которая выдаёт данные?  --- По памяти набросал логику как она была рассыпухе :
Там есчё процюк дирижировал этим всем , сборос всмысле памяти и сигнал с дну на него заводился (типа если сигнал с дну раньше чем HF выставлялся - то тоже сброс ), но это счас не важно..
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|