Add UART interrupts

Currently an interrupt is triggered any time there is any activity on
the UART_RXD line, but later it will only trigger once there is data
ready to be read.
This commit is contained in:
Byron Lathi
2022-03-14 14:57:45 -05:00
parent 0316d047e3
commit b2344d986e
4 changed files with 19 additions and 2 deletions

View File

@@ -117,6 +117,8 @@ SevenSeg segs(
.HEX0(HEX0), .HEX1(HEX1), .HEX2(HEX2), .HEX3(HEX3), .HEX4(HEX4), .HEX5(HEX5)
);
logic uart_irq;
uart uart(
.clk_50(clk_50),
.clk(clk),
@@ -127,6 +129,7 @@ uart uart(
.addr(cpu_addr[1:0]),
.RXD(UART_RXD),
.TXD(UART_TXD),
.irq(uart_irq),
.data_out(uart_data_out)
);
@@ -135,8 +138,13 @@ always_ff @(posedge clk_50) begin
irq_data_out <= '0;
else if (irq_cs && ~cpu_rwb)
irq_data_out <= irq_data_out & cpu_data_in;
else if (~button_1)
irq_data_out <= {irq_data_out[7:1], ~button_1};
else begin
if (~button_1)
irq_data_out[0] <= '1;
if (uart_irq)
irq_data_out[1] <= '1;
end
end

View File

@@ -12,9 +12,13 @@ module uart(
output logic TXD,
output logic irq,
output logic [7:0] data_out
);
//Temporary!
assign irq = ~RXD;
//Handle reading and writing registers
logic [7:0] tx_buf;

View File

@@ -4,6 +4,7 @@
#include <stdint.h>
#define BUTTON (1 << 0)
#define UART (1 << 1)
void irq_int();
void nmi_int();

View File

@@ -17,4 +17,8 @@ void handle_irq() {
puts("Button Interrupt!\n");
irq_set_status(status & ~BUTTON);
}
if (status & UART) {
puts("UART Interrupt!\n");
irq_set_status(status & ~UART);
}
}