Запись в регистр при падении тактовой частоты: проблема в коде - PullRequest
0 голосов
/ 31 октября 2019

Я написал код Verilog для файла регистра, имеющего 4 регистра (каждый 32-битный).

Ожидаемый результат Запись в файл реестра должна осуществляться с падающего фронта часов. Часы, переданные в файл регистрации: regClk (стробированные часы). Пожалуйста, игнорируйте тот факт, что стробированные часы создают проблемы, потому что это для назначения, и я должен использовать эти часы

Проблема Как видно на диаграмме часов, напишите в reg0 происходит при t = 10 (задний фронт regClk [0] ). Но после t = 10 спадающего фронта нет, но запись в reg0 все же происходит при t = 18. Аналогичная схема повторяется до reg4 . Всякий раз, когда для reg_n имеется спадающий фронт, то же значение записывается в reg_n-1 , даже если в его часах нет спадающего фронта.

IЯ прилагаю код и схему часов:

DFF с асинхронной очисткой

module dff(q,d,clk,reset);
    input d,clk,reset;
    output q;
    reg q;
    always @(negedge clk , posedge reset)
    begin
        if(reset)
            q<=1'b0;
        else
            q<=d;
    end
endmodule

Регистр 32 бит

module reg_32bit(q,d,clk,reset);
    input [31:0] d;
    input clk,reset;
    output [31:0] q;
    genvar j;
    generate for(j=0;j<32;j=j+1)
                begin: reg_loop
                dff flipflop (q[j],d[j],clk,reset);
                end
    endgenerate
endmodule

Файл регистрации

module regf(clk,reset,ReadReg1, ReadReg2, WriteData, WriteReg, RegWrite, ReadData1, ReadData2);
    input clk,reset,RegWrite;
    input [1:0] ReadReg1, ReadReg2, WriteReg;
    input [31:0] WriteData;
    output [31:0] ReadData1, ReadData2;

    wire [3:0] decOut;
    wire [3:0] regClk;
    dec_2to4 dec1(decOut,WriteReg);

    wire [31:0] RegFileAcc[0:3];

    assign regClk[0]=(decOut[0] & RegWrite & clk);
    assign regClk[1]=(decOut[1] & RegWrite & clk);
    assign regClk[2]=(decOut[2] & RegWrite & clk);
    assign regClk[3]=(decOut[3] & RegWrite & clk);

    reg_32bit regs1 (RegFileAcc[0],WriteData,regClk[0],reset);
    reg_32bit regs2 (RegFileAcc[1],WriteData,regClk[1],reset);
    reg_32bit regs3 (RegFileAcc[2],WriteData,regClk[2],reset);
    reg_32bit regs4 (RegFileAcc[3],WriteData,regClk[3],reset);

    bit32_mux4to1 mux1(ReadData1,{RegFileAcc[3], RegFileAcc[2], RegFileAcc[1], RegFileAcc[0]}, ReadReg1);
    bit32_mux4to1 mux2(ReadData2,{RegFileAcc[3], RegFileAcc[2], RegFileAcc[1], RegFileAcc[0]}, ReadReg2);
endmodule

Диаграмма времени для этого файла регистрации

...