mirror of
https://github.com/alangarf/apple-one.git
synced 2025-02-03 17:33:51 +00:00
Yay got iverilog sim working!
This commit is contained in:
parent
c4d42fae3c
commit
bcaf9e6962
@ -32,20 +32,156 @@ module apple1_tb;
|
|||||||
// Setup dumping of data for inspection
|
// Setup dumping of data for inspection
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
force core_top.my_cpu.arlet_cpu.DIHOLD = 0;
|
force core_top.clk_div = 0;
|
||||||
force core_top.my_cpu.arlet_cpu.ALU.OUT = 0;
|
force core_top.cpu_clken = 0;
|
||||||
|
force core_top.hard_reset = 0;
|
||||||
|
force core_top.reset_cnt = 0;
|
||||||
|
|
||||||
|
force core_top.my_cpu.arlet_cpu.AB = 0;
|
||||||
force core_top.my_cpu.arlet_cpu.PC = 0;
|
force core_top.my_cpu.arlet_cpu.PC = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ABL = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ABH = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.DIHOLD = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.IRHOLD = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.IRHOLD_valid = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.C = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.Z = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.I = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.D = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.V = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.N = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.AI = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.BI = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.DO = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.WE = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.CI = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.NMI_edge = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.regsel = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.PC_inc = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.PC_temp = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.src_reg = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.dst_reg = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.index_y = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.load_reg = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.inc = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.write_back = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.load_only = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.store = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.adc_sbc = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.compare = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.shift = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.rotate = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.backwards = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.cond_true = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.cond_code = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.shift_right = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.alu_shift_right = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.op = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.alu_op = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.adc_bcd = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.adj_bcd = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.bit_ins = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.plp = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.php = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.clc = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.sed = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.cli = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.sei = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.clv = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.brk = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.res = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.write_register = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ADJL = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ADJH = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.NMI_1 = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.OUT = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.CO = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.N = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.HC = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.AI7 = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.BI7 = 0;
|
||||||
force core_top.my_cpu.arlet_cpu.ALU.temp_logic = 0;
|
force core_top.my_cpu.arlet_cpu.ALU.temp_logic = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.temp_BI = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.temp_l = 0;
|
||||||
|
force core_top.my_cpu.arlet_cpu.ALU.temp_h = 0;
|
||||||
|
|
||||||
clk25 = 1'b0;
|
clk25 = 1'b0;
|
||||||
uart_rx = 1'b0;
|
uart_rx = 1'b0;
|
||||||
rst_n = 1'b0;
|
rst_n = 1'b0;
|
||||||
#40 rst_n = 1'b1;
|
#40 rst_n = 1'b1;
|
||||||
|
|
||||||
release core_top.my_cpu.arlet_cpu.DIHOLD;
|
release core_top.clk_div;
|
||||||
|
release core_top.cpu_clken;
|
||||||
|
release core_top.hard_reset;
|
||||||
|
release core_top.reset_cnt;
|
||||||
|
release core_top.my_cpu.arlet_cpu.AB;
|
||||||
release core_top.my_cpu.arlet_cpu.PC;
|
release core_top.my_cpu.arlet_cpu.PC;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ABL;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ABH;
|
||||||
|
release core_top.my_cpu.arlet_cpu.DIHOLD;
|
||||||
|
release core_top.my_cpu.arlet_cpu.IRHOLD;
|
||||||
|
release core_top.my_cpu.arlet_cpu.IRHOLD_valid;
|
||||||
|
release core_top.my_cpu.arlet_cpu.C;
|
||||||
|
release core_top.my_cpu.arlet_cpu.Z;
|
||||||
|
release core_top.my_cpu.arlet_cpu.I;
|
||||||
|
release core_top.my_cpu.arlet_cpu.D;
|
||||||
|
release core_top.my_cpu.arlet_cpu.V;
|
||||||
|
release core_top.my_cpu.arlet_cpu.N;
|
||||||
|
release core_top.my_cpu.arlet_cpu.AI;
|
||||||
|
release core_top.my_cpu.arlet_cpu.BI;
|
||||||
|
release core_top.my_cpu.arlet_cpu.DO;
|
||||||
|
release core_top.my_cpu.arlet_cpu.WE;
|
||||||
|
release core_top.my_cpu.arlet_cpu.CI;
|
||||||
|
release core_top.my_cpu.arlet_cpu.NMI_edge;
|
||||||
|
release core_top.my_cpu.arlet_cpu.regsel;
|
||||||
|
release core_top.my_cpu.arlet_cpu.PC_inc;
|
||||||
|
release core_top.my_cpu.arlet_cpu.PC_temp;
|
||||||
|
release core_top.my_cpu.arlet_cpu.src_reg;
|
||||||
|
release core_top.my_cpu.arlet_cpu.dst_reg;
|
||||||
|
release core_top.my_cpu.arlet_cpu.index_y;
|
||||||
|
release core_top.my_cpu.arlet_cpu.load_reg;
|
||||||
|
release core_top.my_cpu.arlet_cpu.inc;
|
||||||
|
release core_top.my_cpu.arlet_cpu.write_back;
|
||||||
|
release core_top.my_cpu.arlet_cpu.load_only;
|
||||||
|
release core_top.my_cpu.arlet_cpu.store;
|
||||||
|
release core_top.my_cpu.arlet_cpu.adc_sbc;
|
||||||
|
release core_top.my_cpu.arlet_cpu.compare;
|
||||||
|
release core_top.my_cpu.arlet_cpu.shift;
|
||||||
|
release core_top.my_cpu.arlet_cpu.rotate;
|
||||||
|
release core_top.my_cpu.arlet_cpu.backwards;
|
||||||
|
release core_top.my_cpu.arlet_cpu.cond_true;
|
||||||
|
release core_top.my_cpu.arlet_cpu.cond_code;
|
||||||
|
release core_top.my_cpu.arlet_cpu.shift_right;
|
||||||
|
release core_top.my_cpu.arlet_cpu.alu_shift_right;
|
||||||
|
release core_top.my_cpu.arlet_cpu.op;
|
||||||
|
release core_top.my_cpu.arlet_cpu.alu_op;
|
||||||
|
release core_top.my_cpu.arlet_cpu.adc_bcd;
|
||||||
|
release core_top.my_cpu.arlet_cpu.adj_bcd;
|
||||||
|
release core_top.my_cpu.arlet_cpu.bit_ins;
|
||||||
|
release core_top.my_cpu.arlet_cpu.plp;
|
||||||
|
release core_top.my_cpu.arlet_cpu.php;
|
||||||
|
release core_top.my_cpu.arlet_cpu.clc;
|
||||||
|
release core_top.my_cpu.arlet_cpu.sec;
|
||||||
|
release core_top.my_cpu.arlet_cpu.cld;
|
||||||
|
release core_top.my_cpu.arlet_cpu.sed;
|
||||||
|
release core_top.my_cpu.arlet_cpu.sei;
|
||||||
|
release core_top.my_cpu.arlet_cpu.clv;
|
||||||
|
release core_top.my_cpu.arlet_cpu.brk;
|
||||||
|
release core_top.my_cpu.arlet_cpu.res;
|
||||||
|
release core_top.my_cpu.arlet_cpu.write_register;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ADJL;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ADJH;
|
||||||
|
release core_top.my_cpu.arlet_cpu.NMI_1;
|
||||||
release core_top.my_cpu.arlet_cpu.ALU.OUT;
|
release core_top.my_cpu.arlet_cpu.ALU.OUT;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.CO;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.N;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.HC;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.AI7;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.BI7;
|
||||||
release core_top.my_cpu.arlet_cpu.ALU.temp_logic;
|
release core_top.my_cpu.arlet_cpu.ALU.temp_logic;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.temp_BI;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.temp_l;
|
||||||
|
release core_top.my_cpu.arlet_cpu.ALU.temp_h;
|
||||||
|
|
||||||
$display("Starting...");
|
$display("Starting...");
|
||||||
$dumpfile("apple1_top_tb.vcd");
|
$dumpfile("apple1_top_tb.vcd");
|
||||||
|
@ -78,8 +78,8 @@ module apple1(
|
|||||||
.dbi (dbi),
|
.dbi (dbi),
|
||||||
.dbo (dbo),
|
.dbo (dbo),
|
||||||
.we (we),
|
.we (we),
|
||||||
.irq (1'b1),
|
.irq_n (1'b1),
|
||||||
.nmi (1'b1),
|
.nmi_n (1'b1),
|
||||||
.ready (cpu_clken)
|
.ready (cpu_clken)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -95,6 +95,7 @@ module apple1(
|
|||||||
wire [7:0] ram_dout;
|
wire [7:0] ram_dout;
|
||||||
ram #(RAM_FILENAME) my_ram (
|
ram #(RAM_FILENAME) my_ram (
|
||||||
.clk(clk25),
|
.clk(clk25),
|
||||||
|
.reset(reset),
|
||||||
.address(ab[12:0]),
|
.address(ab[12:0]),
|
||||||
.w_en(we & ram_cs),
|
.w_en(we & ram_cs),
|
||||||
.din(dbo),
|
.din(dbo),
|
||||||
@ -105,6 +106,7 @@ module apple1(
|
|||||||
wire [7:0] rom_dout;
|
wire [7:0] rom_dout;
|
||||||
rom_wozmon #(WOZ_FILENAME) my_rom_wozmon (
|
rom_wozmon #(WOZ_FILENAME) my_rom_wozmon (
|
||||||
.clk(clk25),
|
.clk(clk25),
|
||||||
|
.reset(reset),
|
||||||
.address(ab[7:0]),
|
.address(ab[7:0]),
|
||||||
.dout(rom_dout)
|
.dout(rom_dout)
|
||||||
);
|
);
|
||||||
@ -113,6 +115,7 @@ module apple1(
|
|||||||
wire [7:0] uart_dout;
|
wire [7:0] uart_dout;
|
||||||
uart my_uart (
|
uart my_uart (
|
||||||
.clk(clk25),
|
.clk(clk25),
|
||||||
|
.reset(reset),
|
||||||
|
|
||||||
.uart_rx(uart_rx),
|
.uart_rx(uart_rx),
|
||||||
.uart_tx(uart_tx),
|
.uart_tx(uart_tx),
|
||||||
|
@ -6,8 +6,8 @@ module arlet_6502(
|
|||||||
input [7:0] dbi,
|
input [7:0] dbi,
|
||||||
output reg [7:0] dbo,
|
output reg [7:0] dbo,
|
||||||
output reg we,
|
output reg we,
|
||||||
input irq,
|
input irq_n,
|
||||||
input nmi,
|
input nmi_n,
|
||||||
input ready
|
input ready
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -27,13 +27,20 @@ module arlet_6502(
|
|||||||
.RDY(ready)
|
.RDY(ready)
|
||||||
);
|
);
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk or posedge reset)
|
||||||
begin
|
begin
|
||||||
if (enable)
|
if (reset)
|
||||||
begin
|
begin
|
||||||
ab <= ab_c;
|
ab <= 16'd0;
|
||||||
dbo <= dbo_c;
|
dbo <= 8'd0;
|
||||||
we <= we_c;
|
we <= 1'b0;
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
if (enable)
|
||||||
|
begin
|
||||||
|
ab <= ab_c;
|
||||||
|
dbo <= dbo_c;
|
||||||
|
we <= we_c;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
module ram(
|
module ram(
|
||||||
input clk,
|
input clk,
|
||||||
|
input reset,
|
||||||
input [12:0] address,
|
input [12:0] address,
|
||||||
input w_en,
|
input w_en,
|
||||||
input [7:0] din,
|
input [7:0] din,
|
||||||
@ -15,8 +16,8 @@ module ram(
|
|||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
begin
|
begin
|
||||||
dout <= ram[address];
|
dout <= reset ? 8'h0 : ram[address];
|
||||||
if (w_en) ram[address] <= din;
|
if (w_en && ~reset) ram[address] <= din;
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
module rom_wozmon(
|
module rom_wozmon(
|
||||||
input clk,
|
input clk,
|
||||||
|
input reset,
|
||||||
input [7:0] address,
|
input [7:0] address,
|
||||||
output reg [7:0] dout
|
output reg [7:0] dout
|
||||||
);
|
);
|
||||||
@ -13,7 +14,7 @@ module rom_wozmon(
|
|||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
begin
|
begin
|
||||||
dout <= rom[address];
|
dout <= reset ? 8'h0 : rom[address];
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
module async_transmitter(
|
module async_transmitter(
|
||||||
input clk,
|
input clk,
|
||||||
|
input reset,
|
||||||
input TxD_start,
|
input TxD_start,
|
||||||
input [7:0] TxD_data,
|
input [7:0] TxD_data,
|
||||||
output TxD,
|
output TxD,
|
||||||
@ -31,29 +32,37 @@ module async_transmitter(
|
|||||||
wire TxD_ready = (TxD_state==0);
|
wire TxD_ready = (TxD_state==0);
|
||||||
assign TxD_busy = ~TxD_ready;
|
assign TxD_busy = ~TxD_ready;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk or posedge reset)
|
||||||
begin
|
begin
|
||||||
if(TxD_ready & TxD_start)
|
if (reset)
|
||||||
TxD_shift <= TxD_data;
|
begin
|
||||||
|
TxD_state <= 0;
|
||||||
|
TxD_shift <= 0;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
if(TxD_state[3] & BitTick)
|
begin
|
||||||
TxD_shift <= (TxD_shift >> 1);
|
if(TxD_ready & TxD_start)
|
||||||
|
TxD_shift <= TxD_data;
|
||||||
|
else
|
||||||
|
if(TxD_state[3] & BitTick)
|
||||||
|
TxD_shift <= (TxD_shift >> 1);
|
||||||
|
|
||||||
case(TxD_state)
|
case(TxD_state)
|
||||||
4'b0000: if(TxD_start) TxD_state <= 4'b0100;
|
4'b0000: if(TxD_start) TxD_state <= 4'b0100;
|
||||||
4'b0100: if(BitTick) TxD_state <= 4'b1000; // start bit
|
4'b0100: if(BitTick) TxD_state <= 4'b1000; // start bit
|
||||||
4'b1000: if(BitTick) TxD_state <= 4'b1001; // bit 0
|
4'b1000: if(BitTick) TxD_state <= 4'b1001; // bit 0
|
||||||
4'b1001: if(BitTick) TxD_state <= 4'b1010; // bit 1
|
4'b1001: if(BitTick) TxD_state <= 4'b1010; // bit 1
|
||||||
4'b1010: if(BitTick) TxD_state <= 4'b1011; // bit 2
|
4'b1010: if(BitTick) TxD_state <= 4'b1011; // bit 2
|
||||||
4'b1011: if(BitTick) TxD_state <= 4'b1100; // bit 3
|
4'b1011: if(BitTick) TxD_state <= 4'b1100; // bit 3
|
||||||
4'b1100: if(BitTick) TxD_state <= 4'b1101; // bit 4
|
4'b1100: if(BitTick) TxD_state <= 4'b1101; // bit 4
|
||||||
4'b1101: if(BitTick) TxD_state <= 4'b1110; // bit 5
|
4'b1101: if(BitTick) TxD_state <= 4'b1110; // bit 5
|
||||||
4'b1110: if(BitTick) TxD_state <= 4'b1111; // bit 6
|
4'b1110: if(BitTick) TxD_state <= 4'b1111; // bit 6
|
||||||
4'b1111: if(BitTick) TxD_state <= 4'b0010; // bit 7
|
4'b1111: if(BitTick) TxD_state <= 4'b0010; // bit 7
|
||||||
4'b0010: if(BitTick) TxD_state <= 4'b0011; // stop1
|
4'b0010: if(BitTick) TxD_state <= 4'b0011; // stop1
|
||||||
4'b0011: if(BitTick) TxD_state <= 4'b0000; // stop2
|
4'b0011: if(BitTick) TxD_state <= 4'b0000; // stop2
|
||||||
default: if(BitTick) TxD_state <= 4'b0000;
|
default: if(BitTick) TxD_state <= 4'b0000;
|
||||||
endcase
|
endcase
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
assign TxD = (TxD_state<4) | (TxD_state[3] & TxD_shift[0]);
|
assign TxD = (TxD_state<4) | (TxD_state[3] & TxD_shift[0]);
|
||||||
|
105
rtl/uart/uart.v
105
rtl/uart/uart.v
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
module uart(
|
module uart(
|
||||||
input clk,
|
input clk,
|
||||||
|
input reset,
|
||||||
|
|
||||||
input enable,
|
input enable,
|
||||||
input [1:0] address,
|
input [1:0] address,
|
||||||
@ -28,6 +29,7 @@ module uart(
|
|||||||
|
|
||||||
async_transmitter #(ClkFrequency, Baud) my_tx (
|
async_transmitter #(ClkFrequency, Baud) my_tx (
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
|
.reset(reset),
|
||||||
.TxD_start(uart_tx_stb),
|
.TxD_start(uart_tx_stb),
|
||||||
.TxD_data(uart_tx_byte),
|
.TxD_data(uart_tx_byte),
|
||||||
.TxD(uart_tx),
|
.TxD(uart_tx),
|
||||||
@ -48,19 +50,27 @@ module uart(
|
|||||||
.RxD_endofpacket(rx_end)
|
.RxD_endofpacket(rx_end)
|
||||||
);
|
);
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk or posedge reset)
|
||||||
begin
|
begin
|
||||||
// new byte from RX, check register is clear and CPU has seen
|
if (reset)
|
||||||
// previous byte, otherwise we ignore the new data
|
|
||||||
if (uart_rx_stb && ~uart_rx_status)
|
|
||||||
begin
|
begin
|
||||||
uart_rx_status <= 'b1;
|
|
||||||
uart_rx_byte <= rx_data;
|
|
||||||
end
|
|
||||||
|
|
||||||
// clear the rx status flag on ack from CPU
|
|
||||||
if (uart_rx_ack)
|
|
||||||
uart_rx_status <= 'b0;
|
uart_rx_status <= 'b0;
|
||||||
|
uart_rx_byte <= 8'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
// new byte from RX, check register is clear and CPU has seen
|
||||||
|
// previous byte, otherwise we ignore the new data
|
||||||
|
if (uart_rx_stb && ~uart_rx_status)
|
||||||
|
begin
|
||||||
|
uart_rx_status <= 'b1;
|
||||||
|
uart_rx_byte <= rx_data;
|
||||||
|
end
|
||||||
|
|
||||||
|
// clear the rx status flag on ack from CPU
|
||||||
|
if (uart_rx_ack)
|
||||||
|
uart_rx_status <= 'b0;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
assign uart_cts = ~rx_idle || uart_rx_status;
|
assign uart_cts = ~rx_idle || uart_rx_status;
|
||||||
@ -70,49 +80,62 @@ module uart(
|
|||||||
localparam UART_TX = 2'b10;
|
localparam UART_TX = 2'b10;
|
||||||
|
|
||||||
// Handle Register
|
// Handle Register
|
||||||
always @(posedge clk)
|
always @(posedge clk or posedge reset)
|
||||||
begin
|
begin
|
||||||
uart_tx_stb <= 0;
|
if (reset)
|
||||||
uart_rx_ack <= 0;
|
|
||||||
|
|
||||||
if (enable)
|
|
||||||
begin
|
begin
|
||||||
case (address)
|
dout <= 8'd0;
|
||||||
|
|
||||||
UART_TX:
|
uart_tx_stb <= 0;
|
||||||
|
uart_rx_ack <= 0;
|
||||||
|
uart_tx_byte <= 8'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
uart_tx_stb <= 0;
|
||||||
|
uart_rx_ack <= 0;
|
||||||
|
|
||||||
|
if (enable)
|
||||||
begin
|
begin
|
||||||
// UART TX - 0xD012
|
case (address)
|
||||||
if (w_en)
|
|
||||||
|
UART_TX:
|
||||||
begin
|
begin
|
||||||
// Apple 1 terminal only uses 7 bits, MSB indicates
|
// UART TX - 0xD012
|
||||||
// terminal has ack'd RX
|
dout <= {uart_tx_status, 7'd0};
|
||||||
if (~uart_tx_status)
|
|
||||||
|
if (w_en)
|
||||||
begin
|
begin
|
||||||
uart_tx_byte <= {1'b0, din[6:0]};
|
// Apple 1 terminal only uses 7 bits, MSB indicates
|
||||||
uart_tx_stb <= 1;
|
// terminal has ack'd RX
|
||||||
|
if (~uart_tx_status)
|
||||||
|
begin
|
||||||
|
uart_tx_byte <= {1'b0, din[6:0]};
|
||||||
|
uart_tx_stb <= 1;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
|
||||||
dout <= {uart_tx_status, 7'd0};
|
|
||||||
end
|
|
||||||
|
|
||||||
UART_RXCR:
|
UART_RXCR:
|
||||||
begin
|
|
||||||
// UART RX CR - 0xD011
|
|
||||||
if (~w_en)
|
|
||||||
dout <= {uart_rx_status, 7'b0};
|
|
||||||
end
|
|
||||||
|
|
||||||
UART_RX:
|
|
||||||
begin
|
|
||||||
// UART RX - 0xD010
|
|
||||||
if (~w_en)
|
|
||||||
begin
|
begin
|
||||||
dout <= {uart_rx_status, uart_rx_byte[6:0]};
|
// UART RX CR - 0xD011
|
||||||
uart_rx_ack <= 1'b1;
|
dout <= {uart_rx_status, 7'b0};
|
||||||
end
|
end
|
||||||
|
|
||||||
|
UART_RX:
|
||||||
|
begin
|
||||||
|
// UART RX - 0xD010
|
||||||
|
dout <= {uart_rx_status, uart_rx_byte[6:0]};
|
||||||
|
if (~w_en)
|
||||||
|
uart_rx_ack <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
default:
|
||||||
|
dout <= 8'b0;
|
||||||
|
endcase
|
||||||
end
|
end
|
||||||
endcase
|
else
|
||||||
|
dout <= 8'b0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
Loading…
x
Reference in New Issue
Block a user