Перейти к содержанию

Управление Ацп Tlc549


Sekius

Рекомендуемые сообщения

Здравствуйте, нужно реализовать управление АЦП TLC549. Дали не очень конкретное задание.

Есть код, чужой, без комментов. Нужно как то объяснить этот код или написать свой, но я пока не успел как следует ознакомиться с AHDL, на котором он написан и, соответственно, не могу разобраться, как же работает этот АЦП и что вообще с ним делать. Подскажите пожалуйста, с чего следовало бы начать, может есть какие то альтернативные пути решения проблемы. Прикладываю код

модуль tlc549

module tlc549
(
clk,
rst,
ad_cs_out,
ad_clk_out,
ad_data_in,
txd_out
);


input clk,rst,ad_data_in;
output ad_cs_out,ad_clk_out,txd_out;
reg ad_cs_out,ad_clk_out,txd_out;
reg clk_100k;
reg [4:0] cnt;
reg [7:0] addata;
wire TxClk,TxFinish;
reg XmitPlus;
defparam Gen_RxClk.divdFACTOR=208,Gen_RxClk.divdWIDTH=7;
gen_divd Gen_RxClk(.reset(rst),.clkin(clk),.clkout(TxClk));

defparam Gen_100k.divdFACTOR=240,Gen_100k.divdWIDTH=7;
gen_divd Gen_100k(.reset(rst),.clkin(clk),.clkout(clk_100k));
uart_x UartTx(.Bclk(TxClk),.Resett(rst),.Txd(txd_out),
.XmitCmdp(XmitPlus),.TxdBuf(addata),.TxDone(TxFinish));

always @(posedge clk_100k or negedge rst)
begin
if(!rst)
begin
cnt<=5'd0;
ad_cs_out<=1'b1;
ad_clk_out<=1'b0;
XmitPlus<=1'b0;
end
else
begin
cnt<=cnt+1'b1;
case(cnt)
0:begin ad_cs_out<=1'b0;ad_clk_out<=1'b0;end
1:begin ad_clk_out<=1'b1;end
2:begin addata[7]<=ad_data_in;ad_clk_out<=1'b0;end
3:begin ad_clk_out<=1'b1;end
4:begin addata[6]<=ad_data_in;ad_clk_out<=1'b0;end

5:begin ad_clk_out<=1'b1;end
6:begin addata[5]<=ad_data_in;ad_clk_out<=1'b0;end
7:begin ad_clk_out<=1'b1;end
8:begin addata[4]<=ad_data_in;ad_clk_out<=1'b0;end

9:begin ad_clk_out<=1'b1;end
10:begin addata[3]<=ad_data_in;ad_clk_out<=1'b0;end
11:begin ad_clk_out<=1'b1;end
12:begin addata[2]<=ad_data_in;ad_clk_out<=1'b0;end

13:begin ad_clk_out<=1'b1;end
14:begin addata[1]<=ad_data_in;ad_clk_out<=1'b0;end
15:begin ad_clk_out<=1'b1;end
16:begin addata[0]<=ad_data_in;ad_clk_out<=1'b0;end

