На главную страницу сайта
· Наш магазин · Объявления · Рейтинг · Статьи · Частоты · Копилка · Аэродромы · Live!
· Файлы · Диапазоны · Сигналы · Музей · Mods · LPD-форум · Клуб · Радиостанции
На сайте: гостей - 51,
участников - 1 [ shoob2]
 · Начало · Опросы · События · Статистика · Поиск · Регистрация · Правила · FAQ · Галерея ·
 Форум —› Программное обеспечение —› Altera Quartus VERILOG 
Широкополосные связные радиоприемники в нашем магазине


Icom IC-R6
руб.

Yaesu VR-120D
руб.

Icom IC-R75
руб.

Yaesu VR-160
руб.

Icom IC-R20
руб.
 Страница:  1  2  3  4  5  »»Поиск в теме
Автор Сообщение
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 05 Дек 2011 02:51:56 · Поправил: RadioKoteg (05 Дек 2011 03:04:23) #  

Здравствуйте!
Появилась у меня отладочная плата Altera DE2 FPGA Cyclone II. Вот фото отладочно-учебной платки http://doris.kiev.ua/RS/UKV_001/FOTO_003/PB160163.JPG

в общем я решил ее использовать как контроллер к моей самоделки с темы Я строю УКВ радио - Страница 10 вот вид как оно примерно будет http://doris.kiev.ua/RS/UKV_001/AlteraDE3/KEY/PB260197.JPG ,уже часть работает, вот тут http://doris.kiev.ua/RS/UKV_001/AlteraDE3/
исходники (не смейтесь и не ругайтесь, я учусь и время прошло пару месяцев как я занялся этим).

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

Сейчас возник вопрос с перезаписью переменных:

В первом случае работает:

reg [32:0] MHz;
reg [32:0] Freq;

if (KeySTR == ".")
begin
Freq<=1234567890;
end
assign LEDR[16:0]= Freq;


В этом случае:


reg [32:0] MHz;
reg [32:0] Freq;

if (KeySTR == ".")
begin
MHz<=1234567890;
Freq<=MHz;
end
assign LEDR[16:0]= Freq;


при первом нажатии на клавишу в Freq ноли, при втором нажатии 1234567890.
Что происходит хз, почти все ламинатное покрытие с мозгов сползло. Почему одна переменная не переписывается в другую?

Спасибо за ответы. Да и вообще буду рад знать что есть радио конструкторы которые делают что либо на FPGA ALTERA , даже такие которые строят всякие луноходы вездеходы и лабораторные работы..
horizon
Участник
Offline3.3
с мар 2006
Сообщений: 431

Дата: 05 Дек 2011 03:07:14 · Поправил: horizon (05 Дек 2011 03:11:49) #  

Всё правильно работает так как написано, то есть совсем неправильно. Проблема в том,что Вы пытаетесь использовать регистр MHz до того, как данные в нём стабилизировались. Вам нужно или сделать wire из Freq и соединить с MHz или же использовать конструкт always @(MHz) и в нём делать Freq<= MHz;.

Имхо проще задачу решить на C, даже если микроконтроллер будет реализован в ПЛИС. Посмотрите OpenRISC на opencores.org
Реклама
Google
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 05 Дек 2011 06:45:05 #  

horizon Спасибо за ответ, образно начинаю понимать что происходит. Видно ламинату у меня еще на мозгах валом, есть что растапливать.
petr0v
Участник
Offline2.3
с мая 2010
Balakhna
Сообщений: 412

Дата: 05 Дек 2011 10:12:56 #  

horizon

Имхо проще задачу решить на C, даже если микроконтроллер будет реализован в ПЛИС.


Не согласен.


RadioKoteg

У вас ведь есть представление как на логике средней степени интеграции схемы собирать? Вот и на VHDL, Verilog почти так же. Нужно только освоить правильный стиль описания. Каким образом правильно описывать регистры, комбинационные схемы, синхронный дизайн и т. п.

Гляньте например http://www.actel.com/documents/hdlcode_ug.pdf. У Альтеры аналогичные есть.

Обязательно нужно освоить конечные автоматы.

Обращатесь на электроникс
http://electronix.ru/forum/index.php?showforum=75
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 05 Дек 2011 16:34:04 #  

Всё правильно работает так как написано, то есть совсем неправильно. Проблема в том,что Вы пытаетесь использовать регистр MHz до того, как данные в нём стабилизировались. Вкурил. Значит нужно каждый раз при таких присвоениях подождать, в общем делай какой то или таймер. Попробую, может получиться.
horizon
Участник
Offline3.3
с мар 2006
Сообщений: 431

