Автор |
Сообщение |
|
Дата: 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 , даже такие которые строят всякие луноходы вездеходы и лабораторные работы.. |
|
Дата: 05 Дек 2011 03:07:14 · Поправил: horizon (05 Дек 2011 03:11:49)
#
Всё правильно работает так как написано, то есть совсем неправильно. Проблема в том,что Вы пытаетесь использовать регистр MHz до того, как данные в нём стабилизировались. Вам нужно или сделать wire из Freq и соединить с MHz или же использовать конструкт always @(MHz) и в нём делать Freq<= MHz;.
Имхо проще задачу решить на C, даже если микроконтроллер будет реализован в ПЛИС. Посмотрите OpenRISC на opencores.org
|
Реклама Google
|
|
|
Дата: 05 Дек 2011 06:45:05
#
horizon Спасибо за ответ, образно начинаю понимать что происходит. Видно ламинату у меня еще на мозгах валом, есть что растапливать.
|
|
Дата: 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 |
|
Дата: 05 Дек 2011 16:34:04
#
Всё правильно работает так как написано, то есть совсем неправильно. Проблема в том,что Вы пытаетесь использовать регистр MHz до того, как данные в нём стабилизировались. Вкурил. Значит нужно каждый раз при таких присвоениях подождать, в общем делай какой то или таймер. Попробую, может получиться.
|
|
Дата: 05 Дек 2011 21:44:50
#
petr0v
Я упустил контекст. Имел в виду управление радиоприёмником в целом, а не эту изолированную задачу.
RadioKoteg
Держите нас в курсе.
|
|
Дата: 06 Дек 2011 03:52:35
#
horizon
Freq<=12345; // Присвоение без ожидания заполнения
Freq=12345; // Присвоение с ожиданием заполнения
Есть неприятный эффект, в Quartus компилироваться стало в 5 раз дольше :-(
|
|
Дата: 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 который еще спаять надо.
|
|
Дата: 06 Дек 2011 05:00:59 · Поправил: RadioKoteg (06 Дек 2011 05:05:37)
#
Фрагмент статьи " Verilog как образ жизни":
Что есть HDL?
Представь себе механизм, имеющий какую-либо связь с внешним миром. Как только снаружи приходит сигнал (нажали кнопку на пульте управления), внутри механизма что-то срабатывает, и им совершается действие (например, загорается лампочка). Для удобного описания всяких механизмов и причинно-следственных связей и были придуманы HDL-языки.
Совсем необязательно HDL описывает микросхему или ПЛИС. На нем, по сути, можно накодить, что угодно – скажем, устройство, которое никогда не будет реализовано в принципе. Или старый ламповый телевизор. Или маятниковые часы. Даже запаянную с двух сторон металлическую кружку можно так или иначе описать на HDL, потому как она железная (hardware) и ты ее можешь потрогать :). Все, что можно представить блок-схемой, пишется запросто.
Главная сложность, с которой сталкивается программист, начинающий писать на HDL, – ему необходимо осознать, что весь код будет в итоге исполняться одновременно. Как шестеренки в часах вращаются синхронно по событию маятника, так и операции внутри процессора выполняются сразу же, параллельно, успевая до наступления следующего такта!
Грубо говоря, в этом и есть отличие алгоритмических языков типа С или Pascal от HDL-подобных. Если первые «указывают» некоторому абстрактному роботу-исполнителю последовательность действий, то вторые описывают внутренности самого «исполнителя», поведение которого будет зависеть от этих самых внутренностей.
Зачем же описывать эти внутренности, спросишь ты, когда можно описать поведение? Отвечаю. Допустим, цель жизни какого-нибудь робота - перевозить поддоны с печеньками из печки в упаковочный цех. Естественно, приделывать к нему манипуляторы, например, для перевозки бутылок лимонада, смысла особого нет. А твой Intel Core, в который ты загружаешь свежескомпиленную сишную прогу, как раз и является мегауниверсальным роботом, который может делать абсолютно все. Не всегда и не для всех задач нужен такой монстр. Тогда ты берешь HDL и пишешь свой проц, который почти ничего не умеет, но то, что умеет – делает быстро, эффективно и без потребления сотен ватт мощности! |
|
Дата: 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 |
|
Дата: 07 Дек 2011 05:16:51
#
Есть число 123 456 789 где:
123 MHz
456 KHz
789 Hz
как разложить число на Hz и kHz?
С числом MHz все понятно MHz=Freq/1000000;
|
|
Дата: 07 Дек 2011 11:47:29 · Поправил: DVE (07 Дек 2011 11:56:09)
#
В С есть оператор % - остаток от деления, как тут не знаю, наверно тоже должен быть.
PS: Плата ценой в 300$ с процом 200МГц и 8МБайт памяти для опроса клавиатуры, это сильно как бы :) Или туда потом планируется и декодеры встроить?
|
|
Дата: 07 Дек 2011 12:24:48
#
Плата ценой в 300$ с процом 200МГц и 8МБайт памяти для опроса клавиатуры, это сильно как бы :) 495$. "Проца" там нет есть быстрая ПЛИС с тактами 50 и 27 МГц и своим внешним.
Или туда потом планируется и декодеры встроить? а кто их напишет?
Планируется "рекордер на SD карточку" там же звукоуха на борту 96 кГц, планируется удаленный доступ, планируется сверхбыстрый скан, скриптовый язык по скану.. Есть там пал секам оцифровщик можно вывести его на экранчик. Напишите NICAM? Напишете Тетру? Напишите APCO ? Напишете декодеры я с удовольствием волью туда, там 16 МБ памяти и хз сколько SD памяти, да хоть жесткий диск туда..
|
|
Дата: 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.
|
|
Дата: 07 Дек 2011 12:36:07
#
kHz=(Freq % 1000000)/1000; - не работает разве? имхо короче выходит.
|
|
Дата: 07 Дек 2011 12:53:40
#
DVE отладку сделаю куда выводить частоту тогда только проверю.
|
|
Дата: 07 Дек 2011 16:07:54
#
RadioKoteg
На HDL так не пишут. HDL это не программирование, а описание цифровых схем. Никаких умножений и делений без нужды применять не нужно, всё это выливается в монструозные комбинационные схемы. Вам нужно работать с десятичными цифрами в BCD формате, каждая цифра представляется 4-х битным двоичным числом. Например шина с кодом клавиши управляет мультиплексором, который подключает нужную цифру ко входу сдвигового регистра шириной 4 бита, по вводу очередной цифры они продвигаются в нужную позицию. Потом уже можно простым алгоритмом перевести слово из BCD цифр в бинарное слово кода частоты DDS. Описание должно выглядеть в виде схемы содержащей регистры, счётчики, мультиплексоры и т. п., которыми которыми управляют конечные автоматы. Не забывайте избавляться от дребезга контактов кнопок. |
|
Дата: 07 Дек 2011 16:53:56 · Поправил: RadioKoteg (07 Дек 2011 17:01:02)
#
petr0v
Все верно, я с вами согласен на все 100%. Но в этой железке столько ресурсов что я программирую а оно пусть себе схемы описывает(шутка).. Я от деления избавлюсь обязательно по средству SHL SHR и BCD.
|
|
Дата: 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 |
|
Дата: 07 Дек 2011 18:27:50
#
Binary to BCD Converter это для 8 бит, а я чтото не пойму как для 32 бит. Подскажите пожалуйста.
|
|
Дата: 07 Дек 2011 22:16:31
#
|
|
Дата: 08 Дек 2011 01:41:01
#
Никаких умножений и делений без нужды применять не нужно Собственно оно не строит немереных в монструозные комбинационные схемы длинных цепей а использует "LPM_DIVIDE Parameterized Megafunction" . Понимаю что нужно избегать такого, очень понимаю, но смотрю на 32 битное преобразование в BCD и обратно в количестве кодо часов то легче так оставить, а исправить все это только когда опыта будет надлежащим образом достаточно.
|
|
Дата: 08 Дек 2011 13:26:27
#
LPM_DIVIDE Parameterized Megafunction - это и есть комбинационная схема делителя, даже если требуется деление его стараются не использовать. Опыт он и набирается на таких простеньких задачках. К сожалению VHDL/Verilog позволяют написать одно и то же множеством способов и не все они жизнеспособны в реальном железе, другого пути нет кроме как освоить правильный стиль описания.
|
|
Дата: 08 Дек 2011 16:17:50
#
petr0v
Такой способ подобного деления и присвоение с проверкой сожрали в момент 4 процента ресурсов FPGA. Весь в раздумьях.
|
|
Дата: 08 Дек 2011 18:03:35
#
Кстати, умножить на 10 быстрее, если умножить на 8(сдвиг на 3 разряда влево)+прибавить умноженное на 2(сдвинутое на 1 разряд влево).
Итого: 2 сдвига, 1-но сложение.
А BCD удобнее, что хранится в человековаримом формате. Если необходим вывод куда-то - только сдвиг и дешифрация, делить не нужно.
|
|
Дата: 09 Дек 2011 03:20:21 · Поправил: RadioKoteg (09 Дек 2011 03:23:20)
#
самокритика:
500 баксов на кнопочки, и на 16 банков "квик памяти", и лет пять заключения в тюрьме "Quartus" в блоке "Verilog" в камере "Altera" на койке "Cyclone II"..
|
|
Дата: 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. |
|
Дата: 13 Дек 2011 16:49:28
#
Имхо, для Ваших задач наиболее кошерным будет соорудить SOPC-систему с NIOS-процессором на борту. Сможете писать управляющий софт на простом и понятном Вам языке Си. Потребуется время и терпение, но результат себя оправдает. Вы все равно к этому придете в любом случае, поскольку планируете использовать сетевые фичи (Ethernet), вывод на внешний дисплей и т.п., а там уже наиболее быстро и просто поднять все как раз под Ниосом.
Вливайтесь в соответствующий подфорум на electronix.ru, изучайте Альтеровские доки и Design Examples. Думаю, что по детальному анализу разработки под ПЛИС здесь (на радиосканнере) не особо помогут. Тут удобнее какие-то концептуальные вещи обсуждать.
P.S.: Verilog, Quartus, Altera и FPGA в целом - это вовсе не слова приговора и тюрьма, а потрясающе интересная и наукоемкая отрасль в разработке современных цифровых, высокопроизводительных и гибких систем.
|
|
Дата: 13 Дек 2011 17:03:10
#
Но в этой железке столько ресурсов что я программирую а оно пусть себе схемы описывает(шутка)..
Это принципиально неверный подход к разработке под ПЛИС. Когда у вас будет большая и сложная система, вы упретесь в проблемы, связанные с "разводкой ПЛИС" и времянками.
Когда пишете на языках HDL, забудьте о __программировании__. Вы пишете не программу, Вы описываете схему - триггеры, комбинаторную логику, регистры, памяти и т.п. Соответственно, когда что-то пишете на HDL лучше представлять себе эту логическую схему либо в голове, либо иметь ее заранее разрисованной на бумажке. Еще раз - на HDL вы не программируете, на HDL вы описываете логическую схему.
Пример из жизни: блок перестройки внешнего ФАПЧа. Значения частот для блока перестройки задавались в Герцах, он их пересчитывал в целочисленные коэффициенты для делителей ФАПЧа. Так вот, формула пересчета была очень простой и содержала в себе два оператора деления. Казалось бы, чего тут сложного - написал в верилоге A/B и радуйся. Однако, из-за большой разрядности частоты (примерно 32 бита) и коэффициентов два делителя после синтеза заняли суммарно В ТРИ РАЗА больше логики чем ВСЯ остальная логика проекта. Более того, возникли хитрые моменты, как раз связанные с уплывом времянок - фиттер так развел ПЛИС, что при ее нагреве делитель "уплывал". Деление - это очень дорогая штука в плане ресурсов. А уж floating-point арифметика еще дороже. Решением был перенос формулы на ПК, а в блок управления передавались уже посчитанные на ПК коэффициенты. Объем логики проекта сократился ВТРОЕ, максимальная скорость и надежность выросли на порядок.
|
|
Дата: 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 |
|