Асинхронный регистр
2016-07-12 21:19Регистр в подходе NCL logic выглядит так:

Попробуем изобразить его на Верилоге. Трудность в том, что Верилог не даёт простого способа обозначить Dual Rail encoding, то есть сигналы, представленные в виде пары проводов. Один из вариантов - задействовать состояние X, приписав ему другую семантику. Будем считать, что X - это когда оба провода логического сигнала принимают значения Low (то есть NULL). В этом случае асинхронный регистр может выглядеть так:

Попробуем изобразить его на Верилоге. Трудность в том, что Верилог не даёт простого способа обозначить Dual Rail encoding, то есть сигналы, представленные в виде пары проводов. Один из вариантов - задействовать состояние X, приписав ему другую семантику. Будем считать, что X - это когда оба провода логического сигнала принимают значения Low (то есть NULL). В этом случае асинхронный регистр может выглядеть так:
module areg #(
parameter WIDTH = 2 // ширина регистра
)(
input wire reset, // сброс
input wire [WIDTH-1:0] d, // данные на входе
input wire ki, // вход подтверждения
output reg [WIDTH-1:0] q, // данные на выходе
output wire ko // выход подтверждения
);
always @(*) begin
if (reset)
q <= {WIDTH{1'bx}}; // при сбросе выдаём NULL
else if (ki)
q <= d; // защёлкиваем вход (возможно, содержащий NULL-и)
else for (i=0; i<WIDTH; i=i+1)
if (d[i] === 1'bx)
q[i] <= 1'bx; // сбрасываем выход в NULL
assign ko = (^q === 1'bx); // выдаём подтверждение, пока выход не полностью определён
endmodule
Не знаю пока, вылезут ли грабли при симуляции из-за нештатного использования состояния X, или прокатит.
no subject
Date: 2016-07-13 20:10 (UTC)