output ERROR; // дается определение ERROR как выхода (а не входа)
wire RxDgood, RxCgood, RxDbad, RxCbad; // список проводов главного модуля
DTE DTE1(ERROR, RxCbad, RxDbad); // Структурная модель BER-тестера
Line Line1 (RxCbad, RxDbad, RxCgood, RxDgood); // на основе трех модулей:
DCE DCE1(RxCgood, RxDgood); // DTE, Line и DCE (DTE1, Line1 и //DCE1)
endmodule // стандартное оформление конца модуля
4.2.2. Файл BER-DTE_module.v
module DTE(out1, in1, in2); // Наименование модуля, список выходов и входов
input in1, in2; // Входы
output out1; // Выход
parameter M=5, N=3; // М - длина регистра, N - точка подключения
// обратной связи. Возможные сочетания М и N:
// 3 2, 4 3, 5 3, 6 5, 7 6, 9 5, 10 7, 11 9, 15 14, 17 14,
// 18 11, 20 17, 21 19, 22 21, 23 18, 25 22, 28 25, 29 27,
// 31 28, 33 20, 35 33, 36 25, 39 35
reg [1:M] B; // Описание М-разрядного регистра В
reg TT; // Описание D-триггера как одноразрядного регистра
wire D_input_TT; // Описание провода
assign out1 = TT, // Утверждается, что состояние выхода out1
// отображает состояние D-триггера
D_input_TT = B[N] ^ B[M] ^ in2; // Утверждается, что состояние провода
// D_input_TT определяется суммированием
// по модулю два трех переменных: B[N], // B[M] и in2
always begin: analyzer // BER-анализатор работает "всегда" следующим образом:
@(negedge in1) begin: prediction_and_check // по отрицательному фронту сигнала in1
TT = B[N] ^ B[M] ^ in2; // обновляется состояние триггера ТТ,
B = B >> 1; // код в регистре В сдвигается вправо на
// один разряд,
B[1] = in2; // после этого в освободившийся разряд В[1]
// помещается бит с входа in2
end // Окончание действий, вызванных отрицательным фронтом
// сигнала in1
end // Окончание конструкции "always"
endmodule
4.2.3. Файл BER-Line_module.v
module Line (out20, out10, in20, in10); // Наименование модуля, список выходов и входов
input in20, in10; // Входы
output out20, out10; // Выходы
reg errRxD, g3, errRxC; // Описание одноразрядных регистров
integer count, timing; // Описание абстрактных целочисленных переменных
initial count = 0; // Установка начального значения переменной
initial errRxD=0; // Установка начального состояния регистра
initial g3=0; // Установка начального состояния регистра
assign out10 = in10 ^errRxD; // Сигнал на выходе out10 формируется суммированием
// по модулю два сигналов in10 и errRxD
assign out20 = in20 ^errRxC; // Сигнал на выходе out20 формируется суммированием
// по модулю два сигналов in20 и errRxC
// "Всегда" по положительному фронту сигнала на входе in20:
always @(posedge in20) begin: ticking // Прибавляется единица к счетчикам тактов (такт -
count = count + 1; // период сигнала в проводе RxCgood);
timing = count - 1; // timing отстает от count на единицу
errRxC = g3; // перепись бита из регистра g3 в регистр errRxC
end
// "Всегда" с задержкой на 20 элементарных единиц времени, т. е. на один такт,
// проверяется, нужно ли формировать ошибку в линии RxD
always #20 if
((count == 39) // Положения ошибок в линии RxD (задаются согласно
|(count == 60) // выбранному варианту задания на курсовой проект)
|(count == 70)
|(count == 40)
|(count == 40)
|(count == 40)
|(count == 310)
|(count == 120)
|(count == 160)
|(count == 130))
begin
errRxD = 1; // ошибку формировать нужно
end
else
begin
errRxD = 0; // ошибку формировать не нужно
end
// "Всегда" с задержкой на 20 элементарных единиц времени, т. е. на один такт,
// проверяется, нужно ли формировать ошибку в линии RxC
always #20 if
((count == 9) // Положения ошибок в линии RxC (задаются согласно
|(count == 40) // выбранному варианту задания на курсовой проект)
|(count == 700)
|(count == 940)
|(count == 400)
|(count == 126)
|(count == 127)
|(count == 128)
|(count == 129)
|(count == 130))
begin
g3 = 1; // ошибку формировать нужно
end
else
begin
g3 = 0; // ошибку формировать не нужно
end
endmodule
4.2.4. Файл BER-DCE_module.v
module DCE (out40, out30); // Наименование модуля, список выходов и входов (входов // нет)
output out40, out30; // Выходы
reg g1; // Описание одноразрядного регистра g1
parameter M=5, N=3; // М - длина регистра, N - точка подключения
// обратной связи. Возможные сочетания М и N:
// 3 2, 4 3, 5 3, 6 5, 7 6, 9 5, 10 7, 11 9, 15 14, 17 14,
// 18 11, 20 17, 21 19, 22 21, 23 18, 25 22, 28 25, 29 27,
// 31 28, 33 20, 35 33, 36 25, 39 35
reg [1:M] A; // Описание М-разрядного регистра A
reg temp; // Описание одноразрядного регистра temp
initial A = 1; // Начальная установка регистра А
assign out30 = A[N] ^ A[M], out40 = g1; // Описание поведения выходов модуля
initial begin: stopper // Остановить процесс моделирования
#20040; $stop; // по истечении 2040 элементарных единиц
end // времени (один такт = 20 единицам времени)
always begin: RxC_generator // тактовый генератор:
#10 g1 = 0; // длительность паузы = 10 единицам времени
#10 g1 = 1; // длительность импульса = 10 единицам времени
end
always begin: pseudorandom_RxD // Генератор псевдослучайной последовательности битов
@(posedge g1) // По положительному фронту сигнала с регистра g1:
temp = A[N] ^ A[M]; // сохранение старого значения суммы по модулю два A[N] и A[M],
A = A >> 1; // сдвиг кода в регистре А на один разряд вправо,
A[1] = temp; // запись в первый разряд регистра А содержимого регистра temp
end
endmodule
Рис. 4.2. Пример временных диаграмм сигналов BER-тестера, полученных в результате моделирования. Из них следует, что ошибка при передаче синхросигнала по линии обнаруживается
Литература
1. Сухман С.М., Бернов А.В., Шевкопляс Б.В. Компоненты телекоммуникационных систем. Анализ инженерных решений. – М.: МИЭТ, 2002.– 220 с.
2. Hyde Daniel C. CSCI 320 Computer Architecture. Handbook on Verilog HDL.
Bucknell University, 1997.
Составитель – Б. В. Шевкопляс
31. 03. 2002