реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> RS-232 + FPGA
sazh
сообщение Jul 12 2006, 18:45
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



TO NIOS:
А не могли бы Вы привести схему Вашего приемника. Для ознакомления. Ведь она явно отлична от классического представления. И на словах ничего не понятно.
Go to the top of the page
 
+Quote Post
javalenok
сообщение Jul 13 2006, 00:42
Сообщение #47


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 18-02-06
Пользователь №: 14 469



Цитата(NiOS @ Jul 12 2006, 18:05) *
1. Да согласен - есть лишний такт на выходе МЖФ, впесто простого assign <wire>=...
Но он ничего не меняет в алгоритме. Он нужен тк FPGA - "любит" синхронный дизайн.


Если любит, то почему бы тогда конвеер из 10-ти лишних тактов не впиндюрить. Или из 100? Кашу маслом не испортишь.


Цитата(NiOS @ Jul 12 2006, 18:05) *
2. Счетчик я использую только, чтобы считать отсчеты (до 3х) внутри бита.

Так, значит счётчик сэмплов всё-таки сущетвует. Можно конечно делать выборку с каждым отсчётом и потом голосовать. На мой взгдяд -- параноя. Проще выбирать один раз в серёдке, как все делают. Дополнительные биты как раз употребить счётчик 4-х битный. Да и без разницы наверное, что делать многобитный делитель основной частоты до 3х baudrate или перекинуть пару бит из него на SampleCnt для 16х baudrate, а точность вычисления центра битового интервала повысится.


Цитата(NiOS @ Jul 12 2006, 18:05) *
САМИ биты я не считаю!

Как можно не считая биты узнать, что кадр окончился?



Цитата(NiOS @ Jul 12 2006, 18:05) *
А есть ли смысл разговаривать с человеком, который даже не удосужился перед ответом "не слышал" попробовать посмотреть в любои поиске слово "стробирование". twak.gif
А особено который имеет дело с ПЛИС!!


В моём поримании, стробирование = выборка, стробирующий сигнал -- синхросигнал. Какое отношение данный процесс имеет к ФНЧ я совершенно не представляю. Вообще, каждый вкладывает свой смысл в данное слово. Так что разъяснение. Особенно это отноится любителям изобретать собственные термины вроде "бодовыех байтов". Но раз уж они обижаются на просьбу о разъяснении смысла своих мудрёных слов, предпочитая вместо этого удар промеж глаз, я умываю руки. Себя по голове ударь.

Цитата
TO NIOS:
А не могли бы Вы привести схему Вашего приемника. Для ознакомления. Ведь она явно отлична от классического представления. И на словах ничего не понятно.

Во-во, мозги всем запарил якобы оригинальной простотой своей схемы, магическим сдвигом, не требующим синхронизации и счётчиков, когда на самом деле она содержит лишние компоненты.
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 13 2006, 07:26
Сообщение #48


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



//Как можно не считая биты узнать, что кадр окончился?

Это пишу уже в третий раз - до приема регистр[9:0] (в который будем сдвигать) устанавливаем ВСЕМИ "1", сдвигаем ТАКЖЕ и стартовый бит(который "0") - стартовый "0" добрался до скажем конца (регистр[9] ==0) -> это значит в Вашем понимании "кадр" принялся.

под "бодовым байтом" я понимаю информационный "байт" + служебные биты(старт, стопы, четность).
В вашем понимании это кадр - что тоже не коректно,
тк кадром называют отдельный сегмент на более высоком уровне в транспортной моделе OSI.
Хотя Кто-то нам подскажет точное название, приведенное в стандарте.

А стробирование - думаю для любого инженера работающего с ПЛИС понятно как - пропуск асинхронного входа через тригер с глобальной тактовой ПЛИС


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 13 2006, 08:01
Сообщение #49


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sazh @ Jul 12 2006, 22:45) *
TO NIOS:
А не могли бы Вы привести схему Вашего приемника. Для ознакомления. Ведь она явно отлична от классического представления. И на словах ничего не понятно.


Привожу проект. Но тк это был мой первый пробный проект, то я в нем отрабатывал саму идею реализации. Поэтому это не универсальный стандарт RS232, а конкретная задача, правильность выполнения в живую проверялась в HyperTerminale Винды.

Задача: скорость 115200, без паритета, 8 байт, один стоповый. Принимаем "байт" от компа -> суммируем с предыдущим принятым "байтом" и отправляем результат обратно в комп.
На компе контролируем правильность работы по сумме скан-кодов.

Схема блоками (наглядная) (МЖФ входной, FSM и "общий блок")
Прикрепленное изображение


Простой FSM (в графике наглядней)
Прикрепленное изображение


