Easyelectronics.ru

Электроника для всех
Текущее время: 22 июн 2018, 12:30

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 02:24 
Заглядывает иногда

Зарегистрирован: 04 фев 2016, 12:43
Сообщения: 101
Откуда: BELARUS
Разбираюсь с примером http://www.fpga4fun.com/SerialInterface3.html на основе его собрал только передатчик код ниже но где-то косячу частота usart_clk 115200 ок ,а на txd выхода нет.

Код:
module usart_tx (clk,txd,usart_clk);
input clk;   
output wire usart_clk;
output wire txd;
//parameter ClkFrequency = 50000000; // 25MHz
parameter Baud = 115200;
parameter BaudGeneratorInc = 8'd151;//50000000/115200=434->65536/434=151
reg [15:0] BaudGeneratorAcc;
reg [3:0] TxD_state = 0;
wire TxD_ready = (TxD_state==0);
reg [7:0] TxD_shift = 0;
reg [7:0] TxD_data = 8'd151;
wire TxD_start=1'b1;
//======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
always @(posedge clk)// 50MHz
  begin
  BaudGeneratorAcc <= BaudGeneratorAcc + BaudGeneratorInc;
  end
assign  usart_clk = BaudGeneratorAcc[15]; //115200
//=======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
always @(posedge clk)
begin
   if(TxD_ready & TxD_start)
      TxD_shift <= TxD_data;
   else
   if(TxD_state[3] & usart_clk)
      TxD_shift <= (TxD_shift >> 1);

   case(TxD_state)
      4'b0000: if(TxD_start) TxD_state <= 4'b0100;
      4'b0100: if(usart_clk) TxD_state <= 4'b1000;  // start bit
      4'b1000: if(usart_clk) TxD_state <= 4'b1001;  // bit 0
      4'b1001: if(usart_clk) TxD_state <= 4'b1010;  // bit 1
      4'b1010: if(usart_clk) TxD_state <= 4'b1011;  // bit 2
      4'b1011: if(usart_clk) TxD_state <= 4'b1100;  // bit 3
      4'b1100: if(usart_clk) TxD_state <= 4'b1101;  // bit 4
      4'b1101: if(usart_clk) TxD_state <= 4'b1110;  // bit 5
      4'b1110: if(usart_clk) TxD_state <= 4'b1111;  // bit 6
      4'b1111: if(usart_clk) TxD_state <= 4'b0010;  // bit 7
      4'b0010: if(usart_clk) TxD_state <= 4'b0011;  // stop1
      4'b0011: if(usart_clk) TxD_state <= 4'b0000;  // stop2
      default: if(usart_clk) TxD_state <= 4'b0000;
   endcase
   
end
assign txd = (TxD_state<4) | (TxD_state[3] & TxD_shift[0]);  // put together the start, data and stop bits
//=======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
endmodule



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 03:26 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 дек 2010, 19:20
Сообщения: 71
А в каком состоянии находится TxD_ready?
И какой сигнал подаете на TxD_start?
Хоть кнопку приделали?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 03:37 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2908
че-то как-то перемудрили с конечным автоматом для передачи данных и старт/стопов, может просто сдвиговый регистр сделать чуть побольше и туда старт/стоп биты складывать при загрузке:

Код:
module usart_tx (tx_clk, data, tx_start, tx_ready, txd);
input [7:0] data;
input tx_clk;
output txd;
output tx_ready;
input tx_start;

reg [8:0] sr = 0x1FF;
reg [3:0] bit_сnt = 0x0F;
assign txd = sr[0];
assign tx_ready = (bit_сnt > 8);

always @ (posedge tx_clk)
begin
  if (bit_сnt < 9) begin
    sr <= 0x100 | (sr>>1);
    bit_сnt <= bit_сnt + 1;
  end else begin
    if (tx_start) begin
      bit_сnt <= 0;
      sr <= (data<<1);
    end
  end
end

endmodule

з.ы. работоспособность не проверял.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 10:41 
Заглядывает иногда