17:begin ad_cs_out<=1'b1;end
//18:;
//19:;
//20:;
21:begin XmitPlus<=1'b1; end
//22:;
29:begin XmitPlus<=1'b0;end
30:
 begin
 if(TxFinish==1'b1)
 cnt<=5'd31;
 else
 cnt<=5'd30;
 end

default:;
endcase
end
end
endmodule

модуль gen_divd

module gen_divd(reset,clkin,clkout);
input reset,clkin;
output clkout;
parameter divdWIDTH=1;
parameter divdFACTOR=1;
reg clkout;
reg [divdWIDTH:0] cnt;


always @ (negedge reset or posedge clkin)
if(reset==1'b0)
begin
cnt=0;
clkout=0;
end
else
begin
cnt=cnt+1'b1;
if(cnt>=divdFACTOR)
begin
cnt=0;
clkout=~clkout;
end
end
endmodule

модуль uart_x

module uart_x
(
Bclk,
Resett,
Txd,
XmitCmdp,
TxdBuf,
TxDone
//test
/*
BitCnt,
nState,
cState
*/
);
input Bclk,Resett,XmitCmdp;
input [7:0] TxdBuf;
output Txd,TxDone;
//test
/*
output [3:0] BitCnt;
output [4:0] nState,cState;
*/
reg Txd,TxDone;
reg [7:0] TxdBufTmp;
parameter TXIdle=5'b0_0000,
TXLode=5'b0_0001,
TXStartBit=5'b0_0010,
TXDataBit=5'b0_0100,
TXStopBit=5'b0_1000,
TXDone=5'b1_0000;
reg [3:0] BitCnt;
reg [4:0] nState,cState;

always @ (negedge Resett or posedge Bclk)
if(!Resett)
cState<=TXIdle;
else
cState<=nState;

always @ (cState or XmitCmdp or Resett or BitCnt)
if(!Resett)
nState=TXIdle;
else if(XmitCmdp)
nState=TXLode;
else
case(cState)
TXLode:nState=TXStartBit;
TXStartBit:nState=TXDataBit;
TXDataBit:
 if(BitCnt>=8)
 nState=TXStopBit;
 else
 nState=TXDataBit;
TXStopBit:nState=TXDone;
TXDone,TXIdle:nState=TXIdle;
default:nState=5'bx;
endcase

always @(posedge Bclk or negedge Resett)
if(!Resett)
begin
Txd<=1'b1;
TxDone<=1'b0;
BitCnt<=4'b0000;
end
else
case(nState)
TXLode:
 begin
 TxdBufTmp<=TxdBuf;
 TxDone<=1'b0;
 end
TXStartBit:
 Txd<=1'b0;
TXDataBit:
 begin
 Txd<=TxdBufTmp[bitCnt];
 BitCnt<=BitCnt+1'b1;
 end
TXStopBit:
 Txd<=1'b1;
TXDone:
 TxDone<=1'b1;
TXIdle:BitCnt<=4'b0000;
default:;
endcase
endmodule

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Пока Вы не углубились в изучение AHDL, скажу - представленный синтез написан в verilog.

Теперь очень бегло.

В модуле tlc549 есть счетчик на 31 состояние.

В начальном стотянии (0) формируется сигнал выбора микросхемы, затем со значения 1 до 16 формируется времянка для последовательного вывода результатов преобразования в сдвиговый регистр.

На значении 17 закрывается работа с АЦП, далее следует технологическая пауза, формируется сигнал XmitPlus, и затем схема вводится в состояние ожидания появления внешнего сигнала TxFinish.

В модуле gen_divd описан банальный счетчик для формирования производной частоты из основной тактовой.

Реализацию модуля уарта не осилил (верилог не родной язык), но скорее всего нужен для банальной передачи одного байта и его надо вставлять в верхний уровень для организации периодического запуска АЦП, передачи результатов в уарт и далее в ПК или другое устройство.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Пока Вы не углубились в изучение AHDL, скажу - представленный синтез написан в verilog.

Вы имеете ввиду, что тот код, который я дал написан в верилог? круто же меня проинформировали) дали пример, книжку по AHDL и сказали - изучай))

спасибо)

П.С. если знаете, посоветуйте что-нибудь толковое по верилог, заранее спасибо

Теперь очень бегло.

и если у Вас будет время, буду благодарен, если расскажете не так бегло, я с этим знаком достаточно поверхностно(

Ссылка на комментарий
Поделиться на другие сайты

П.С. если знаете, посоветуйте что-нибудь толковое по верилог, заранее спасибо

Мне хватило "Проектирование систем на микросхемах программируемой логики" в авторстве Грушвицкого, Мурсаева и Угрюмова. БХВ-Петербург 2002г.

В ней есть разделы посвященные и AHDL, и VHDL, и verilog.

и если у Вас будет время, буду благодарен, если расскажете не так бегло, я с этим знаком достаточно поверхностно(

С серединке начну (gen_divd). В проекте описан счетчик, с числом разрядов задаваемых параметром divdWIDTH. После сброса счетчик обнуляется и на выходе ставится начальное значение. На каждом такте clkin, к счетчику прибавляется 1, после достижения или превышения наперед заданного значения (divdFACTOR) на выходе модуля происходит переключение состояния на обратное. Т.е. формируется частота в 2 раза ниже тактовой.

Примерно такой же принцип заложен в модуль управления АЦП. Имеется счетчик, точнее машина состояний, с каждым тактом машина переводится в новое состояние. Всего состояний 31. Для каждого состояния есть инструкция что делать, например

1:begin ad_clk_out<=1'b1;end

при состоянии 1, нужно установить вывод ad_clk_out в лог. 1.

а на следующем такте

2:begin addata[7]<=ad_data_in;ad_clk_out<=1'b0;end

Вывести в этот же вывод 0, а состояние входного сигнала ad_data_in записать в старший бит регистра addata.

Ну и самое интересное, по достижению счетчиком состояния 30, производится проверка сигнала TxFinish и если сигнал равен 1, то счетчику присваивается состояние 31, а если сигнал равен 0 - то счетчику присваивается значение 30, что позволяет организовать ожидание события.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...