From 75378b13bdfb77ceb6e91bca09801afef7122184 Mon Sep 17 00:00:00 2001 From: Tomek Malesinski Date: Mon, 1 Sep 2008 23:42:39 +0200 Subject: [PATCH] Serial input/output in Pokey --- pokey.v | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/pokey.v b/pokey.v index 68c7360..e7e3d33 100644 --- a/pokey.v +++ b/pokey.v @@ -187,7 +187,9 @@ module pokey(rst_i, clk_i, ack_o, irq, audout, - key_code, key_pressed, key_shift, key_break); + key_code, key_pressed, key_shift, key_break, + serout, serout_rdy_o, serout_ack_i, + serin, serin_rdy_i, serin_ack_o); input rst_i; input clk_i; input adr_i; @@ -195,11 +197,13 @@ module pokey(rst_i, clk_i, input we_i; input stb_i; input key_code, key_pressed, key_shift, key_break; + input serout_ack_i, serin, serin_rdy_i; output dat_o; output ack_o; output irq; output audout; + output serout, serout_rdy_o, serin_ack_o; wire rst_i, clk_i; wire [3:0] adr_i; @@ -215,6 +219,15 @@ module pokey(rst_i, clk_i, wire [5:0] audout = audout0 + audout1 + audout2 + audout3; + wire [7:0] serin; + wire serin_rdy_i; + reg last_serin_rdy_i; + reg serin_ack_o; + reg [7:0] serout; + reg serout_rdy_o; + wire serout_ack_i; + reg last_serout_ack_i; + wire rst = (rst_bits == 0); wire start_timer; @@ -264,7 +277,8 @@ module pokey(rst_i, clk_i, assign ack_o = stb_i; - always @ (adr_i or random) + always @ (adr_i or key_code or random or serin or irqst or irqen or + key_shift or key_pressed) if (adr_i == 'h9) // KBCODE dat_o = key_code; @@ -272,8 +286,8 @@ module pokey(rst_i, clk_i, // RANDOM dat_o = random; else if (adr_i == 'hd) - // TODO: SERIN - dat_o = 'hff; + // SERIN + dat_o = serin; else if (adr_i == 'he) // IRQST dat_o = ~(irqst & irqen); @@ -317,11 +331,27 @@ module pokey(rst_i, clk_i, // TODO: reset SKSTAT[7:5] if they are implemented end + always @ (posedge clk_i) begin + last_serin_rdy_i <= serin_rdy_i; + if (rst) + serin_ack_o <= 0; + else if (stb_i && !we_i && adr_i == 'hd && serin_rdy_i) + serin_ack_o <= 1; + else if (!serin_rdy_i) + serin_ack_o <= 0; + end + // SEROUT - always @ (posedge clk_i) - if (we_i && stb_i && adr_i == 'hd) begin - // TODO: serial output - end + always @ (posedge clk_i) begin + last_serout_ack_i <= serout_ack_i; + if (rst) + serout_rdy_o <= 0; + else if (we_i && stb_i && adr_i == 'hd) begin + serout <= dat_i; + serout_rdy_o <= 1; + end else if (serout_ack_i) + serout_rdy_o <= 0; + end // IRQEN always @ (posedge clk_i) @@ -341,10 +371,14 @@ module pokey(rst_i, clk_i, always @ (posedge clk_i) // IRQ_SERFIN has no latch. - irqst <= irqen & ({irqst[7:4], 1'b0, irqst[2:0]} | + irqst <= irqen & ({irqst[7:4], + !serout_ack_i && !serout_rdy_o, + irqst[2:0]} | {key_break && !last_key_break, key_pressed && !last_key_pressed, - 3'b000, borrow[3], borrow[1:0]}); + serin_rdy_i && !last_serin_rdy_i, + serout_ack_i && !last_serout_ack_i, + 1'b0, borrow[3], borrow[1:0]}); always @ (irqst) begin irq = 0; -- 2.11.4.GIT