Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Программируемые логические схемы и их применение»

Ответ:

Отправлено SAZH 03 октября 2007 г. 22:53
В ответ на: Ставил теже Яйца. Можно было бы предположить что ConterRX кривеет где то но тестовый вывод явно указывал что он сброшен (по осцилографу конечно смотрел). отправлено PeterD 03 октября 2007 г. 22:46

Я думаю, дело в Ваших переходах в case. Наверно в case 0: не переходит. Да и как смотрите. Наверно все 1 надо посылать, чтобы от старта засинхронизироваться. Надо все смотреть. И моделирование все же должно все показать.
Все дело в том, что старт ИМХО надо анализировать отлично от остальных битов. И уровень 1 в линии тоже задействовать.
Могу свой набросок предоставить. мнтересно, будет у вас в железе работать.

`timescale 1 ns / 1 ns
module rxd_232
#( parameter xtal_clk = 20_000_000,
parameter baud = 115200
)
(
input sys_clk,
input rst,
input rxd,
output reg [7:0] rg_rs232_out,
output reg ochibka_kadra,
output reg int_rs232_cpu
);


localparam clk_div = xtal_clk / baud;
localparam cwidth = clog2(clk_div);


reg [1:0] dff_rxd;
reg [1:0] dff_rst;
reg [cwidth-1:0] ct_period;
reg [3:0] ct_bit;
reg dff_enable_work;
reg stop;
reg [8:0] rg_rs232;

wire clr_enable_work;

//////////////////////////////////////////////////////////////////////////////////
function integer clog2 (input integer depth); //// this function calculates ceil(log2(depth))
integer i, result; //// depth >= 2;
begin
result=0;
for (i=0; 2**i result = i+1;
clog2 = result;
end
endfunction
///////////////////////////////////////////////////////////////////////////////////

assign clr_enable_work = dff_rst[1] | stop | (dff_rxd[1] & (dff_enable_work == 1'b0));
assign seredina_bita = (ct_period == (clk_div/2)-1);

always @ (posedge sys_clk)
begin
dff_rst <= {dff_rst[0], rst};

if (dff_rst[1]) dff_rxd <= 2'b11;
else dff_rxd <= {dff_rxd[0], rxd};

if (clr_enable_work) dff_enable_work <= 1'b0;
else if (seredina_bita) dff_enable_work <= 1'b1;

if (clr_enable_work) ct_period <= {cwidth{1'b0}};
else if (ct_period == clk_div-1) ct_period <= {cwidth{1'b0}};
else ct_period <= ct_period + 1'b1;
////////////////////////////// формирователь 8 отсчетов на несущей частоте baud
///////////////////////////// (без бита паритета)
if (dff_enable_work == 1'b0) ct_bit <= 4'h0;
else if (seredina_bita & (ct_bit != 4'h8)) ct_bit <= ct_bit + 1'b1;
///////////////////////////////////////////
if (seredina_bita & dff_enable_work) rg_rs232[ct_bit] <= dff_rxd[1];

stop <= seredina_bita & (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



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 234:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru