Untitled

 avatar
unknown
verilog
a month ago
2.2 kB
3
Indexable
module debouncer (
    input  clk,           // CLOCK_50 (do próbkowania)
    input  btn_in,        // surowy sygnał z przycisku
    output reg btn_out    // wyczyszczony sygnał
);
    reg btn_sync_0, btn_sync_1;
    reg [19:0] count;
    
    // Synchronizacja sygnału z domeną zegara
    always @(posedge clk) begin
        btn_sync_0 <= btn_in;
        btn_sync_1 <= btn_sync_0;
    end
    
    // Licznik stabilności - czeka aż sygnał będzie stabilny przez ~20 ms
    always @(posedge clk) begin
        if (btn_sync_1 == btn_out)
            count <= 0;
        else begin
            count <= count + 1;
            if (count == 1000000 - 1)  // ~20 ms przy 50 MHz
                btn_out <= btn_sync_1;
        end
    end
endmodule

module processor_with_ROM_debounce (
    input         CLOCK_50,
    input  [9:0]  SW,
    input  [1:0]  KEY,
    output [9:0]  LEDR,
    output [0:6]  HEX0,
    output [0:6]  HEX1
);
    wire Resetn = ~SW[0];
    wire Run    = SW[9];
    
    // Debouncery dla KEY0 i KEY1
    wire KEY0_clean, KEY1_clean;
    
    debouncer db0 (
        .clk(CLOCK_50),
        .btn_in(KEY[0]),
        .btn_out(KEY0_clean)
    );
    
    debouncer db1 (
        .clk(CLOCK_50),
        .btn_in(KEY[1]),
        .btn_out(KEY1_clean)
    );
    
    // Zegary dla pamieci i procesora
    wire MClock = KEY0_clean;
    wire PClock = KEY1_clean;
    
    wire [4:0] addr;
    wire [8:0] data_rom;
    wire [8:0] BusWires;
    wire Done;
    
    counter5 cnt (
        .clk(MClock),
        .resetn(Resetn),
        .count(addr)
    );
    
    rom32x9 rom (
        .address(addr),
        .clock(MClock),
        .q(data_rom)
    );
    
    proc cpu (
        .DIN(data_rom),
        .Resetn(Resetn),
        .Clock(PClock),
        .Run(Run),
        .Done(Done),
        .BusWires(BusWires)
    );
    
    assign LEDR[8:0] = BusWires;
    assign LEDR[9] = Done;
    
    // Wyswietlanie aktualnego adresu na HEX0-1
    decoder_hex_16 dec_addr_hi (.x({3'b000, addr[4]}), .h(HEX1));
    decoder_hex_16 dec_addr_lo (.x(addr[3:0]),         .h(HEX0));
endmodule
Editor is loading...
Leave a Comment