Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Цифровой Фильтр на VERILOG

Цифровой Фильтр на VERILOG 9 года 9 мес. назад #3699

Добрый день, хочу заменить 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 

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Цифровой Фильтр на VERILOG 8 года 4 мес. назад #6624

чтобы сконвертировать 24 бита в 20 или наоборот , не особо важно. поток сначала пропускается через ЦФ например с 32битным коэффициентами на выходе имеем уже 56битные семплы и вот там уже начинается шаманство, а просто оторвать хвост оно конечно можно, но деградация в звуке будет не хилая. то же самое математически : поток из 24бит (+-8388607) перегнать в скажем 32бит(+- 1)float или фп а после домножать каждый семпл на (524286(+-20бит)). и в этой схеме самым важным местом будет разрядность float(fp). как то так

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.092 секунд
Работает на Kunena форум