Дата: 05 Дек 2011 21:44:50 #  

petr0v

Я упустил контекст. Имел в виду управление радиоприёмником в целом, а не эту изолированную задачу.

RadioKoteg

Держите нас в курсе.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 06 Дек 2011 03:52:35 #  

horizon

Freq<=12345; // Присвоение без ожидания заполнения
Freq=12345; // Присвоение с ожиданием заполнения

Есть неприятный эффект, в Quartus компилироваться стало в 5 раз дольше :-(
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 06 Дек 2011 04:43:32 · Поправил: RadioKoteg (06 Дек 2011 04:55:57) #  

в общем вышло так:

Freq=F_1*10; //Присваиваем первую цифру и двигаем на 10 влево
Freq=Freq+F_2;//Присваиваем к тому что есть вторую цифр
Freq=Freq*10; // Сдвигаем на 10 влево
Freq=Freq+F_3;//Присваиваем третью цифру

Это тестовый фрагмент склейки трех раздельно введенных цифр F_1 сотни, F_2 десятки , F_3 единицы. Ну дальше должно пойти очень быстро. Как бы сказать все это идет подготовка к управлению DDS AD99xx который еще спаять надо.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 06 Дек 2011 05:00:59 · Поправил: RadioKoteg (06 Дек 2011 05:05:37) #  

Фрагмент статьи "Verilog как образ жизни":

Что есть HDL?

Представь себе механизм, имеющий какую-либо связь с внешним миром. Как только снаружи приходит сигнал (нажали кнопку на пульте управления), внутри механизма что-то срабатывает, и им совершается действие (например, загорается лампочка). Для удобного описания всяких механизмов и причинно-следственных связей и были придуманы HDL-языки.

Совсем необязательно HDL описывает микросхему или ПЛИС. На нем, по сути, можно накодить, что угодно – скажем, устройство, которое никогда не будет реализовано в принципе. Или старый ламповый телевизор. Или маятниковые часы. Даже запаянную с двух сторон металлическую кружку можно так или иначе описать на HDL, потому как она железная (hardware) и ты ее можешь потрогать :). Все, что можно представить блок-схемой, пишется запросто.

Главная сложность, с которой сталкивается программист, начинающий писать на HDL, – ему необходимо осознать, что весь код будет в итоге исполняться одновременно. Как шестеренки в часах вращаются синхронно по событию маятника, так и операции внутри процессора выполняются сразу же, параллельно, успевая до наступления следующего такта!

Грубо говоря, в этом и есть отличие алгоритмических языков типа С или Pascal от HDL-подобных. Если первые «указывают» некоторому абстрактному роботу-исполнителю последовательность действий, то вторые описывают внутренности самого «исполнителя», поведение которого будет зависеть от этих самых внутренностей.

Зачем же описывать эти внутренности, спросишь ты, когда можно описать поведение? Отвечаю. Допустим, цель жизни какого-нибудь робота - перевозить поддоны с печеньками из печки в упаковочный цех. Естественно, приделывать к нему манипуляторы, например, для перевозки бутылок лимонада, смысла особого нет. А твой Intel Core, в который ты загружаешь свежескомпиленную сишную прогу, как раз и является мегауниверсальным роботом, который может делать абсолютно все. Не всегда и не для всех задач нужен такой монстр. Тогда ты берешь HDL и пишешь свой проц, который почти ничего не умеет, но то, что умеет – делает быстро, эффективно и без потребления сотен ватт мощности!
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 06 Дек 2011 08:11:33 #  

Вот кусок кода ввода частоты:

if ((_Dot == 1)&&(MHzKHzHz==1)) //MHz
begin
if (F_1!=0) //Первая левая не ноль
begin
_Freq=F_1*10; //Присваиваем первую цифру и двигаем на 10 влево
_Freq=_Freq+F_2;//Присваиваем к тому что есть вторую цифр
_Freq=_Freq*10; // Сдвигаем на 10 влево
_Freq=_Freq+F_3;//Присваиваем третью цифру
_Freq=_Freq*1000000;
Freq=_Freq;
F_1=0;
F_2=0;
F_3=0;
F_i=1;
MHzKHzHz=2;
_Dot=0;
end
end


if ((_Dot == 1)&&(MHzKHzHz==2)) //KHz
begin

_Freq=_Freq/100000;
_Freq=_Freq+F_1;
_Freq=_Freq*10;
_Freq=_Freq+F_2;
_Freq=_Freq*10;
_Freq=_Freq+F_3;
_Freq=_Freq*1000;
Freq=_Freq;
F_1=0;
F_2=0;
F_3=0;
F_i=1;
MHzKHzHz=3;
_Dot=0;
end

