Sekius

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

5 сообщений в этой теме

Sekius    0

Здравствуйте, нужно реализовать управление АЦП 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

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Meteor77    10

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Sekius    0

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

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

спасибо)

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Meteor77    10

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

Мне хватило "Проектирование систем на микросхемах программируемой логики" в авторстве Грушвицкого, Мурсаева и Угрюмова. БХВ-Петербург 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, что позволяет организовать ожидание события.

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Ага. И обязанностей на целый отдел (или сидеть на работе до 10 вечера), не считая пайки BGA... За такое з/п надо тыщ 200..., не считая пайки BGA.
    • Естественно по очереди, как выше упоминалось. Стандартно - 10 мин часть. Так и прыгаешь между постами ( так называется место у аппарата). Говорят, что существовала аппаратура по автоматическому переключению постов, по меткам.Сам не встречал, всё руками. До сих пор, глядя старые фильмы по ТиВи, замечаю метки на видео.  Лампа, насколько помню, зажигается высоким напряжением 25 - 30 кВ. После пробоя напряжение снижается до 30 - 40 В, ток рабочий несколько десятков ампер ( зависит от мощности). Давление в холодной лампе более 5 атмосфер. В работе поднимается раз в пять. Бомба, короче. Все манипуляции с лампой исключительно в защитной маске из толстенного полимерного стекла. Лампу перемещать только в защитном чехле, снимать его только после установки в аппарат. После взрыва лампы пришлось самому менять, настраивать. Ручки, скажем так, потели от мандража. Включать, естественно только при закрытом аппарате. Ибо светит это солнце бешено. Это то, что вспомнилось. Всё же лет 20 прошло.
    • Я же говорю, они и так все оттуда. Только в другом масштабе - две девчонки подерутся, а весь мир обсуждает.
    • Ну теперь все ясно.))) Да, получается на резисторе около 2 Вт. Много это или мало, сравните с паяльником 25-40 Вт.
    • фигня какая то - чтобы в Москве не найти специалиста..... я бы пошел, - но старый стал, ленивый. Для "@ ta.lu" как вариант - будучи молодым, - довольно часто около института "МИЭМ" (сейчас он по другому называется) видал рекламки с предложением работы студентам. (обязательно с указанием зарплаты) и с льготным графиком.... 
    • Добавлю.  Трехканальный на 2030. Одна м/с заменена на 2050. 400 р. Питание переменка 2*10-12 В.
    • Объяснял уже. Я модер, в нашем деле без этого никак