Jump to content

    

Конфигурируемый приемник RS-232

Recommended Posts

andrew_b
1 час назад, lyaksandrov сказал:

Вообщем

В общем, слова "вообщем" не существует. Вообще не существует.

Вы думаете, что кто-то будет вчитываться в эту простыню неформатированного кода?

Share this post


Link to post
Share on other sites

iosifk
18 минут назад, andrew_b сказал:

Вы думаете, что кто-то будет вчитываться в эту простыню неформатированного кода?

Добавлю... стиль описания ужасный... лучше бы не привыкать к такому...

Share this post


Link to post
Share on other sites

andrew_b
1 час назад, iosifk сказал:

стиль описания ужасный

Я даже смотреть не стал.

Share this post


Link to post
Share on other sites

sazh
07.05.2022 в 12:36, byRAM сказал:

У Тарасова меньше ресурсов ПЛИС уходит. Можно на мелкой CPLD сделать. Там только делитель тактовой включать/отключать придётся.

Сомнение гложет.  У него только на реализации констант за пределы мелкой CPLD можно вылететь.

10 часов назад, Plain сказал:

 

0) без генератора на аккумуляторе фазы;

А что это такое - генератор на аккумуляторе фазы в данном случае?

Share this post


Link to post
Share on other sites

des00
6 hours ago, sazh said:

А что это такое - генератор на аккумуляторе фазы в данном случае?

NCO, который делит на любое число, формируя сигнал разрешения с дрожанием фазы. Точнее чем фиксированный счетчик-делитель, но в контексте уарта совершенно излишний.

Share this post


Link to post
Share on other sites

sazh
10.05.2022 в 17:14, lyaksandrov сказал:

Вообщем много что перечитал, попробовал сделать, вроде что-то получилось, но не знаю так ли это должно работать))? Делал со скоростью 57600

 

Конечно, это не работает, описание оставляет желать лучшего, но функционально все правильно. Что удивительно, вы попытались реализовать UART в стиле UART Электроника 60 (когда то была настольным компьтером). Минимум ресурсов.

Остальное - дело наживное. Я влоб подправил. Чтоб работало.

Но это, функционально - Ваше. Так что не хуже того, что сейчас в учебниках ваяют. 

uart.zip

Share this post


Link to post
Share on other sites

byRAM
10.05.2022 в 22:55, sazh сказал:

Сомнение гложет.  У него только на реализации констант за пределы мелкой CPLD можно вылететь.

Но это решение проверено мною именно на мелкой CPLD XC9572, и это не константы в итоге, а логика, коей там достаточно.

Иное дело, когда все выводы заняты, тогда триггеров не хватит на деление частоты. Но ТС нужен только приёмник UART и всё.

Share this post


Link to post
Share on other sites

lyaksandrov

Написал код, все работает, но мне теперь нужно сделать, чтобы можно было переключать скорость передачи данных (скорость 57600 либо 115200 кбит.с).

Далее необходимо сделать проверку на бит четности, посчитать количество едениц записанных в data и вывести результат если нечетное количество то все верно, если четное то неверно.

Можете подтолкнуть или направить как можно сделать это?

На приемник присылаю 111111

Код:
module uart_rx (clk, rx, data, data_ready);

input   wire clk;
input   wire rx;
output  reg [5:0] data;
output  data_ready;


reg rx_ff1; // защелка для старта передачи 

always @(posedge clk)
        begin
        rx_ff1 <= rx;  
        end
// отлавливаем старт-бит

wire spad = ~rx_ff1;
// состояние приемника

reg receive;
// для корректной симуляции

initial receive = 0;

//если старт бит то включаем режим приема
//если приняли выключаем

always @(posedge clk)

 if (spad) 
  receive <= 1'b1;
   else 
    if (data_ready)
     receive <= 1'b0;

//cигнал начала приема
//Для инициализации счетчиков

wire start = ~receive & spad;

//поскольку у нас clk в 2 раза быстрее rx, делаем делитель
reg [2:0] count_os;

always @(posedge clk)

 if (start)
  count_os <= 4'b101;
   else
    if(receive)
     count_os <= count_os + 1'b1;
//при переполнении счетчика-делителя выводим бит из входных данных
wire get_bit = ~|count_os;

//счетчик принятых данных
// Как примем 6 бит можно останавливаться

reg [3:0] count_byte;

always @(posedge get_bit or posedge start)      
begin

if (start)
 count_byte <= 0;
  else 
   count_byte <= count_byte + 4'b1;
end

wire data_ready = (count_byte == 7);

//сдвигаем регистр данных на одну позицию вправо,
//и пишем принятый бит в старший бит

always @(posedge get_bit)
  if (!data_ready) data <= {rx_ff1, data[5:1]};
endmodule

module test_uart_rx;
 reg clk;
 reg rx;

 wire data_received;
 wire [5:0] data_in;

uart_rx u_rx (clk, rx, data_in, data_received);


always
  #11 clk = ~clk;

