Как мне разработать Serial to Parallel Buffer в Verilog, используя только часы?

Я собираюсь разработать преобразователь последовательного интерфейса в параллельный в Verilog, который преобразует последовательный вход с быстрым тактовым сигналом в параллельный вход с более медленным тактовым сигналом. Я пробовал следующий код, который работает в RTL, но не проверяет Cadence Conformal. nclk в 16 раз быстрее clk. Последовательные данные поступают со скоростью nclk, а параллельные данные должны выходить с частотой clk.

sEEG - Последовательный вход eegOut - Параллельный выход

У меня могут быть только clk и nclk в качестве рабочих ссылок из-за ограничений контактной площадки с лентой.

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

module deserializer(sEEG, nclk, clk, eegOut);
    input sEEG;
    input nclk,clk;
    reg [15:0] temp;
    output reg [15:0] eegOut;
    reg [4:0] i;
    
    always @(negedge nclk) begin
        temp[i] = sEEG;
        i = i + 1;
    end

    always@(posedge clk) begin
        i<=0;
        eegOut <= temp;
    end
endmodule

person Vinay Egk    schedule 19.07.2020    source источник


Ответы (1)


Я считаю, что вам нужно использовать четыре бита для индексации 16 элементов. Если вы параметризуете модуль, это можно сделать с помощью:

# (parameter WIDTH = 16)

затем позже используйте его как:

localparam BIT_SEL = $clog2(WIDTH); //..this should give you "4" if WIDTH = 16
reg [BIT_SEL-1:0] i;

Кроме того, вы можете захотеть включить синхронизатор часов, вам не нужны проблемы с метастабильностью, простой способ сделать это - включить двойные триггеры, практически буферизовать данные и реплицировать их в следующий медленный тактовый цикл (добавляет 1 медленная задержка тактового цикла). Итак, возможно, это сработает:

module deserializer
# (parameter WIDTH = 16)
(sEEG, nclk, clk, eegOut);
    input sEEG;
    input nclk,clk;
    reg [WIDTH-1:0] temp;
    reg [WIDTH-1:0] temp_reg; //..synchronizer
    output reg [WIDTH-1:0] eegOut;
    
    always @(negedge nclk) begin
        temp[WIDTH-2:0] <= temp[WIDTH-1:1];
        temp[WIDTH-1]   <= sEEG;
    end

    always@(posedge clk) begin
        temp_reg <= temp;
        eegOut   <= temp_reg;
    end
endmodule
person m4j0rt0m    schedule 19.07.2020