Перейти к содержанию
    

TO NIOS:

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

 

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

 

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

На компе контролируем правильность работы по сумме скан-кодов.

 

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

post-2972-1152777231_thumb.jpg

 

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

post-2972-1152777222_thumb.jpg

 

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

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

 

 

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

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


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

Сам текст понятен. А вот идея всегда будет вызывать споры. Да и кто, когда будет 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

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


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

Сам текст понятен. А вот идея всегда будет вызывать споры. Да и кто, когда будет reset нажимать.

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

 

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

 

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

 

Кста на AHDL я (как и Вы) тоже прием кадра разворачивл временой диаграмой по счетчикам - мне тоже нравится так.

Но на Verilog'e решил попробовать по-другому - идейку подкинули про МЖФ -> и получилось :)

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


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

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

 

Да и раасогласование в скорости приемника и передатчика может быть как сплюсом, так и с минусом

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


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

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

 

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

 

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

 

 

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

 

А они не объяснили -- на фига МЖФ, если без него работает идеально надёжно?

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


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

Reset не обязателен.

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

Подается от простого монитора питания, когда установилось.

 

 

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

Но ваш метод тоже схватит "левый ноль" >=1/2 такта - он же проверит снова в середине -> и будет принимать ...

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


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

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

Подается от простого монитора питания, когда установилось./////

А вот это уже интересно. Причем тут включение плис, и тем более его структура. Это работает на любой структуре Альтеры, у Xilinx работал только на FPGA 3000 тысячнике без всяких там прммитивов установки сетапов.

Если речь об Эктел, снимаю шляпу. Такой хоккей нам не нужен.

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


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

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

Подается от простого монитора питания, когда установилось./////

А вот это уже интересно. Причем тут включение плис, и тем более его структура. Это работает на любой структуре Альтеры, у Xilinx работал только на FPGA 3000 тысячнике без всяких там прммитивов установки сетапов.

Если речь об Эктел, снимаю шляпу. Такой хоккей нам не нужен.

Что-то вы не сразу догадались про определение не SRAM-ПЛИС :)

Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией.

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


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

Что-то вы не сразу догадались про определение не SRAM-ПЛИС

Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией./////

 

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

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


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

Что-то вы не сразу догадались про определение не SRAM-ПЛИС

Не сталкивались видать... Там просто нет цепей сброса по причине того, что универсальная ячейка может быть как тригером так и логической функцией./////

 

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

 

Не думаю, что хорошая идея завязыватся на сигнал 1 на линии. От него ничего толового не сделать.

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

 

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

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


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

Для чего брать частоту больше раз в 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:

 

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

Изменено пользователем sanek78

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


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

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

 

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

Напишите здесь о результатах?!

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


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

Я диплом пишу, поэтому результат может быть только на уровне прототипа(пока). Но соединить DSP с FPGA(Starter Kit) получилось, данные передаются по SCI на 115к. Соединил двумя проводами на 15см. Интересно правда посмотреть что получится, когда рядом преобразователь частоты начнет долбить. Где-то через месяц напишу, как алгоритм с помехами справляется.

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


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

Товарищи, а если FPGA (ACEX) висит на PCI, то чем лучше тактировать

UART (использовать PCI клок или внешний завести) ?

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


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

Товарищи, а если FPGA (ACEX) висит на PCI, то чем лучше тактировать

UART (использовать PCI клок или внешний завести) ?

А посчитать влом? А со вторым тактовым - Вы готовы к работе с двумя клоковыми доменами?

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...