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

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


Ссылка на сообщение
Поделиться на других сайтах
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, что позволяет организовать ожидание события.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Спасибо! Нет.
        https://ru.aliexpress.com/item/FREE-SHIPPING-IRS27952STRPBF-IRS27952S-S27952-SOP8-5-PCS/32800614396.html?spm=a2g0s.9042311.0.0.3b8d33ednwdhZw

      Если срочно, то можно в чип дипе купить. 
    • А модератору нужно в двойне уважать мнения участников и не пытаться изображать из себя воина света.
    • От 10 ноги OP3 на землю желателен резистор , пусть будет 10k .
    • Я как минимум модератор данного раздела, данного ТЕХНИЧЕСКОГО форума и моя обязанность содержать вверенный мне разделы в исправности, чистить их от оффтопа (в том числе и от антинауного, антитехнического мусора) Все что я говорю, я могу обосновать технически и подкрепить фактами, в противном случае - я просто молчу. 
        Я никого не убеждаю. Тех, кто подобные перлы пишут, переубеждать уже бесполезно. Я все это пишу для сторонних наблюдателей, которые возможно лет через пять зайдут на этот форум и прочитав какое-либо бредовое утверждение, сразу же следом за ним, смогут прочитать подкрепленное фактами и вескими доводами опровержение (один из примеров тому - выше).
        И здесь вам все кажется: все дело в том, что остальные "правые" предпочитают обходить стороной места скопления филов. Они все для себя понимают, просто не хотят вступать в диалог с теми, кого переубеждать бесполезно. Это я один такой - непримиримый. И только поэтому вам кажется что "я такой один против вас всех". Нет, наоборот, здоровых людей гораздо больше, просто филы лучше организованны. У них есть общая болезнь, которая их объединяет...
    • Проверить 220 на линии. Если есть, то подать 220 на мотор. Потом оптопару проверить на предохранитель (подключено параллельно предохранителю, последовательно с мотором), там всегда должен быть ноль. Если там есть переменка - предохранитель в обрыве.
    • @Vlad90  Вот тут выложена схема Владимира65 со стартом от 6В , только без ШИМа .  
    • Конечно, однако с точки зрения логики разработка и тиражирование - это также разные вещи. Вы мне в соседней теме так и не ответили, какой практически полезный девайс могли бы сделать основываясь на вашей теории? Вы и адресок прям по 2ГИСу можете указать или же только номер в центуре?     А расчёт там наличными или только в крипто-КЦ? Кстати, третий день от Кеши тишина, пропал куда-то. Случилось что или он взял мелки для тараканов и тихонько в уголочке мне долгожданную картинку рисует?