Jump to content

    

Проблема преобразователя частоты на Verilog для кита Altera DE1

Здравствуйте. Надеюсь на помощь на данном форуме. Пришел сюда с Хабра, там в комментариях говорят, что все профи "обитают" здесь.

 

Прошу сильно не издеваться, если скажу что-то глупо или некорректно. Я далек от электроники и близок к программированию.

 

Передо мной поставлена задача запустить устройство. На нем стоит тактовый генератор 50 MHz из него надо сделать 1 MHz, путем программирования ПЛИС, так как ЦАП'ы не могут работать на таком быстром клоке.

 

Решил сперва реализовать эту задачу на ките Altera DE1 (c Altera Cyclone II на борту), чтобы проверить работоспособность.

 

Так как делать это в схематике наверное трудно, я почитал обучалки по Verilog'у и написал следующий код преобразователя частоты из 50 MHz в 1 MHz.

 

// Преобразует входной клок 50 MHz в выходной клок 1 MHz
module clock_50_to_1
    (
        input wire clk_50,
        output reg clk_1
    );

reg [5:0] counter;

initial
    begin
        counter<=0;
        clk_1<=0;
    end
    
always@(clk_50)
    begin
        if(counter<50)
            begin
                counter<=counter+1;
            end
        else if(counter==50)
            begin
                counter<=1;
            end    
    
        if(counter==49)
            begin
                clk_1 <= ~clk_1;
            end    
    end
endmodule

 

Прежде чем прошивать кит Altera DE1, подумал что надо просимулировать функционально. Искал что-нибудь бесплатное, нашел Icarus Verilog. Просимулировал в нем, вроде все работает как задумано.

 

post-77046-1370200804_thumb.jpg

 

Сначала решил просто проверить работу тактового генератора и вывел его через ПЛИС напрямую и проверил осциллографом - все нормально:

 

post-77046-1370200775_thumb.jpg

 

Потом решил проверить осциллографом мой преобразователь на Verilog'е.

 

Вывел на два пина IDC разъема кита Altera DE1:

1) на один пин [GPIO_1[1]] вывел клок 50 Mhz напрямую,

2) на другой пин [GPIO_1[3]] вывел клок 50 Mhz через мой преобразователь на Verilog'е.

 

post-77046-1370200797_thumb.jpg

 

В итоге на втором выводе, после моего модуля на Verilog'e сначала какая-то "каша" вместо клока 1 MHz, а через несколько секунд вообще никакого сигнала.

 

Очень хочу разобраться в этом вопросе. Все мои коллеги далеки от программирования и всю жизнь работают с ПЛИС через схематик. Они говорят, что твое программирование - лажа, нафиг Verilog/VHDL, проблемы в твоем коде, надо всегда делать через схематик.

 

Буду благодарен всем за помощь. Заранее спасибо.

Share this post


Link to post
Share on other sites

Делитель на щупе установлен в положение 1:10?

Подобные сигналы лучше высматривать с делителем, установив шкалу 0,1-0,5 В/деление.

Насчет нижней картинки (2), там скорее всего срывается синхронизация. Лучше всего покрутить ручку "Level" или нечто подобное (Trigger) и добиться устойчивого отображения сигнала на экране.

Share this post


Link to post
Share on other sites
Очень хочу разобраться в этом вопросе. Все мои коллеги далеки от программирования и всю жизнь работают с ПЛИС через схематик. Они говорят, что твое программирование - лажа, нафиг Verilog/VHDL, проблемы в твоем коде, надо всегда делать через схематик.

Это кому как нравится и кто к чему привык. Я схематик сейчас вообще не использую.

 

Задачу вашу можно решить используя встроенную PLL, особенно если Вам понадобятся и другие клоки.

 

Если хотите все же делать делитель, то код Ваш мягко говоря не совсем правильный.

Делитель у Вас нарисован на 100, а не на 50.

Добавьте reset (чтобы избежать неопределенных состояний при включении),

posedge (negedge) в always,

counter должен считать от 0 до 49 (это более правильно с точки зрения реализации).

Ну и главный вопрос: вам на выходе меандр нужен или импульсы длительностью 20ns и периодом 1ms?

Совет: поищите для примера готовые реализации счетчиков и делителей, сразу все станет понятно.

Share this post


Link to post
Share on other sites

1 Приложил (заодно вопрос к гуру, может есть что некорректное)

2 C помощью PLL

3 Попросите коллег реализовать на схематике, поймите идею, реализуйте ее в языке:)

 

Удачи!

 

P.S.: Преобразователь частоты немного не то. Правильнее говорить о делителе частоты.

divN.v

Share this post


Link to post
Share on other sites

2 centner56

always@(clk_50)

смените на

always@(posedge clk_50)

в вашей целевой плисине нет тригеров работающих на обоих фронтах

Share this post


Link to post
Share on other sites

Огромное спасибо всем кто откликнулся.

 

2 Kuzmi4: Спасибо - Ваш ответ помог. Как только я поменял

always@(clk_50)

на

always@(posedge clk_50)

Все заработало.

 

Но теперь я столкнулся с еще более непонятной для меня проблемой:

 

С пинов ПЛИС я вывожу на пины IDC разъема, чтобы посмотреть осциллографом. Если я задействую больше одного пина для вывода на IDC разъем, то все пины при просмотре осциллографом молчат.

 

Одним словом нимогу выводить больше чем на один пин. А для отладки устройства мне надо смотреть на пинах IDC разъема неизмененный клок от тактового генератора 50 MHz, клок из моего делителя частоты на Veriloge (1 MHz), плюс еще пару клоков от другого устройства, которые приходят ко мне в ПЛИС.

 

А я не могу смотреть больше одного пина. Если что-то вывожу скажем на два пина - то оба пина молчат. Причем это и на ките Altera DE1 и на целевом устройстве.

 

Подробную картинку прилагаю.

 

post-77046-1370410885_thumb.jpg

 

Мои коллеги с удивленными глазами смотрят и тоже ничего не понимают. Возможно это какие-то подводные камни при использовании ПЛИС и клоков. Делал PLL делитель частоты через мегафункцию - работает при использовании одного пина. Вывожу его на два и более пинов - не работает ничего.

 

Благодарен за любую помощь.

Edited by centner56

Share this post


Link to post
Share on other sites

2 centner56

QAR в студию, телепаты в отпуске

Share this post


Link to post
Share on other sites

Сделайте вставку в линию, идущему к одному из выводов, в виде примитива WIRE...

Share this post


Link to post
Share on other sites

2 Kuzmi4:

QAR в студию, телепаты в отпуске

QAR'ы на все случаи в скриншоте приложил.

 

2 EvgenyNik:

Сделайте вставку в линию, идущему к одному из выводов, в виде примитива WIRE...

Сделал - не помогло (случай D на скриншоте и его qar тоже прилагается).

 

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

Сделал как - вывел на IDC 1 - 1 пин, на IDC 2 - 2 пина.

 

В итоге там где два пина (IDC 2) - не работает.

 

На скриншоте все подробно показано.

 

post-77046-1370773701_thumb.jpg

 

QAR файлы на все 4 случая скриншота прилагаю.

 

cases_from_screenshot.zip

 

Версия Qartus II 13.0 Web Edition свежевыкаченный.

 

PS. Делал все тоже самое, что на скриншоте, но вместо моего модуля делителя частоты, использовал мегафункцию PLL делитель частоты. Все тоже - не могу задействовать более одного пина на IDC разъем, а иначе не работает.

 

Заранее всем спасибо за любую помощь.

Share this post


Link to post
Share on other sites

Спасибо всем - кто помогал.

 

Наконец-то я разобрался с решением этой проблемы. Дело оказалось в проблемах правил наименования в среде Quartus II при использовании схематика, а не в IDC разъемах.

 

Я все подробно описал в статье, чтобы те, кто будут искать решение аналогичной проблемы, решили ее.

 

Кому интересно, прилагаю ссылку на статью:

Решение проблем, связанных с правилами наименования в Quartus II при использовании Schematic

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this