|
попытка создания спектроанализатора, XC3S250E-208 и ТФТ 480х234 |
|
|
|
Dec 29 2012, 21:32
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Привет народ. Вот вымучил ФФТ на корке , получилось что-то похожее на спектр. Во всяком случае на изменение частоты реагирует переползанием пиков сигнала по экрану. Только вот никак не соображу, как сделать так, чтобы пики сигнала располагались только сверху, а не вращались как умалишённые вверх-вниз. http://www.youtube.com/watch?v=Vy1yDr5oZU8...eature=youtu.beприлагаю куски кода по частям. 1. корка ФФТ в ИЗЕ Код reg [8:0]xn_re; always @ (posedge CLK_A) xn_re <= signal;
FFT FFT_A ( .clk(CLK_A), // input clk .start(1), // input start .unload(1), // input unload .xn_re(xn_re[8:0]), // input [8 : 0] xn_re min+max .xn_im(0), // input [8 : 0] xn_im .fwd_inv(1), // input fwd_inv .fwd_inv_we(1), // input fwd_inv_we .rfd(rfd), // output rfd .busy(busy), // output busy .dv(dv), // output dv .xk_re(xk_re), // output [8 : 0] xk_re .xk_im(xk_im) // output [8 : 0] xk_im ); далее блок математики , в котором сигналы с ФФТ обрабатываются и выводятся далее на экран Код wire [8:0]out_math; math math (// математика .clk(CLK_A), .dv(dv), .real_(xk_re), .imaginary(xk_im), .out_(out_math) ); и собственно сама математика Код module math ( input clk, input dv, input [7:0]real_, input [7:0]imaginary, output reg[9:0]out_ ); wire [15:0] real_re; wire [15:0] imaginary_; //модуль комплексного числа. multiplexor m_re ( .clk(clk), // input clk .a(real_), // input [7 : 0] a .b(real_), // input [7 : 0] b .ce(dv), .p(real_re) // output [15 : 0] p ); multiplexor m_im ( .clk(clk), // input clk .a(imaginary), // input [7 : 0] a .b(imaginary), // input [7 : 0] b .ce(dv), .p(imaginary_) // output [15 : 0] p ); reg [16:0] summe; always @ (posedge clk) begin summe <= real_re[15:0] + imaginary_[15:0]; end wire [8:0]out_m; sqrt sqrt ( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); //------------------------ ищем max ---------------------------------- wire [8:0] max = (dv == 1'b1) ? 1'b1: (( max < out_m ) ? out_m : 1'b1); //----------------------- нормировка по max wire [8:0] max_2; divider d_max ( .clk(clk), // input clk .ce(dv), // input ce .dividend(max), // input [8 : 0] dividend .divisor(2), // input [8 : 0] divisor .fractional(max_2) // output[8 : 0] fractional ); wire [8:0] res; divider d_res ( .clk(clk), // input clk .ce(dv), // input ce .dividend(out_m),// input [8 : 0] dividend .divisor(max_2), // input [8 : 0] divisor .fractional(res) // output[8 : 0] fractional );
always @ (posedge clk) begin out_ <= res[7:0] - 118;//двигаем по высоте. меньше - выше end
endmodule поскажите, что надо сделать, чтобы устранить это вращение.Спасибо заранее и всех с наступающим Новым годом !
--------------------
|
|
|
|
|
Dec 29 2012, 22:50
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(andreichk @ Dec 30 2012, 02:44)  Простите, я по ходу вас неверно понял. Вы хотели сказать, что извлечение кв.корня из суммы квадратов вообще можно исключить и тогда значения будут только положительными? Я проверю это прямо сейчас и выложу фото того, что получилось. Именно! Однако и корень квадратный из положительного числа не должен приобретать отрицательный знак. А то у вас сумма 17-разрядная: reg [16:0] summe; а корень берется только от 16 разрядов: .x_in(summe), // input [15 : 0] x_in Мне трудно предсказать, что от этого бывает. Вдруг функция sqrt() воспринимает бит 15, как знаковый и выдает от этого фигню? Сдвинули бы вы summe на разряд вправо (или поделили на 2) перед тем, как извлекать корень. Хотя б для "очистки совести". ... в, впрочем, не поможет. Ведь если число воспринимается как отрицательное, то при сдвиге и делении знак сохранится.
|
|
|
|
|
Dec 29 2012, 23:08
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(andreichk @ Dec 30 2012, 02:56)  блин, как это я проглядел? теперь я на распутье или выкинуть извлечение корня или переделать корку корня на 17 разрядов... хорошо, что есть выбор...Спасибо за подсказку.ночь длинная, буду копать.. Вы лучше переделайте так, чтобы корень извлекался из беззнакового числа, т.е. не считал старший бит за признак отрицательности. Ведь оба квадрата у вас - числа положительные. Значит, у обоих разряд 15 пустой. Заполниться он может лишь при сложении. Но даже и в этом случае, разряд 16 не нужен, т.к. он с гарантией останется пустым. Поэтому для суммы вам достаточно 16-разрядного числа, но только с той оговоркой, что оно беззнаковое. И корень должен это как-то понимать, всегда воспринимая аргумент беззнаковым. Общность от этого не теряется, т.е. из отрицательных чисел корень все равно извлекать нельзя.
|
|
|
|
|
Dec 30 2012, 17:25
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
в последней интерпретации я вообще исключил извлечение кв. корня и нормируюсь по МАХ просто суммой квадратов. Получилось намного красивее, во всяком случае пики задираются в одну сторону. Код module math ( input clk, input dv, input [8:0]real_, input [8:0]imaginary, output reg[8:0]out_ ); wire [17:0] real_re; wire [17:0] imaginary_; //модуль комплексного числа. multiplexor m_re ( .clk(clk), // input clk .a(real_), // input [8 : 0] a .b(real_), // input [8 : 0] b .ce(dv), .p(real_re) // output [17 : 0] p ); multiplexor m_im ( .clk(clk), // input clk .a(imaginary), // input [8 : 0] a .b(imaginary), // input [8 : 0] b .ce(dv), .p(imaginary_) // output [17 : 0] p ); reg [18:0] summe; always @ (posedge clk) begin summe <= real_re[17:0] + imaginary_[17:0]; end //------------------------ ищем max ---------------------------------- wire [8:0] max = (dv == 1'b1) ? 1'b0: (( max < summe[8:0] ) ? summe[8:0] : 1'b0); //----------------------- нормировка по max wire [8:0] max_2; divider d_max ( .clk(clk), // input clk .ce(dv), // input ce .dividend(max), // input [8 : 0] dividend .divisor(1), // input [8 : 0] divisor .fractional(max_2) // output[8 : 0] fractional ); wire [8:0] res; divider d_res ( .clk(clk), // input clk .ce(dv), // input ce .dividend(summe[8:0]),// input [8 : 0] dividend .divisor(max_2), // input [8 : 0] divisor .fractional(res) // output[8 : 0] fractional );
always @ (posedge clk) begin out_ <= res[8:0] - 305;//двигаем по высоте. меньше - выше end
endmodule Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко....  правда как обычно какая-то фигня на экран полезла в виде зеркальных повторов. как от этого избавиться, вот ещё задачка.....
--------------------
|
|
|
|
|
Dec 30 2012, 17:47
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
QUOTE (andreichk @ Dec 30 2012, 21:25)  Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко....  ..не жалко : CODE log10 log10( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); ..пользуйтесь, всегда рады помочь.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Dec 30 2012, 18:01
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Цитата(Lmx2315 @ Dec 30 2012, 18:47)  ..не жалко : Код log10 log10( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); ..пользуйтесь, всегда рады помочь. спасибо, только обьясните как ей пользоваться. это же какая-то готовая корка и у меня такой нет. просто так она ИЗЕй не распознаётся.
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|