if ((_Dot == 1)&&(MHzKHzHz==3)) //Hz
begin
_Freq=_Freq/100;
_Freq=_Freq+F_1;
_Freq=_Freq*10;
_Freq=_Freq+F_2;
_Freq=_Freq*10;
_Freq=_Freq+F_3;
Freq=_Freq;

F_1=0;
F_2=0;
F_3=0;
F_i=1;
MHzKHzHz=1;
_Dot=0;
end


В первом приближении работает, возможны мелкие не стыковки..

Здесь весь проект http://doris.kiev.ua/RS/UKV_001/AlteraDE3/MY_UKV_029.RAR
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 05:16:51 #  

Есть число 123 456 789 где:
123 MHz
456 KHz
789 Hz

как разложить число на Hz и kHz?
С числом MHz все понятно MHz=Freq/1000000;
DVE
Участник
Offline3.8
с ноя 2006
EU
Сообщений: 5098

Дата: 07 Дек 2011 11:47:29 · Поправил: DVE (07 Дек 2011 11:56:09) #  

В С есть оператор % - остаток от деления, как тут не знаю, наверно тоже должен быть.

PS: Плата ценой в 300$ с процом 200МГц и 8МБайт памяти для опроса клавиатуры, это сильно как бы :) Или туда потом планируется и декодеры встроить?
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 12:24:48 #  

Плата ценой в 300$ с процом 200МГц и 8МБайт памяти для опроса клавиатуры, это сильно как бы :) 495$. "Проца" там нет есть быстрая ПЛИС с тактами 50 и 27 МГц и своим внешним.
Или туда потом планируется и декодеры встроить? а кто их напишет?
Планируется "рекордер на SD карточку" там же звукоуха на борту 96 кГц, планируется удаленный доступ, планируется сверхбыстрый скан, скриптовый язык по скану.. Есть там пал секам оцифровщик можно вывести его на экранчик. Напишите NICAM? Напишете Тетру? Напишите APCO ? Напишете декодеры я с удовольствием волью туда, там 16 МБ памяти и хз сколько SD памяти, да хоть жесткий диск туда..
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 12:32:39 #  

Разложение где то так, так как то:

MHz=Freq/1000000;

_Freq=Freq/1000; //kHz
_Freq=_Freq*1000;
kHz=_Freq-MHz/1000;

_Freq=Freq/1000;
_Freq=Freq*1000;
Hz=Freq-_Freq;

Переменные без запятой работают то остатки сами сносятся.

собрать где то около такого:

Freq= (((MHz*1000)+kHz)*1000)+Hz;


Возможны ошибки и глюки, еще не проверил в полной мере так как не вывел на LCD двухстрочник. Надо уже и им заняться, а то отладка не в полной мере видна. Да и вобщем плохо что мысли бежат далеко впереди а я только начинаю "вдупляться" в Alltera FPGA.
DVE
Участник
Offline3.8
с ноя 2006
EU
Сообщений: 5098

Дата: 07 Дек 2011 12:36:07 #  

kHz=(Freq % 1000000)/1000; - не работает разве? имхо короче выходит.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 12:53:40 #  

DVE отладку сделаю куда выводить частоту тогда только проверю.
petr0v
Участник
Offline2.3
с мая 2010
Balakhna
Сообщений: 412

Дата: 07 Дек 2011 16:07:54 #  

RadioKoteg

На HDL так не пишут. HDL это не программирование, а описание цифровых схем. Никаких умножений и делений без нужды применять не нужно, всё это выливается в монструозные комбинационные схемы. Вам нужно работать с десятичными цифрами в BCD формате, каждая цифра представляется 4-х битным двоичным числом. Например шина с кодом клавиши управляет мультиплексором, который подключает нужную цифру ко входу сдвигового регистра шириной 4 бита, по вводу очередной цифры они продвигаются в нужную позицию. Потом уже можно простым алгоритмом перевести слово из BCD цифр в бинарное слово кода частоты DDS. Описание должно выглядеть в виде схемы содержащей регистры, счётчики, мультиплексоры и т. п., которыми которыми управляют конечные автоматы. Не забывайте избавляться от дребезга контактов кнопок.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 16:53:56 · Поправил: RadioKoteg (07 Дек 2011 17:01:02) #  

petr0v

Все верно, я с вами согласен на все 100%. Но в этой железке столько ресурсов что я программирую а оно пусть себе схемы описывает(шутка).. Я от деления избавлюсь обязательно по средству SHL SHR и BCD.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 17:34:22 · Поправил: RadioKoteg (07 Дек 2011 17:53:51) #  

