-
WolfTheGrey
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 19
-
Спасибо получено: 0
-
-
|
Добрый день, хочу заменить SM5842 из платы ЦАП на ПЛИС, так как исходная микра устарела и не поддерживает современную плотность потока данных.
По образу и подобию - максимально стремился приблизиться к картинкам от ЦФ sm5842.
Написал код на VERILOG, вроде как работает, ЦАП поет, но с багами.
1- Нельзя так просто взять и оторвать от хвоста даты 4 бита! Это сильно влияет на громкость (увеличило раз в 10).
2- А как тогда превести 24 бит даные в 20 бит?
3- криво работает строчка: f((BCLK_tic == 0)||(BCLK_tic >= 21)) BCLK_out = 0; но почему то все время BCLK_out держит в нуле.
Суть проекта проста: Взять I2S шину с форматом LJ и перегнать в удобоваримый формат для ЦАП.
module DigitalFilter
(
input wire LR, BCLK, MCLK, DATA, //I2S шина с форматом LJ
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) //LR = 1? идет поток левого канала,
begin
buffer_data_L[buffer_data_count] = DATA;
end
if(!LR) //LR = 0? идет поток правого канала,
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
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
alexandermas
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 2
-
Спасибо получено: 0
-
-
|
чтобы сконвертировать 24 бита в 20 или наоборот , не особо важно. поток сначала пропускается через ЦФ например с 32битным коэффициентами на выходе имеем уже 56битные семплы и вот там уже начинается шаманство, а просто оторвать хвост оно конечно можно, но деградация в звуке будет не хилая. то же самое математически : поток из 24бит (+-8388607) перегнать в скажем 32бит(+- 1)float или фп а после домножать каждый семпл на (524286(+-20бит)). и в этой схеме самым важным местом будет разрядность float(fp). как то так
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.092 секунд