реклама на сайте
подробности

 
 
> Фильтр для сигма-дельта АЦП
Dawyd
сообщение Apr 9 2007, 19:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 26-04-06
Из: Самара
Пользователь №: 16 532



Здравствуйте, скажу сразу в ПЛИС я пока делитант.
Есть в природе Сигма-дельта модулятор (АЦП) AD7401. После него, должен быть цифровой (децимирующий его ещё так называют) фильтр, типа (Sin(x)/x)^3. В её даташите пример на Verilog привожу ниже Прикрепленный файл  AD7401.pdf ( 450.1 килобайт ) Кол-во скачиваний: 552
:

/*`Data is read on negative clk edge*/
module DEC256SINC24B(mdata1, mclk1, reset, DATA);
input mclk1; /*used to clk filter*/
input reset; /*used to reset filter*/
input mdata1; /*ip data to be filtered*/

output [15:0] DATA; /*filtered op*/

integer location;
integer info_file;

reg [23:0] ip_data1;
reg [23:0] acc1;
reg [23:0] acc2;
reg [23:0] acc3;
reg [23:0] acc3_d1;
reg [23:0] acc3_d2;
reg [23:0] diff1;
reg [23:0] diff2;
reg [23:0] diff3;
reg [23:0] diff1_d;
reg [23:0] diff2_d;
reg [15:0] DATA;
reg [7:0] word_count;
reg word_clk;
reg init;

/*Perform the Sinc ACTION*/

always @ (mdata1)
if(mdata1==0)
ip_data1 <= 0; /* change from a 0 to a -1 for 2's comp */
else
ip_data1 <= 1;

/*ACCUMULATOR (INTEGRATOR) Perform the accumulation (IIR) at the speed of the modulator.Z = one sample delay MCLKOUT = modulators conversion bit rate */

always @ (posedge mclk1 or posedge reset)
if (reset)
begin /*initialize acc registers on reset*/
acc1 <= 0;
acc2 <= 0;
acc3 <= 0;
end
else
begin /*perform accumulation process*/
acc1 <= acc1 + ip_data1;
acc2 <= acc2 + acc1;
acc3 <= acc3 + acc2;
end

/*DECIMATION STAGE (MCLKOUT/ WORD_CLK) */
always @ (negedge mclk1 or posedge reset)
if (reset)
word_count <= 0;
else
word_count <= word_count + 1;
always @ (word_count)
word_clk <= word_count[7];

/*DIFFERENTIATOR ( including decimation stage) Perform the differentiation stage (FIR) at a lower speed.
Z = one sample delay WORD_CLK = output word rate */

always @ (posedge word_clk or posedge reset)
if(reset)
begin
acc3_d2 <= 0;
diff1_d <= 0;
diff2_d <= 0;
diff1 <= 0;
diff2 <= 0;
diff3 <= 0;
end
else
begin
diff1 <= acc3 - acc3_d2;
diff2 <= diff1 - diff1_d;
diff3 <= diff2 - diff2_d;
acc3_d2 <= acc3;
diff1_d <= diff1;
diff2_d <= diff2;
end

/* Clock the Sinc output into an output register WORD_CLK = output word rate */

always @ (posedge word_clk)
begin

DATA[15] <= diff3[23];
DATA[14] <= diff3[22];
DATA[13] <= diff3[21];
DATA[12] <= diff3[20];
DATA[11] <= diff3[19];
DATA[10] <= diff3[18];
DATA[9] <= diff3[17];
DATA[8] <= diff3[16];
DATA[7] <= diff3[15];
DATA[6] <= diff3[14];
DATA[5] <= diff3[13];
DATA[4] <= diff3[12];
DATA[3] <= diff3[11];
DATA[2] <= diff3[10];
DATA[1] <= diff3[9];
DATA[0] <= diff3[8];

end

endmodule

Так вот вопрос в том, что есть в коминтарии сторока (она выделена) мол нуль подменяется -1, а самой какбы подмены нет, (иначе если суммировать единицы и нули) при таком интегрировании будет переполнение регистров ACC1,2,3 и на выходе АЦП будет зашкал в определённый момент времени, причём этот скачёк будет периодичен.

Или я что, то не правильно понял.

Вопрос второй на какой ПЛИС это пойдёт.

P.S. Заранее благодарен всем за участие.


--------------------
Лучше день потерять, что бы потом за пять минут долететь.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01348 секунд с 7
ELECTRONIX ©2004-2016