initial
  begin      
    clk = 0;
     rx = 1;
  
  #205 rx = 0;
  #173 rx = 1;
  #173 rx = 1;
  #173 rx = 1;
  #173 rx = 1;
  #173 rx = 1;
  #173 rx = 1;
               
end
initial
  #2000 $finish;

endmodule

1.PNG

Share this post


Link to post
Share on other sites

lyaksandrov

Не могу понять, как мне сделать переключение скорости. Нужна переменная любая, в которую я могу до запуска программы записать 1 или 0, это и будут скорости, а как мне в тестбенче это сделать? Я понимаю, что нужно задавать условие, но не знаю как это написать(

С четностью разобрался

Edited by lyaksandrov

Share this post


Link to post
Share on other sites

lyaksandrov
12.05.2022 в 01:08, sazh сказал:

Конечно, это не работает, описание оставляет желать лучшего, но функционально все правильно. Что удивительно, вы попытались реализовать UART в стиле UART Электроника 60 (когда то была настольным компьтером). Минимум ресурсов.

Остальное - дело наживное. Я влоб подправил. Чтоб работало.

Но это, функционально - Ваше. Так что не хуже того, что сейчас в учебниках ваяют. 

uart.zip 1 kB · 2 скачивания

Здравствуйте, я посмотрел код, который вы прислали, действительно все работает, но не немного не могу понять как, особенно в тестбенче. И можно спросить еще, что нужно исправить что бы принималось не 8 бит данных, а 6. Еще на счет скорости хотел узнать, можно ли сделать что бы она переключалась допустим значение 1 это будет скорость 57600, а значение 0 будет 115600?

Share this post


Link to post
Share on other sites

sazh
4 часа назад, lyaksandrov сказал:

Здравствуйте, я посмотрел код, который вы прислали, действительно все работает, но не немного не могу понять как, особенно в тестбенче. И можно спросить еще, что нужно исправить что бы принималось не 8 бит данных, а 6. Еще на счет скорости хотел узнать, можно ли сделать что бы она переключалась допустим значение 1 это будет скорость 57600, а значение 0 будет 115200?

Вы сами выложили проект на 6 бит данных без бита паритета (Получается - это не Ваш проект). Я подправил под 8 с битом паритета. Тестбенч тоже самый простой (Но требуется минимальный набор знаний). Чтобы переключать скорость, нужно ввести признак переключения (вход), по которому можно будет подставлять нужное значение Divider (породить мультиплексор). Смысла в этом нет, ибо не понятно, кто этим входом будет управлять. Да и передатчику откуда будет известно об изменении скорости на прием. Без преподавателя такой проект с нуля (без знаний в схемотехнике ( поэтому большинство предпочитает автоматом состояний отделаться) Вам сознательно не потянуть.

Share this post


Link to post
Share on other sites

lyaksandrov
14 часов назад, sazh сказал:

Вы сами выложили проект на 6 бит данных без бита паритета (Получается - это не Ваш проект). Я подправил под 8 с битом паритета. Тестбенч тоже самый простой (Но требуется минимальный набор знаний). Чтобы переключать скорость, нужно ввести признак переключения (вход), по которому можно будет подставлять нужное значение Divider (породить мультиплексор). Смысла в этом нет, ибо не понятно, кто этим входом будет управлять. Да и передатчику откуда будет известно об изменении скорости на прием. Без преподавателя такой проект с нуля (без знаний в схемотехнике ( поэтому большинство предпочитает автоматом состояний отделаться) Вам сознательно не потянуть.

Я понимаю, что сам не потяну, поэтому и обратился на форум за помощью. 

Я понимаю логику, как должно все работать, но так как не хватает званий в программировании не могу реализовать это сам. Если бы было больше времени, я и бы смог осилить это, но к сожалению его нет, так как это задание по учебе).

На счет скорости, я понимаю, что нужно сделать мультиплексор, на него подавать значения полученные делителем при разных скоростях и потом выбирать нужную скорость. Не было бы проблем, если бы нужно было бы сделать на 1 скорости, я бы смог это реализовать используя разные источники. Но как сделать переключатель программно, не понимаю. Преподаватель объяснил схемотехнику, ну а остальное дело за мной, но что-то как-то не выходит(

Share this post


Link to post
Share on other sites

Maverick_

uart.vuart_tb.vuart_hw_test.v

 

посмотрите такую реализацию с 2-мя тестбенчами

PS Под посмотреть я понимаю запустить симуляцию с разными тестбенчами, вывести с описаний реализации UART все сигналы на waveform и попробовать разобраться как работает.

Далее попробовать например поменять скорость и опять посмотерть симуляцию...

Здесь найдете некоторое объяснение/рекомендации по реализации UART

https://github.com/Paebbels/PicoBlaze-Library/blob/master/documentation (Xilinx)/UART - 200 MHz UART with Internal 16-Byte Buffer [XAPP223][2008.04.24][v1.2].pdf

Share this post


Link to post
Share on other sites

Guest
This topic is now closed to further replies.