Автор Тема: Проект 63  (Прочитано 21217 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн WolfTheGrey

  • Старожил
  • *****
  • Сообщений: 2162
  • Репутация: 6
  • Алексей
  • Поблагодарили: +99
Re: Проект 63
« Ответ #30 : 13 Июня 2015, 01:16:32 »
0
К сожалению код из статьи книги не прокатил.  На ЦАП шла полная 64 битовая белеберда.
Написал свою прошивку. По образу и подобию - максимально стремился приблизиться к картинкам от ЦФ sm5842. Поет  ;D Правда с хипами и хрюками, но поет  :yah:
На джитер пока не оптимизровал, единственное могу сказать - Нельзя так просто взять и оторвать от хвоста даты 4 бита! Это сильно влияет на громкость (увеличило раз в 10). Может потому и хрипит.
А как тогда превести 24 бит даные в 20 бит?

module DigitalFilter
(
input wire LR, BCLK, MCLK, DATA,
output reg LR_out, BCLK_out, DATA_R, DATA_L
);

reg[0:31] buffer_data_L, buffer_data_R;
reg[0:6] buffer_data_count;

reg[0:23] data_out_L, data_out_R;

always @(posedge BCLK) // по восходящему фронту записываем 1:0 в буфер данных
begin
if(LR)
begin
buffer_data_L[buffer_data_count] = DATA;
end
if(!LR)
begin
buffer_data_R[buffer_data_count] = DATA;
end
buffer_data_count = (buffer_data_count == 32)? 1 : buffer_data_count + 1;
end

always @(posedge LR) // по восходящему фронту L/R сбрасываем данные буфера приемника в буфер отправителя.
begin
data_out_L = buffer_data_L[8:31];
data_out_R = buffer_data_R[8:31];
end


//Вычисление тактовых сигналов ЦФ, и отправка данных в ЦАП. Формат: LR=44.1, BCLK=24*LR
reg BCLK_buf = 1'b1;
reg[0:4] MCLK_tic; //16
always @(posedge MCLK) // преобразуем частоту BCLK_out (mclk/16 = bclk)
begin

if(MCLK_tic == 7)
begin
MCLK_tic = 0;
BCLK_buf = ~BCLK_buf;
BCLK_out = ~BCLK_out;
end
else
MCLK_tic = MCLK_tic + 1;
end

reg[0:5] BCLK_tic; //24
always @(negedge BCLK_buf) // синтезируем LR_out
begin
BCLK_tic = (BCLK_tic == 23) ? 0 : BCLK_tic + 1;

if(BCLK_tic <= 12)
LR_out = 0;

else
LR_out = 1;


//if((BCLK_tic == 0)||(BCLK_tic >= 21)) // по идее 1 бит и более 21 бит BCLK_out = 0; но почему то все время BCLK_out держит в нуле.
//BCLK_out = 0;
//else   // отправка данных в ЦАП
begin

//BCLK_out = BCLK_buf;
DATA_R = data_out_R[BCLK_tic - 1];
DATA_L = data_out_L[BCLK_tic - 1];

end
end

endmodule

и добавил...
плис пока стоит ЕРМ570, код занял 170 вентилей.

и добавил...
Проинвертировал клок BCLK_out, хрипы ушли.
Не плохо поет, помоему по лучше чем с ЦФ на sm5842, покрайней мере НЧ не выпячивает, звук более натурален. Хотя смогу сравнить работу ЦФ на плис и sm5842 когда буду переключать на плис и sm5842
« Последнее редактирование: 13 Июня 2015, 02:24:27 от WolfTheGrey »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
130 Ответов
104041 Просмотров
Последний ответ 08 Июля 2014, 01:09:06
от Гocть
38 Ответов
35260 Просмотров
Последний ответ 02 Сентября 2015, 14:27:23
от LiDer
296 Ответов
192042 Просмотров
Последний ответ 15 Декабря 2016, 23:58:30
от cu6apum
1243 Ответов
500865 Просмотров
Последний ответ 30 Марта 2023, 08:57:15
от Карта
434 Ответов
218123 Просмотров
Последний ответ 08 Октября 2020, 14:13:48
от Карта