Untitled
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));
endmoduleEditor is loading...
Leave a Comment