`define IN_CLK 8388608
-`define OUT_CLK 9600
+`define OUT_CLK 57600
`define CLK_DIV `IN_CLK / `OUT_CLK
`define MMAP_ADDR 16'hFF50
input [15:0] addr,
inout [7:0] data,
output reg serial = 1);
-
+
+ reg rdlatch = 0;
wire decode = (addr == `MMAP_ADDR);
wire [7:0] odata;
- assign data = (rd && decode) ? odata : 8'bzzzzzzzz;
+ assign data = rdlatch ? odata : 8'bzzzzzzzz;
reg [7:0] data_stor = 0;
reg [15:0] clkdiv = 0;
reg have_data = 0;
reg [3:0] diqing = 4'b0000;
- wire new = (wr) && (!have_data) && decode;
+ wire newdata = (wr) && (!have_data) && decode;
assign odata = have_data ? 8'b1 : 8'b0;
- always @ (negedge clk)
+ always @ (posedge clk)
begin
+ rdlatch <= rd && decode;
/* deal with diqing */
- if(new) begin
+ if(newdata) begin
data_stor <= data;
have_data <= 1;
diqing <= 4'b0000;
end
/* deal with clkdiv */
- if((new && !have_data) || clkdiv == `CLK_DIV)
+ if((newdata && !have_data) || clkdiv == `CLK_DIV)
clkdiv <= 0;
else
clkdiv <= clkdiv + 1;