Сам код "Общего блока" - по нему наврное будет больше всего вопросов(коментил мало) - задавайте.
Код
parameter T = 1;

//Mj_filter bitov--------------------------------------------
wire en_bit;
reg [2:0] dd;
always @ (posedge i_rst or posedge i_clk)
  if (i_rst)
      dd[2:0] <= #T 3'b111;  
  else if (en_bit)
           dd[2:0] <= #T {dd[1:0], rx_filt};

reg rx_bit;
always @ (posedge i_rst or posedge i_clk)
  if (i_rst)
      rx_bit <= #T 1'b1;
  else if (en_bit)
           rx_bit <= #T (dd[0]&dd[1])|(dd[0]&dd[2])|(dd[1]&dd[2]);

//End Mj_filter bitov-----------------------------------------

//Counter clk - Из 40МГЦ получает утроенную 115200
reg [7:0] cnt;
always @ (posedge i_rst or posedge i_clk)
if (i_rst)
     cnt[7:0] <= #T 8'h0;  
else if (cnt[7:0] == 8'd144 ) cnt[7:0] <= #T 8'h0;  
      else
          cnt[7:0] <= #T cnt[7:0] + 8'h1;
//------------------------------------------------------------
//Counter 3x i_clk
reg [1:0] cnt_bit;        
always @ (posedge i_rst or posedge i_clk)
if (i_rst)
     cnt_bit[1:0] <= #T 2'h0;  
else if (cnt_bit[1:0] == 2'h3)  cnt_bit[1:0] <= #T 2'h0;  
else if ((st_rx | st_tx) & cnt==7'd114)  
            cnt_bit<=#1 cnt_bit + 1;
//----------------------------------------------------------------
// Main Block
reg [9:0]rx_tx;      // Типа общего сдвигового регистра для передачи и приема
reg [7:0] rx_reg;    // Регистр для хранения предыщего принятого значения, с которым симмирется нынешнее (циклически)  
  always @ (posedge i_rst or posedge i_clk)
   if (i_rst) begin
               rx_tx[9:0] <= #T 10'h0;
               rx_reg[7:0]<= #T 8'h0;         // Save RX data
              end
   else if(st_idle)
           rx_tx <= #T 10'h3ff;
   else if(st_rx & cnt_bit==2'h3)
           rx_tx[9:0] <= #T {rx_bit,rx_tx[9:1]};
   else if(st_ready)  begin
                       rx_reg[7:0]<= #T rx_tx[8:1] + rx_reg[7:0];
                       rx_tx[8:1] <= #T rx_reg[7:0];
                      end
   else if(st_tx & cnt_bit==2'h3)
           rx_tx[9:0] <= #T {1'b1,rx_tx[9:1]};
//---------------------------------------------------------------

//
assign en_bit = (st_rx & cnt==7'd114) ? 1'b1:1'b0;
assign end_rx = (st_rx & rx_tx[0]==1'b0 & rx_tx[9])?1'b1:1'b0;
assign end_tx = (rx_tx[9:0] == 10'h3ff & st_tx) ? 1'b1:1'b0;
assign o_tx   = (st_tx)?rx_tx[0]:1'b1;
//---------------------------------------------------------------

assign o_data[3:0] = rx_reg[3:0];


И общий проект модуль на Verilog
Прикрепленный файл  RS232.zip ( 1.45 килобайт ) Кол-во скачиваний: 271



PS Принимаются замечания по стилю описания на Verilog!!! Совершенству - нет предела.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 13 2006, 09:46
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Сам текст понятен. А вот идея всегда будет вызывать споры. Да и кто, когда будет reset нажимать.
Это монолог. Отвечать не обязательно. В качестве ответа приемник (без бита паритета)

module rxd_232
(
input ti_20, ///// 20mhz // 115200
input rxd,
output reg [7:0] rg_rs232_out,
output reg ochibka_kadra,
output reg int_rs232_cpu
);

reg [1:0] dff_meta_rx;
reg [7:0] ct_period;
reg [3:0] ct_bit;
reg dff_enable_work;
reg stop;
reg [8:0] rg_rs232;

wire clr_enable_work;

always @ (posedge ti_20)
begin
dff_meta_rx <= {dff_meta_rx[0], rxd};
if (dff_meta_rx[1] & ~dff_enable_work) ct_period <= 8'h00;
else if (ct_period == 8'd173) ct_period <= 8'h00;
else ct_period <= ct_period + 1'b1;
if (dff_enable_work == 1'b0) ct_bit <= 4'h0;
else if ((ct_period == 8'd87) & (ct_bit != 4'h8)) ct_bit <= ct_bit + 1'b1;
end

assign clr_enable_work = stop | (dff_meta_rx[1] & ~dff_enable_work);

always @ (posedge ti_20 or posedge clr_enable_work)
begin
if (clr_enable_work) dff_enable_work <= 1'b0;
else if (ct_period == 8'd87) dff_enable_work <= 1'b1;
end

always @ (posedge ti_20)
begin
if ((ct_period == 8'd87) & dff_enable_work) rg_rs232[ct_bit] <= dff_meta_rx[1];
stop <= (ct_period == 8'd87) & (ct_bit == 4'h8);
int_rs232_cpu <= stop;
if (stop) begin
rg_rs232_out <= rg_rs232[7:0];
ochibka_kadra <= ~rg_rs232[8]; end
end

endmodule
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 13 2006, 10:02
Сообщение #51


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sazh @ Jul 13 2006, 13:46) *
Сам текст понятен. А вот идея всегда будет вызывать споры. Да и кто, когда будет reset нажимать.

reset должен быть, потомучто нету такого блока (для не SRAM ПЛИС проект)

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

Мне он кажется проще - избавились от некоторых критичных элементов (хотя бы точность определения старта)

Кста на AHDL я (как и Вы) тоже прием кадра разворачивл временой диаграмой по счетчикам - мне тоже нравится так.
Но на Verilog'e решил попробовать по-другому - идейку подкинули про МЖФ -> и получилось smile.gif


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 13 2006, 10:13
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Reset не обязателен. Система сама должна переходить в начальное состояние по прошествии в нашем случае 11 тактов значения 1 в линии. Ваша идея не отличается простотой. Она выскальзывает как уж при попытке анализа. Да и невозможно при спорности самой идеи проверить досканально все частные возможные случаи. Например промоделируйте состояние 20 тактов 1, четверть такта 0, 20 тактов 1.

Да и раасогласование в скорости приемника и передатчика может быть как сплюсом, так и с минусом
Go to the top of the page
 
+Quote Post
javalenok
сообщение Jul 13 2006, 12:32
Сообщение #53


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 18-02-06
Пользователь №: 14 469



Теперь понял. Отслеживалка числа принятых битов совмещёна в сдвиговом регистре с данными. Прежде не доходило, как такое возможно, хотя протогол rs232 основан на этой идее. В таком случае отдельный счётчик бит действительно не нужен. biggrin.gif

Но. Попробуте как я грузить битики данных с rs232 прямо в регистр контроллера (контроллер -- набор регистров команд с логикой для управления FPGA системой, команды принимаются по с компьютера по rs232). Придётся выход каждого регистра инициализировать единицами и снабжать выходной связью на rs232 приёмник, ведь стартовый бит будет путешествовать каждый раз по новому регистру. Куча регистров -- много нелокальных связей. Компактный счётчик возле rs232-автомата выйдет дешевле. К тому же совершенно не обязательно, что все загружаемые таким непосредственным образом регистры будут 8-битные.

Да и сам сброс в единицы как реализуется? 9 мультиплксоров подле каждой ячейки данных выбирают между 1 и shift_in. Может 3-битный счётчик принятых битов всё же экономнее?


Цитата
идейку подкинули про МЖФ -> и получилось


А они не объяснили -- на фига МЖФ, если без него работает идеально надёжно?
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 13 2006, 14:48
Сообщение #54


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sazh @ Jul 13 2006, 14:13) *
Reset не обязателен.

Этот ресет нужен обязательно при включении питания ПЛИС, а не для проекта. (я же говорю это НЕ SRAM-ПЛИС, а флеш)
Подается от простого монитора питания, когда установилось.


кста про четверть такта "0" - он и не поймет что был ноль - так и будет единица. А вот если >=2/3 такта "0", тогда есть вероятность что схватит "левый старт".
Но ваш метод тоже схватит "левый ноль" >=1/2 такта - он же проверит снова в середине -> и будет принимать ...


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 13 2006, 16:49
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Этот ресет нужен обязательно при включении питания ПЛИС, а не для проекта. (я же говорю это НЕ SRAM-ПЛИС, а флеш)
Подается от простого монитора питания, когда установилось./////
А вот это уже интересно. Причем тут включение плис, и тем более его структура. Это работает на любой структуре Альтеры, у Xilinx работал только на FPGA 3000 тысячнике без всяких там прммитивов установки сетапов.
Если речь об Эктел, снимаю шляпу. Такой хоккей нам не нужен.
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 18 2006, 09:08
Сообщение #56


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sazh @ Jul 13 2006, 20:49) *
Этот ресет нужен обязательно при включении питания ПЛИС, а не для проекта. (я же говорю это НЕ SRAM-ПЛИС, а флеш)
Подается от простого монитора питания, когда установилось./////
А вот это уже интересно. Причем тут включение плис, и тем более его структура. Это работает на любой структуре Альтеры, у Xilinx работал только на FPGA 3000 тысячнике без всяких там прммитивов установки сетапов.
Если речь об Эктел, снимаю шляпу. Такой хоккей нам не нужен.

Что-то вы не сразу догадались про определение не SRAM-ПЛИС smile.gif
Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 18 2006, 18:57
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Что-то вы не сразу догадались про определение не SRAM-ПЛИС
Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией./////

Я не стал догадываться. Еще раз повторю. Нет необходимости в цепях сброса. Не имеет значения в каком состоянии все триггеры по включению. Дались Вам эти нули. Система сама должна переходить в начальное состояние при наличии в линии 1. И при этом подстраивать свои внутренние часы по каждому стопу. Иначе грош цена такой схеме.
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 19 2006, 06:52
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sazh @ Jul 18 2006, 22:57) *
Что-то вы не сразу догадались про определение не SRAM-ПЛИС
Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией./////

Я не стал догадываться. Еще раз повторю. Нет необходимости в цепях сброса. Не имеет значения в каком состоянии все триггеры по включению. Дались Вам эти нули. Система сама должна переходить в начальное состояние при наличии в линии 1. И при этом подстраивать свои внутренние часы по каждому стопу. Иначе грош цена такой схеме.


Не думаю, что хорошая идея завязыватся на сигнал 1 на линии. От него ничего толового не сделать.
Я же написал, что Вы правильно предположили производителя ПЛИС - поэтому сигнал сброса нужен по-определению(поверьте!).

А по подстраивание по стопу я не понял - или, если это Вы совместно с начальным состоянием при наличие 1 на линии - то я про это уже написал.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
sanek78
сообщение Sep 26 2006, 09:15
Сообщение #59


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 31-08-06
Пользователь №: 19 985



Цитата(NiOS @ May 20 2006, 21:49) *
Для чего брать частоту больше раз в 8, чем бодовая??? Я же писал, что нужна частота только в 3!!! раза больше, чем бодовая, один МЖФ, ну и второй МЖФ для фильтрации входа.

Могу привести код работающего проекта на Verilog’e (хотя он только для скорости 115.200, без проверки паритета и с одним стоповым)

Как это происходит (повторяюсь и уточняю).

При входе сигнала RX (UART’a) постоянно работающий входной МЖФ– для фильтрации коротких пичков на линии. Принцип работы МЖФ - из трех последовательных отсчетов он выбирает 2 совпадающих.

А дальше счетчик работающий от основной частоты 40 МГц считает до ‘d114 и сбрасывается – получается частота 3*бодовая (крутится постоянно без сброса по стартовому биту!)

А теперь, как счетчик == 114 я на один такт разрешаю продвинуть данные во втором МЖФ.
Мне без разнице, в какой части «бодового» бита, на МЖФ защелкнутся три значения (может даже одно значение попасть из другого «бодового» бита, а может попасть на перепад(в обычном RS-232 он пологий получается) – для такого подхода это «фиолетово») -> а второй счетчик считает, когда (первый счетчик==114) уже 3 раз и на выходе второго МЖФ получаю значение «бодового» бита, которой и вдвигаю.

Когда автомат, находясь в «idle», получил значение «бодового» бита «0» -> это стартовый -> задвигаю в регистр [9:0] (в «idle» инициализированный всеми «1») -> как стартовый «0» добрался до конца регистра [9:0] -> всё посылка принята!

И не нужна НИКАКАЯ синхронизация при стартовом бите, и внутри бита – просто по двум из трех значений определяется значение бита.

Дописал - посмотрел – слов много, а объяснил ли?
В общем, если что не понятно на буднях смогу привести код (это более универсальный язык =8) )



Спасибо большое за идею(или даже за решение). Сделал как Вы советуете - работает как часы. a14.gif

Упс. Тут уже даже код появился. Я правда все равно в VHDL писал smile.gif

Сообщение отредактировал sanek78 - Sep 26 2006, 09:27
Go to the top of the page
 
+Quote Post
Kopart
сообщение Sep 27 2006, 18:01
Сообщение #60


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(sanek78 @ Sep 26 2006, 13:15) *
Спасибо большое за идею(или даже за решение). Сделал как Вы советуете - работает как часы. a14.gif


О! Если это Вы будете и дальше эксплуатировать в устройстве, то можно будет получить реальную проверку работоспособности такой реализации...
Напишите здесь о результатах?!


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 11:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.0158 секунд с 7
ELECTRONIX ©2004-2016