Binary to BCD Converter

module add3(in,out);
input [3:0] in;
output [3:0] out;
reg [3:0] out;
always @ (in)
case (in)
4'b0000: out <= 4'b0000;
4'b0001: out <= 4'b0001;
4'b0010: out <= 4'b0010;
4'b0011: out <= 4'b0011;
4'b0100: out <= 4'b0100;
4'b0101: out <= 4'b1000;
4'b0110: out <= 4'b1001;
4'b0111: out <= 4'b1010;
4'b1000: out <= 4'b1011;
4'b1001: out <= 4'b1100;
default: out <= 4'b0000;
endcase
endmodule



module binary_to_BCD(A,ONES,TENS,HUNDREDS);
input [7:0] A;
output [3:0] ONES, TENS;
output [1:0] HUNDREDS;
wire [3:0] c1,c2,c3,c4,c5,c6,c7;
wire [3:0] d1,d2,d3,d4,d5,d6,d7;
assign d1 = {1'b0,A[7:5]};
assign d2 = {c1[2:0],A[4]};
assign d3 = {c2[2:0],A[3]};
assign d4 = {c3[2:0],A[2]};
assign d5 = {c4[2:0],A[1]};
assign d6 = {1'b0,c1[3],c2[3],c3[3]};
assign d7 = {c6[2:0],c4[3]};
add3 m1(d1,c1);
add3 m2(d2,c2);
add3 m3(d3,c3);
add3 m4(d4,c4);
add3 m5(d5,c5);
add3 m6(d6,c6);
add3 m7(d7,c7);
assign ONES = {c5[2:0],A[0]};
assign TENS = {c7[2:0],c5[3]};
assign HUNDREDS = {c6[3],c7[3]};



http://doris.kiev.ua/RS/Altera/Binary_to_BCD_Converter.pdf
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 07 Дек 2011 18:27:50 #  

Binary to BCD Converter это для 8 бит, а я чтото не пойму как для 32 бит. Подскажите пожалуйста.
petr0v
Участник
Offline2.3
с мая 2010
Balakhna
Сообщений: 412

Дата: 07 Дек 2011 22:16:31 #  

Посмотрите в этой презентации, там для 16 бит есть, одна и та же 4-х входовая комбинационная схема применяется, только дерево больше, думаю для 32 бит можно по аналогии построить.


http://www.cse.secs.oakland.edu/haskell/CSE378/Lectures/Winter2006/D4.5%20Binary2BCD.ppt
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 08 Дек 2011 01:41:01 #  

Никаких умножений и делений без нужды применять не нужно Собственно оно не строит немереных в монструозные комбинационные схемы длинных цепей а использует "LPM_DIVIDE Parameterized Megafunction" . Понимаю что нужно избегать такого, очень понимаю, но смотрю на 32 битное преобразование в BCD и обратно в количестве кодо часов то легче так оставить, а исправить все это только когда опыта будет надлежащим образом достаточно.
petr0v
Участник
Offline2.3
с мая 2010
Balakhna
Сообщений: 412

Дата: 08 Дек 2011 13:26:27 #  

LPM_DIVIDE Parameterized Megafunction - это и есть комбинационная схема делителя, даже если требуется деление его стараются не использовать. Опыт он и набирается на таких простеньких задачках. К сожалению VHDL/Verilog позволяют написать одно и то же множеством способов и не все они жизнеспособны в реальном железе, другого пути нет кроме как освоить правильный стиль описания.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 08 Дек 2011 16:17:50 #  

petr0v
Такой способ подобного деления и присвоение с проверкой сожрали в момент 4 процента ресурсов FPGA. Весь в раздумьях.
DeNishe
Участник
Offline1.1
с фев 2005
Украина
Сообщений: 48

Дата: 08 Дек 2011 18:03:35 #  

Кстати, умножить на 10 быстрее, если умножить на 8(сдвиг на 3 разряда влево)+прибавить умноженное на 2(сдвинутое на 1 разряд влево).
Итого: 2 сдвига, 1-но сложение.

А BCD удобнее, что хранится в человековаримом формате. Если необходим вывод куда-то - только сдвиг и дешифрация, делить не нужно.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 09 Дек 2011 03:20:21 · Поправил: RadioKoteg (09 Дек 2011 03:23:20) #  

самокритика:
500 баксов на кнопочки, и на 16 банков "квик памяти", и лет пять заключения в тюрьме "Quartus" в блоке "Verilog" в камере "Altera" на койке "Cyclone II"..
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 10 Дек 2011 10:38:44 #  

Освоил 16x2 LCD module (HD44780 controller).

Вот проект работающего модуля: http://doris.kiev.ua/RS/UKV_001/AlteraDE3/MY_LCD_003.RAR
Влеплю модуль в основной проект после окончательной наладки скорости обновления.

А по поводу частоты я ее разбил на три десяти битовые переменные MHz kHz Hz, и теперь не надо никакого деления, потом перед засылкой в синтезатор DDS я слеплю из трех переменных удобное слово для DDS.
spectr
Участник
Offline1.1
с ноя 2004
Moscow
Сообщений: 40

Дата: 13 Дек 2011 16:49:28 #  

Имхо, для Ваших задач наиболее кошерным будет соорудить SOPC-систему с NIOS-процессором на борту. Сможете писать управляющий софт на простом и понятном Вам языке Си. Потребуется время и терпение, но результат себя оправдает. Вы все равно к этому придете в любом случае, поскольку планируете использовать сетевые фичи (Ethernet), вывод на внешний дисплей и т.п., а там уже наиболее быстро и просто поднять все как раз под Ниосом.

Вливайтесь в соответствующий подфорум на electronix.ru, изучайте Альтеровские доки и Design Examples. Думаю, что по детальному анализу разработки под ПЛИС здесь (на радиосканнере) не особо помогут. Тут удобнее какие-то концептуальные вещи обсуждать.

P.S.: Verilog, Quartus, Altera и FPGA в целом - это вовсе не слова приговора и тюрьма, а потрясающе интересная и наукоемкая отрасль в разработке современных цифровых, высокопроизводительных и гибких систем.
spectr
Участник
Offline1.1
с ноя 2004
Moscow
Сообщений: 40

Дата: 13 Дек 2011 17:03:10 #  

Но в этой железке столько ресурсов что я программирую а оно пусть себе схемы описывает(шутка)..

Это принципиально неверный подход к разработке под ПЛИС. Когда у вас будет большая и сложная система, вы упретесь в проблемы, связанные с "разводкой ПЛИС" и времянками.

Когда пишете на языках HDL, забудьте о __программировании__. Вы пишете не программу, Вы описываете схему - триггеры, комбинаторную логику, регистры, памяти и т.п. Соответственно, когда что-то пишете на HDL лучше представлять себе эту логическую схему либо в голове, либо иметь ее заранее разрисованной на бумажке. Еще раз - на HDL вы не программируете, на HDL вы описываете логическую схему.

Пример из жизни: блок перестройки внешнего ФАПЧа. Значения частот для блока перестройки задавались в Герцах, он их пересчитывал в целочисленные коэффициенты для делителей ФАПЧа. Так вот, формула пересчета была очень простой и содержала в себе два оператора деления. Казалось бы, чего тут сложного - написал в верилоге A/B и радуйся. Однако, из-за большой разрядности частоты (примерно 32 бита) и коэффициентов два делителя после синтеза заняли суммарно В ТРИ РАЗА больше логики чем ВСЯ остальная логика проекта. Более того, возникли хитрые моменты, как раз связанные с уплывом времянок - фиттер так развел ПЛИС, что при ее нагреве делитель "уплывал". Деление - это очень дорогая штука в плане ресурсов. А уж floating-point арифметика еще дороже. Решением был перенос формулы на ПК, а в блок управления передавались уже посчитанные на ПК коэффициенты. Объем логики проекта сократился ВТРОЕ, максимальная скорость и надежность выросли на порядок.
RadioKoteg
Участник
Offline4.4
с сен 2006
Киев
Сообщений: 14486

Дата: 13 Дек 2011 17:05:30 #  

spectr тише за ниос, это потом но не сейчас. Вот http://doris.kiev.ua/RS/UKV_001/AlteraDE3/KEY/MP4_PC110241.avi , использовал около 10 процентов регистров и то в стиле Паскаля, каждый раз при оптимизиции проценты уменьшаются.P.S.: Verilog, Quartus, Altera и FPGA в целом - это вовсе не слова приговора и тюрьма, а потрясающе интересная и наукоемкая отрасль в разработке современных цифровых, высокопроизводительных и гибких систем. это я уже начинаю прочувствовать.
Реклама
Google
 Страница:  1  2  3  4  5  »» 

Создавать сообщения могут только зарегистрированные участники форума.
Войти в форум :: » Логин » Пароль
Начало
Средства связи, рации. Купить радиостанции Motorola, Yaesu, Vertex, приемники, антенны.
Время загрузки страницы (сек.): 0.022; miniBB ®