Автор |
Сообщение |
|
Дата: 13 Дек 2011 17:21:09
#
Когда пишете на языках HDL, забудьте о __программировании__. Вы пишете не программу, Вы описываете схему - триггеры, комбинаторную логику, регистры, памяти и т.п. Соответственно, когда что-то пишете на HDL лучше представлять себе эту логическую схему либо в голове, либо иметь ее заранее разрисованной на бумажке. Еще раз - на HDL вы не программируете, на HDL вы описываете логическую схему.
Это я знаю и подумываю от таком: http://en.wikipedia.org/wiki/ASUS_EeeBox_PC |
|
Дата: 14 Дек 2011 04:48:05 · Поправил: RadioKoteg (14 Дек 2011 05:12:49)
#
есть BCD 9 полу байт
МГц Х Х Х
кГц Х Х Х
Гц Х Х Х
есть "шаг частоты" длиной до 11 бит
Нужно сделать инкремент и декремент частоты с заданным шагом, перевод с бисиди в бинарный (это около 30 битов) и назад в бисиди не допустимо..
Собственно подскажите, меня интересуют арифметические операции с числами BCD, сложение и вычитание.
Есть идеи?
|
Реклама Google
|
|
|
Дата: 14 Дек 2011 13:44:11
#
Как в столбик на бумажке вручную складывают, основа - комбинационная схема сумматора одного разряда, у неё на входе две шины суммируемых цифр и бит переноса, на выходе шина цифры результата и бит переноса. Из таких схем составляем сумматор на всё слово. Но обсчитывать желательно последовательно за несколько тактов, так как быстродействие полной комбинационной схемы не нужно, она большую часть времени будет простаивать тратя ресурсы ПЛИС впустую, это и преобразования в BCD и обратно касается.
|
|
Дата: 14 Дек 2011 15:15:52
#
+6 по переносу бита при сложении если число больше 9 ти, и при вычитании наоборот наверное так.
|
|
Дата: 14 Дек 2011 18:29:09
#
Гугл его знает
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output COUT,
output [3:0] SUM
);
reg [4:0] s2;
assign SUM = s2[3:0];
assign COUT = s2[4];
always @ ( * )
begin
s2 = IN_A + IN_B + CIN;
if (s2 > 9)
begin
s2 = s2 + 6;
end
end
endmodule
На первый взгляд, правильно. |
|
Дата: 17 Дек 2011 07:43:39
#
Сложение в моем случае вышло так:
// Частота
reg [3:0] FMHz_1=0;
reg [3:0] FMHz_2=0;
reg [3:0] FMHz_3=0;
reg [3:0] FkHz_1=0;
reg [3:0] FkHz_2=0;
reg [3:0] FkHz_3=0;
reg [3:0] FHz_1=0;
reg [3:0] FHz_2=0;
reg [3:0] FHz_3=0;
//Шаг частоты перестройки
reg [3:0] Step_FMHz_1=0;
reg [3:0] Step_FMHz_2=0;
reg [3:0] Step_FMHz_3=0;
reg [3:0] Step_FkHz_1=0;
reg [3:0] Step_FkHz_2=0;
reg [3:0] Step_FkHz_3=0;
reg [3:0] Step_FHz_1=0;
reg [3:0] Step_FHz_2=0;
reg [3:0] Step_FHz_3=1;
reg [4:0] s2; //бит переноса
s2[4]=0;
s2 = FHz_3 + Step_FHz_3 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FHz_3 = s2[3:0];
s2 = FHz_2 + Step_FHz_2 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FHz_2 = s2[3:0];
s2 = FHz_1 + Step_FHz_1 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FHz_1 = s2[3:0];
s2 = FkHz_3 + Step_FkHz_3 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FkHz_3 = s2[3:0];
s2 = FkHz_2 + Step_FkHz_2 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FkHz_2 = s2[3:0];
s2 = FkHz_1 + Step_FkHz_1 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FkHz_1 = s2[3:0];
s2 = FMHz_3 + Step_FMHz_3 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FMHz_3 = s2[3:0];
s2 = FMHz_2 + Step_FMHz_2 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FMHz_2 = s2[3:0];
s2 = FMHz_1 + Step_FMHz_1 + s2[4];
if (s2 > 9) s2 = s2 + 6;
FMHz_1 = s2[3:0];
Все заработало.
Не соображу с вычитанием как быть?
|
|
Дата: 17 Дек 2011 08:21:45
#
A four-bit adder/subtractor. If Sign = 0 then S = A + B. If Sign = 1 then S = A – B.
//AddSub.v
//4-bimodule addsub(aIn, bIn, sum, cOut, sign);
t adder/subtractor
input sign;
input [3:0]aIn, bIn;
output [3:0]sum;
output cOut;
reg [3:0]sum;
reg [3:0]bExOr;
reg cOut;
// always @(aIn or bIn or sign)
begin
bExOr = bIn ^ {4{sign}};
{cOut, sum} = aIn + bExOr + sign;
end
// endmodule
А с BCD как быть?
|
|
Дата: 18 Дек 2011 05:32:22
#
Вычитание:
s2[4]=0;
s2 = FHz_3 - Step_FHz_3 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FHz_3 = s2[3:0];
s2 = FHz_2 - Step_FHz_2 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FHz_2 = s2[3:0];
s2 = FHz_1 - Step_FHz_1 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FHz_1 = s2[3:0];
s2 = FkHz_3 - Step_FkHz_3 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FkHz_3 = s2[3:0];
s2 = FkHz_2 - Step_FkHz_2 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FkHz_2 = s2[3:0];
s2 = FkHz_1 - Step_FkHz_1 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FkHz_1 = s2[3:0];
s2 = FMHz_3 - Step_FMHz_3 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FMHz_3 = s2[3:0];
s2 = FMHz_2 - Step_FMHz_2 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FMHz_2 = s2[3:0];
s2 = FMHz_1 - Step_FMHz_1 - s2[4];
if (s2 > 9) s2 = s2 - 6;
FMHz_1 = s2[3:0];
Можно конечно и в модуль, но так как оно в одном месте решил пока так.
|
|
Дата: 18 Дек 2011 05:52:58
#
С восстановлением регистров тоже разобрался, оказывается там приличное время нужно чтобы все устаканилось, в общем ввел я счетчик таймер и по задержке в стиле типа потом восстанавливаю нужные регистры. А то выходило так что я беру в правую руку яблоко, перекладываю с правой руки яблоко в левую руку, потом в правую руку беру грушу и тут происходили чудеса у нас в левой руке груша.. В общем причина понятна, регистры не устаканились.. Собственно этот нюанс я понял. Ну а стиль написания, пока так, потом когда то надо будет перейти на визуальный язык иначе я не справлюсь с сетевыми примочками аудио. Возможно я перейду на NIOS который отдельно прошитый на плис ALTERA МАХ.
В общем я набью пальцы и мозги VERILOGOM что бы не теряться потом с визуальной среде..
|
|
Дата: 24 Дек 2011 08:21:25 · Поправил: RadioKoteg (24 Дек 2011 08:29:23)
#
NIOS-процессором
Nios II по-русски http://naliwator.narod.ru/nios_II.html#00
в лет 70 дойду до пункта "Заключение" Мда, сколько же это надо иметь серого вещества что бы прочитать и усвоить хотя бы на 10 процентов.. |
|
Дата: 26 Дек 2011 19:06:36
#
Подскажите ALTERA DE2 по NIOS процессору наверное в в среде QUATUS или как там, с чего начать, рабочий каркас или пример. Вообще не могу понять с чего начать. Спасибо за полезные советы.
|
|
Дата: 26 Дек 2011 19:23:21
#
RadioKoteg
подскажите, а почему с фпга на процессор стали глядеть..а то я в след году надумал циклон4 взять, к вам присоединиться, а вы уже в др сторону..
|
|
Дата: 26 Дек 2011 19:29:14
#
Windk упс.. Да я не знаю еще в какую сторону идти.. Хочу посмотреть что такое NIOS..
|
|
Дата: 26 Дек 2011 19:35:27 · Поправил: RadioKoteg (26 Дек 2011 19:38:08)
#
Я вкурил что ниос процессор вгружаеться с FPGA и занимает очень львиную долю ресурсов. В общем наверное надо вернуться как было и начать проэкт с начала, и начать с нормального описания клавиатуры в виде отдельного модуля и в виде нормальных понятных скэн кодов клавы, а то действительно я как посмотрел что я натворил в FPGA в виде схем так мне с пятницы по сегодня снились страшные сны..
Мне наверное проще мыслить без всяких там ниос процессоров. Да и перспектива обработать там чегот о в реал тайме, типа построить SDR на ПЧ и все АМ ЧМ SSB детекторы вгрузить на FPGA..
|
|
Дата: 27 Дек 2011 14:42:34
#
Windk
Оставляю как есть что я "понаписывал", оно работает и еще отлично работает. Переношусь в шаг "намбер тву", а именно это работа с флешкой и звуковой картой то есть наоборот, задача забрать с звуковой карты поток и его влить на флешку в виде байтовой последовательности PCM глубиной 16 бит (24???) и обратное читать это все (необязательно).
|
|
Дата: 27 Дек 2011 14:56:16
#
Windk
к вам присоединиться,
Я понял что вы поняли идею SDR на болванке DE. Я конечно присоединяюсь тоже к этой идеи, но с меня "кодер" никакой, хотя уже руки чешутся "Альтеру на 4 том циклоне" и к ней АЦП и ЦАП приделать, это же насколько близко к "FULL DDS трансивер(просто приемник)", надо бы что бы народ это осознал, идея действительно стоит игры при условии что будет человек который напишет логику в FPGA(да хотябы даст толчек), собственно платы готовые к ней и относительно стандартизованные своей структурой начинками в виде различных вкусных интерфейсов(юсби компорты звуковая плата сд карточка даже вжа контроллер который можно при 10 битах использовать по левому направлению..) к плате надо только АЦП и (ЦАП если трансивер) а для преобразователей в квадратуру то даже звуковой карты хватит и синтезатора DDS которая эта архитектура "уделает" флекс радио IMHO.
|
|
Дата: 27 Дек 2011 16:22:57
#
уделывать флексы будет сложно. и не для того я хочу фпга. Мне просто сама по себе эта архитектура привлекла, не программировать в привычном понимании. а описывать схемы.
Ну а что бы не просто так светиками мигать, мне интересен именно захват с АЦП. декодирование, демодуляции. Для начала можно вообще просто сделать осциллограф, а потом уже дальше двигаться, попробовать подать с хорошего отдельного УВЧ сигнал на АЦП (не обязательно пока до УКВ), и попробовать демодулировать. вывести спектр на грф индикатор. сделать настройку - как выделение полосы, сделать скан на основе появления сигнала в той или иной части спектра - это просто интересно посмотреть. как такое без_РС радио в эксплуатации, ибо ничего такого пока нет. Понятно что это DDC радио уже не уложиться в 300, но это уже другие цели, изучение фпга на конкретном примере DDC приема..а там видно будет, возможно ли построение DDC приемника за 300.
|
|
Дата: 27 Дек 2011 16:35:39
#
уделывать флексы будет сложновсе зависит от описания схем, да и вообще кто нам не дает с боку приделать процессор для вычисления синусов и косинусов FFT?
|
|
Дата: 27 Дек 2011 16:42:42
#
ну это потом..походу.. для начала вобще купить надо )
|
|
Дата: 27 Дек 2011 17:20:38
#
Windk
А что покупать то? Готовых китов заточенных под SDR нету, значит нужно разрабатывать принципиальную схему и плату, заказывать производство и монтаж.
|
|
Дата: 27 Дек 2011 17:31:02 · Поправил: RadioKoteg (27 Дек 2011 17:32:35)
#
|
|
Дата: 27 Дек 2011 17:49:24
#
RadioKoteg
Там только диодами поморгать и с PC-связаться, вот это разве что распоять АЦП целая пропасть на самом деле, из опыта могу сказать что можно развести плату абы как неудачно и будет куча наводок, полная неработоспособность, какой бы SDR цифровой не был всё равно у него остаётся аналоговая часть - МШУ, VGA, фильтры, аттенюаторы, на соплях это всё вешать что ли вместе с ЦАП-АЦП и тактовым генератором, питанием и прочим?
|
|
Дата: 27 Дек 2011 18:05:01
#
А что покупать то?
ДЕ болванку и граф индикатор.
целая пропасть на самом деле,
да ничо там не пропасть, все делается как 2 байта переслать, обычный сдр паяется на коленке на простой плате, ОУ, квадратурный..и на выходе даже регулировки и балансировки ОУ не требуется, а толку больше чем от ПРО3. И потом, да хрен с ним с помехами, пусть они будут, даже интересней будет.
|
|
Дата: 27 Дек 2011 18:13:10
#
и с PC-связаться
Какие вы разносторонние, я не знаю что уже и делать. Моя первоначальная цель мигать диодами и засылать частоту в синтезатор, но походу возникли другие идеи и даже как бы на первый взгляд перспективные, я считаю что надо правильно развязать АЦП.. Собственно проверять надо все.
|
|
Дата: 27 Дек 2011 18:14:31
#
ДЕ болванку и граф индикатор.
АЦП еще.
|
|
Дата: 27 Дек 2011 18:34:43
#
АЦП еще
это я у Ад по лендлизу возьму :)
а синтез и светики - это и аттини за 80 руб легко сделает, тем более готовые есть примеры.
|
|
Дата: 28 Дек 2011 01:15:22
#
обнаружил в квартусе Qsys - Altera’s System Integration Tool пытаюсь вникнуть в суть процесса.
|
|
Дата: 30 Дек 2011 15:38:43 · Поправил: RadioKoteg (31 Дек 2011 03:28:59)
#
Сделал аудио, захват и вывод, посредине дата, с ней уже на усмотрение. Размышляю как эту дату кидать на SD флэшку.
|
|
Дата: 31 Дек 2011 03:26:24 · Поправил: RadioKoteg (31 Дек 2011 03:29:39)
#
С флешкой отменяется до полного раскуривания аудио. Решил вывести на светодиоды уровень сигнала:
wire [15:0] audio_inL, audio_inR;
reg [15:0] audio_outL,audio_outR;
reg [15:0] Level_R;
reg [15:0] Level_L;
always @(negedge AUD_DACLRCK)
begin
audio_outR <= audio_inR;
if (audio_inR >=65535) Level_R = 16'b1111111111111111; else
if (audio_inR >=32768) Level_R = 16'b0111111111111111; else
if (audio_inR >=16384) Level_R = 16'b0011111111111111; else
if (audio_inR >=8192) Level_R = 16'b0001111111111111; else
if (audio_inR >=4096) Level_R = 16'b0000111111111111; else
if (audio_inR >=2048) Level_R = 16'b0000011111111111; else
if (audio_inR >=1024) Level_R = 16'b0000001111111111; else
if (audio_inR >=512) Level_R = 16'b0000000111111111; else
if (audio_inR >=256) Level_R = 16'b0000000011111111; else
if (audio_inR >=128) Level_R = 16'b0000000001111111; else
if (audio_inR >=64) Level_R = 16'b0000000000111111; else
if (audio_inR >=32) Level_R = 16'b0000000000011111; else
if (audio_inR >=16) Level_R = 16'b0000000000001111; else
if (audio_inR >=8) Level_R = 16'b0000000000000111; else
if (audio_inR >=4) Level_R = 16'b0000000000000011; else
if (audio_inR >=2) Level_R = 16'b0000000000000001;
end
always @(posedge AUD_DACLRCK)
begin
audio_outL <= audio_inL;
if (audio_inL >=65535) Level_L = 16'b1111111111111111; else
if (audio_inL >=32768) Level_L = 16'b0111111111111111; else
if (audio_inL >=16384) Level_L = 16'b0011111111111111; else
if (audio_inL >=8192) Level_L = 16'b0001111111111111; else
if (audio_inL >=4096) Level_L = 16'b0000111111111111; else
if (audio_inL >=2048) Level_L = 16'b0000011111111111; else
if (audio_inL >=1024) Level_L = 16'b0000001111111111; else
if (audio_inL >=512) Level_L = 16'b0000000111111111; else
if (audio_inL >=256) Level_L = 16'b0000000011111111; else
if (audio_inL >=128) Level_L = 16'b0000000001111111; else
if (audio_inL >=64) Level_L = 16'b0000000000111111; else
if (audio_inL >=32) Level_L = 16'b0000000000011111; else
if (audio_inL >=16) Level_L = 16'b0000000000001111; else
if (audio_inL >=8) Level_L = 16'b0000000000000111; else
if (audio_inL >=4) Level_L = 16'b0000000000000011; else
if (audio_inL >=2) Level_L = 16'b0000000000000001;
end
assign LEDR[15:0] = (Level_R & Level_L);
Индикатор видно что скачет в такт уровня сигнала но последовала проблема, подсвечиваются все индикаторы, мое подозрение то ли что то опять не успевает, или же меняется значение по условию когда сигнал posedge значение audio_inR становится FFFF и наоборот когда забирается по сигналу negedge значение audio_inL становиться FFFF.. В общем я не могу понять что творится.
Еще один вопрос, как в этом всем делать отладку?
Исходники текущей версии: http://doris.kiev.ua/RS/UKV_001/AlteraDE3/MY_UKV_074.RAR |
|
Дата: 31 Дек 2011 06:31:20 · Поправил: RadioKoteg (31 Дек 2011 06:33:21)
#
добрался сюда
//Audio Config Data ADDR _ Data
Dummy_DATA : LUT_DATA <= 16'b00000000_00000000;
SET_LIN_L : LUT_DATA <= 16'b00000000_00011010;// L-line, moderately high gain
SET_LIN_R : LUT_DATA <= 16'b00000010_00011010;// R-line, modernately high gain
SET_HEAD_L : LUT_DATA <= 16'b00000100_01111011;// L-phone out, high volume
SET_HEAD_R : LUT_DATA <= 16'b00000110_01111011;// R-phone out, high volume
A_PATH_CTRL : LUT_DATA <= 16'b00001000_00010010;// Line->ADC, DAC on, no bypass or sidetone
D_PATH_CTRL : LUT_DATA <= 16'b00001010_00000000;// deemph to 48kHz
POWER_ON : LUT_DATA <= 16'b00001100_00000000;// all on
SET_FORMAT : LUT_DATA <= 16'b00001110_00000001;//MSB first left-justified, slave mode
SAMPLE_CTRL : LUT_DATA <= 16'b00010000_00000010;//MSB first left-justified, slave mode
SET_ACTIVE : LUT_DATA <= 16'b00010010_00000001;//Activate
и по этому даташиту: http://www.wolfsonmicro.com/products/codecs/WM8731/ |
Реклама Google |
|