Цитата(sergtsa @ Jul 12 2011, 02:17)

я тож решал тест про прием-передачу данных по двум линиям.
Ого!
А что ж приемник, не обошелся без тактовой частоты (которая в три раза выше)?

Кстати, вот мой вариант.
Код
// Задача. Имеется 4-х проводной последовательный канал. 2 провода - туда, 2 провода обратно (и ещё общий провод пятый).
// Физическая реализация: Каждый бит передаётся перепадом сигнала.
// Если бит равен 1, то перепад происходит на одной линии, а если 0, то на другой.
// Протокол не предполагает, что частота следования битов известна или хотя бы постоянна.
// Соответственно, передатчик должен работать по одному клоку, по которому передаётся каждый очередной бит.
// А приёмник работает только по самим перепадам сигналов на линиях. Написать проект-функцию сериалайзера/десериалайзера на языке Verilog.
// Параметрами функции являются ширина передаваемых/принимаемых данных. Продемонстрировать симуляцией работоспособность проекта.
// Решение. Передатчик построен на сдвиговом регистре и двух Т-триггерах.
// Перепады на одной линии возникают при выдаче из регистра единицы, на другой - при выдаче нуля.
// Приемник восстанавливает тактовую частоту из линии путем операции исключающего ИЛИ над двумя входными сигналами.
// Для нормальной работы приемнику требуется тактовый сигнал со стороны принимающей аппаратуры.
// Частота его должна быть не менее битовой скорости в канале.
// С его помощью формируются стробы для подачи на тактовый вход приемного сдвигового регистра.
// Кроме того, он обеспечивает однозначное восприятие данных в канале при одновременном (или почти одновременном) поступлении
// перепадов в обоих сигналах на линии (о чем в условии задачи не сказано).
// На вход приемного сдвигового регистра данные поступают после применения операции исключающего ИЛИ между текущим значением одной из линий
// и ее же значением, задержанным на половину тактового интервала в линии.
// Сигналы управления чтением данных их приемника отсутствуют, но могут быть легко добавлены для получения нужного интерфейса.
// Загрузка данных для передачи происходит при установке в единицу сигнала load, в течение всего времени передачи он должен равняться ннулю,
// что тоже может быть легко изменено.
// Длина передаваемого слова задается параметром N.
// Проект выполнен для ПЛИС Altera, симуляция проведена для микросхемы серии MAXII (автовыбор).
module zzz
#(parameter N=8)
(
input txclk,
input load,
input [N-1:0] to_line,
output [1:0] txd,
input [1:0] rxd,
input rxclk,
output [N-1:0] from_line
);
//transmitter
reg tx;
lpm_shiftreg serialiser (.clock (txclk), .data (to_line), .load (load), .shiftout (tx)); defparam serialiser.lpm_width=N;
tffe txd_one (.t(tx),.clk(txclk),.ena(!load),.q(txd[1]));
tffe txd_zero (.t(!tx),.clk(txclk),.ena(!load),.q(txd[0]));
//receiver
reg line_clk;
dff (.d(rxd[1]^rxd[0]),.clk(rxclk),.q(line_clk));
reg rec_clk_lh;
dff (.d(1'b1),.clk(line_clk),.clrn(rxclk),.q(rec_clk_lh));
reg rec_clk_hl;
dff (.d(1'b1),.clk(!line_clk),.clrn(rxclk),.q(rec_clk_hl));
or clk_recover (rec_clk,rec_clk_lh,rec_clk_hl);
reg next_data;
dff rxd_next (.d(rxd[1]),.clk(!rec_clk),.q(next_data));
xor serial_data (rx, rxd[1], next_data);
lpm_shiftreg deserialiser(.clock(rec_clk),.shiftin(rx),.q(from_line)); defparam deserialiser.lpm_width=N;
endmodule