• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
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, что позволяет организовать ожидание события.

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


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

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

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

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

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

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

Войти

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

Войти сейчас