Зарегистрирован: 04 фев 2016, 12:43
Сообщения: 101
Откуда: BELARUS
Meteor писал(а):
А в каком состоянии находится TxD_ready?

Так до начала передачи он по идее равен 1
Код:
reg [3:0] TxD_state = 0;
wire TxD_ready = (TxD_state==0)


А wire TxD_start=1'b1;то есть всегда 1.
Я просто недавно начал осваивать VERILOG.
Ну и есть такое сообщение Warning (15706): Node "txd" is assigned to location or region, but does not exist in design


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 10:43 
Заглядывает иногда

Зарегистрирован: 04 фев 2016, 12:43
Сообщения: 101
Откуда: BELARUS
_pv писал(а):
че-то как-то перемудрили с конечным автоматом для передачи данных и старт/стопов, может просто сдвиговый регистр сделать чуть побольше и туда старт/стоп биты складывать при загрузке:

Попробую Ваш пример но хотелось бы понять в чем дело с "моим" примером)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 11:26 
Заглядывает иногда

Зарегистрирован: 04 фев 2016, 12:43
Сообщения: 101
Откуда: BELARUS
Передача пошла не знаю) в чем дело было но работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RS 232 ПЛИС
СообщениеДобавлено: 13 май 2018, 21:03 
Заглядывает иногда

Зарегистрирован: 04 фев 2016, 12:43
Сообщения: 101
Откуда: BELARUS
BorisBritwa писал(а):
Передача пошла не знаю) в чем дело было но работает.

но передается все за один такт usartclk
В итоге все выглядит так:
Код:
module USART (clk,txd,usart_clk);
input clk;   
//input TxD_start;
output wire usart_clk;
output wire txd;
//parameter ClkFrequency = 50000000; // 25MHz
parameter Baud = 115200;
parameter BaudGeneratorInc = 8'd151;//50000000/115200=434->65536/434=151
reg [15:0] BaudGeneratorAcc;
reg [3:0] TxD_state = 0;
wire TxD_ready = (TxD_state==0);
reg [7:0] TxD_shift = 0;
reg [7:0] TxD_data = 8'd151;
wire TxD_start=(TxD_state==0); //Можно задействовать у меня он пока так)

//======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
always @(posedge clk)// 50MHz
  begin
  BaudGeneratorAcc <= BaudGeneratorAcc + BaudGeneratorInc;
  end
assign  usart_clk = BaudGeneratorAcc[15]; //115200
//=======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
always @(posedge usart_clk)
begin
   if(TxD_ready & TxD_start)
      TxD_shift <= TxD_data;
   else
   if(TxD_state[3] & usart_clk)
      TxD_shift <= (TxD_shift >> 1);

   case(TxD_state)
      4'b0000: if(TxD_start) TxD_state <= 4'b0100;
      4'b0100:  TxD_state <= 4'b1000;  // start bit
      4'b1000:  TxD_state <= 4'b1001;  // bit 0
      4'b1001:  TxD_state <= 4'b1010;  // bit 1
      4'b1010:  TxD_state <= 4'b1011;  // bit 2
      4'b1011:  TxD_state <= 4'b1100;  // bit 3
      4'b1100:  TxD_state <= 4'b1101;  // bit 4
      4'b1101:  TxD_state <= 4'b1110;  // bit 5
      4'b1110:  TxD_state <= 4'b1111;  // bit 6
      4'b1111:  TxD_state <= 4'b0010;  // bit 7
      4'b0010:  TxD_state <= 4'b0011;  // stop1
      4'b0011:  TxD_state <= 4'b0000;  // stop2
      default:  TxD_state <= 4'b0000;
   endcase
   
end
assign txd = (TxD_state<4) | (TxD_state[3] & TxD_shift[0]);  // put together the start, data and stop bits
//=======================================================================================//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
endmodule


ТАК И НЕ понял как у автора работал код по ссылке если у него clk было 25000000Гц ,a BaudTick (у меня usart_clk)115200 по идее .


Вложения:
uart.jpg
uart.jpg [ 37.87 Кб | Просмотров: 167 ]
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB