Jump to content

    

Как сделать лабораторную на FPGA XC7A15T ?

Добрый вечер. Вопрос по проекту в рамках курса схемотехники. Есть две отладочные платы FPGA XC7A15T, соединены двумя проводами: синим и красным. На одной плате запущено нечто, что генерирует сигналы по которым вторая плата (с таймером) понимает что первая соединена с ней двумя проводами. Если обрыв красного провода, то остановка таймера, если синего то "взрыв" (звуковой сигнал), если таймер заканчивает отсчёт то "взрыв" Собственно проблема с реализацией таймер. Как я полагаю это должен быть счётчик числа импульсов делать, подсчитывающий количество импульсов от тактового генератора. Но как начать неясно совсем. Мой актуальный уровень знаний и умений, это программирование с помощью языка SystemVerilog простейших логических схем. На всякий случай прикрепляю материалы своего курса

Отладочная плата на основе FPGA XC7A15T.pdf

Лабораторная работа номер один этой мой уровень знаний и умений, со второй пока не справился. Самих микросхем у меня на руках нет, они доступны мне только на учебных парах. В списке рекомендованной нам литературы фигурирует книга "Цифровая схемотехника и архитектура компьютера" Второе издание

Пререквизит к лабораторным работам - установка Vivado.pdf

Лабораторная работа №1 – комбинационная логика.pdf

Share this post


Link to post
Share on other sites

Обычный цикл как в программировании ведь не подойдёт. Так как генератор имульсов это миллионы сигналов в секунды, а таймер должен работать хотя бы несколько десятков секунд. Это значит миллионы знаков < или > в коде, а как мне стало известно на одной из лекций всего один такой знак это "стена" кода. Я прав?

Share this post


Link to post
Share on other sites

Приветствую!

52 minutes ago, SpiderHulk said:

Обычный цикл как в программировании ведь не подойдёт. Так как генератор имульсов это миллионы сигналов в секунды, а таймер должен работать хотя бы несколько десятков секунд. Это значит миллионы знаков < или > в коде, а как мне стало известно на одной из лекций всего один такой знак это "стена" кода. Я прав?

Скорее всего не правы. 

Событие запуска таймера может быт разным  например  длительное отсутствие импульсов на обеих проводах. 

Ну и намек - таймеров может быть не один.

Начнем с аналогии -  Опишите как бы вы это в программе делали?  Что такое таймер (что он делает) ?  И какой элемент в FPGA можно сделать который будет выполнять туже функцию? 

Удачи! Rob. 

Share this post


Link to post
Share on other sites

На счёт бомбы не понял. 
А на счёт таймера обычно делают так:
 

Каждый новый такт увеличивают значение переменной на 1.
После увеличения проверяют не равно ли новое значение тому на котором нужно остановиться или что-то сдалать.


Само собой счётчик вниз делается точно так же только вначале мы загружаем в переменную некое число, а вместо сложения мы вычитаем единицу. И соответственно сравниваем с нулём.

Share this post


Link to post
Share on other sites
7 минут назад, MegaVolt сказал:

Каждый новый такт увеличивают значение переменной на 1.
После увеличения проверяют не равно ли новое значение тому на котором нужно остановиться или что-то сдалать

Вот можно ли так делать если предполагаемых сравнений очень много? Это ведь не программирование, а некая логическая схема должна получиться. Например вот подобный цикл можно реализовывать на верилоге? (здесь использую синтаксис си) 

int i=0;

while(i<10000000) {

i=i+1;

}

Share this post


Link to post
Share on other sites
15 минут назад, RobFPGA сказал:

Опишите как бы вы это в программе делали?

Самое простое что мне приходит в голову это взять генератор 12 мегагерц и как то считать количество импульсов поступивших от этого генератора, сравнивая с заданным, пока оно не будет достигнуто, дальше сигнал на подрыв. Но правомерен такой подход если это заданное число скажем 1.200.000.000 и надо будет сделать столько же сравнений? Какая в итоге вообще логическая схема сформируется? 

Share this post


Link to post
Share on other sites

Приветствую!

9 minutes ago, SpiderHulk said:

 Но правомерен такой подход если это заданное число скажем 1.200.000.000 и надо будет сделать столько же сравнений? Какая в итоге вообще логическая схема сформируется? 

Вы в программе делаете миллионы отдельных IF для сравнения  или сравнивает меняющиеся значения на выходе счетчика с константой ? 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Такое название теме давать может только провокатор или дурак.

Share this post


Link to post
Share on other sites

module timer(
    input clock,
    //input inp01,
    //input inp02,
    output out01
    );
    (* dont_touch = "true" *)reg [28:0] cont = 0;
    (* dont_touch = "true" *)reg [28:0] cont_max = 28'd120000000;
    
    always @(posedge clock) 
    begin 
        while (cont < cont_max)
        begin 
            cont=cont+1'd1;
        end
    end
    assign out01=1;
endmodule

Я ожидаю, что данный код будет работать следующим образом: в момент подключения микросхемы к персональному компьютеру по USB запустится таймер на 10 секунд (clock соединён с генератором 12 МГц. По истечении 10 секунд переменной out01 будет присвоена 1, а так как 01 это лампочка, то она загорится. Я прав в своих ожиданиях?

Share this post


Link to post
Share on other sites

При переходе к Open Elaborated Design на экран были выведены следующие сообщения об ошибках:

 [Synth 8-3380] loop condition does not converge after 2000 iterations [H:/verilog/timer/timer.srcs/sources_1/new/timer.sv:34]
 [Synth 8-6156] failed synthesizing module 'timer' [H:/verilog/timer/timer.srcs/sources_1/new/timer.sv:23]
 [Vivado_Tcl 4-5] Elaboration failed - please see the console for details
 

Вот как раз первое сообщение. Это не то самое о чём я ранее высказывал беспокойство? Что цикл не может иметь слишком много витков? Если я правильно понял данное сообщение, то согласно ему витков цикла должно быть не более двух тысяч

 

Апдейт: хотя возможно я просто неправильно цикл написал, с невыполнимым условием выхода из цикла

Edited by SpiderHulk

Share this post


Link to post
Share on other sites
11 hours ago, ViKo said:

Такое название теме давать может только провокатор или дурак.

Делать какие-то выводы, прочитав два слова из полусотни - тоже признак... не очень умного человека.

Share this post


Link to post
Share on other sites
45 минут назад, esaulenka сказал:

Делать какие-то выводы, прочитав два слова из полусотни - тоже признак... не очень умного человека.

Мне заголовка хватило. И внешним органам - тоже. И даже не два слова, а одно. 

Или вы не видели первоначального заголовка темы? 

По содержимому пробежался по диагонали. Унылое... 

Share this post


Link to post
Share on other sites

А если по сути... 

Стартовать отсчет времени устройство может или при включении, или от срабатыаания датчика, кнопки. 

Считать можно и нужно секундные импульсы, или десятые доли секунд, сотые для крутизны игрушки. Но никак не 12 МГц-овые. Тактовый генератор нужно поделить. 

Отсчет должен быть обратным. Загружаться 60-ю. И сравниваться с нулем. А сраанение с нулем  - обычныц жлемент ИЛИ.

Share this post


Link to post
Share on other sites
29 minutes ago, ViKo said:

И внешним органам - тоже.

Кстати, да! Учитывая время, в которое живём, лучше не провоцировать.

Share this post


Link to post
Share on other sites
1 час назад, esaulenka сказал:

Делать какие-то выводы, прочитав два слова из полусотни

Тов.майору на ещё одну звёздочку хватит.

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