FPGA/SRTC: buffer register/address input

This commit is contained in:
Maximilian Rehkopf 2012-07-09 02:22:57 +02:00
parent effa2a6972
commit 6b3a7eb4ae

View File

@ -71,27 +71,37 @@ parameter SRTC_COMMAND = 5'b00100;
parameter SRTC_WRITE = 5'b01000; parameter SRTC_WRITE = 5'b01000;
parameter SRTC_WRITE2 = 5'b10000; parameter SRTC_WRITE2 = 5'b10000;
reg [3:0] data_in_r;
reg [3:0] addr_in_r;
always @(posedge clkin) addr_in_r <= {addr_in_r[2:0], addr_in};
assign srtc_reg_we_rising = reg_we_rising;
assign srtc_state = mode_r;
assign srtc_rtc_ptr = rtc_ptr;
assign srtc_we_sreg = reg_we_sreg;
initial begin initial begin
rtc_we_r = 0; rtc_we_r = 0;
mode_r <= SRTC_READ; mode_r = SRTC_READ;
rtc_ptr <= 4'hf; rtc_ptr = 4'hf;
data_out_r = 8'h00;
end
//always @(posedge clkin) data_in_r <= data_in;
always @(posedge clkin) begin
if(~reg_we) data_in_r <= data_in;
end end
always @(posedge clkin) begin always @(posedge clkin) begin
if(reset_rising) begin if(reset_rising) begin
mode_r <= SRTC_READ; mode_r <= SRTC_READ;
rtc_ptr <= 4'hf; rtc_ptr <= 4'hf;
end else if(mode_r == SRTC_WRITE2) begin
we_countdown_r <= we_countdown_r - 1;
if (we_countdown_r == 3'b000) begin
mode_r <= SRTC_WRITE;
rtc_we_r <= 0;
end
end else if(reg_we_rising && enable) begin end else if(reg_we_rising && enable) begin
case (addr_in) case (addr_in_r[0])
// 1'b0: // data register is read only // 1'b0: // data register is read only
1'b1: // control register 1'b1: // control register
case (data_in) case (data_in_r)
4'hd: begin 4'hd: begin
mode_r <= SRTC_READ; mode_r <= SRTC_READ;
rtc_ptr <= 4'hf; rtc_ptr <= 4'hf;
@ -99,11 +109,9 @@ always @(posedge clkin) begin
4'he: begin 4'he: begin
mode_r <= SRTC_COMMAND; mode_r <= SRTC_COMMAND;
end end
4'hf: begin
end
default: begin default: begin
if(mode_r == SRTC_COMMAND) begin if(mode_r == SRTC_COMMAND) begin
case (data_in) case (data_in_r)
4'h0: begin 4'h0: begin
mode_r <= SRTC_WRITE; mode_r <= SRTC_WRITE;
rtc_data_out_r <= rtc_data_in; rtc_data_out_r <= rtc_data_in;
@ -119,38 +127,38 @@ always @(posedge clkin) begin
end else if(mode_r == SRTC_WRITE) begin end else if(mode_r == SRTC_WRITE) begin
rtc_ptr <= rtc_ptr + 1; rtc_ptr <= rtc_ptr + 1;
case(rtc_ptr) case(rtc_ptr)
0: rtc_data_out_r[3:0] <= data_in; 0: rtc_data_out_r[3:0] <= data_in_r;
1: rtc_data_out_r[7:4] <= data_in; 1: rtc_data_out_r[7:4] <= data_in_r;
2: rtc_data_out_r[11:8] <= data_in; 2: rtc_data_out_r[11:8] <= data_in_r;
3: rtc_data_out_r[15:12] <= data_in; 3: rtc_data_out_r[15:12] <= data_in_r;
4: rtc_data_out_r[19:16] <= data_in; 4: rtc_data_out_r[19:16] <= data_in_r;
5: rtc_data_out_r[23:20] <= data_in; 5: rtc_data_out_r[23:20] <= data_in_r;
6: rtc_data_out_r[27:24] <= data_in; 6: rtc_data_out_r[27:24] <= data_in_r;
7: rtc_data_out_r[31:28] <= data_in; 7: rtc_data_out_r[31:28] <= data_in_r;
8: begin 8: begin
rtc_data_out_r[35:32] <= (data_in < 10) rtc_data_out_r[35:32] <= (data_in_r < 10)
? data_in ? data_in_r
: data_in - 10; : data_in_r - 10;
rtc_data_out_r[39:36] <= data_in < 10 ? 0 : 1; rtc_data_out_r[39:36] <= data_in_r < 10 ? 0 : 1;
end end
9: rtc_data_out_r[43:40] <= data_in; 9: rtc_data_out_r[43:40] <= data_in_r;
10: rtc_data_out_r[47:44] <= data_in; 10: rtc_data_out_r[47:44] <= data_in_r;
11: begin 11: begin
rtc_data_out_r[51:48] <= (data_in < 10) rtc_data_out_r[51:48] <= (data_in_r < 10)
? data_in ? data_in_r
: data_in - 10; : data_in_r - 10;
rtc_data_out_r[55:52] <= data_in < 10 ? 1 : 2; rtc_data_out_r[55:52] <= data_in_r < 10 ? 1 : 2;
end end
endcase endcase
mode_r <= SRTC_WRITE2; mode_r <= SRTC_WRITE2;
we_countdown_r <= 5; we_countdown_r <= 4;
rtc_we_r <= 1; rtc_we_r <= 1;
end end
end end
endcase endcase
endcase endcase
end else if(reg_oe_falling && enable) begin end else if(reg_oe_falling && enable) begin
case (addr_in) case (addr_in_r[0])
1'b0: // read data register 1'b0: // read data register
if(mode_r == SRTC_READ) begin if(mode_r == SRTC_READ) begin
case(rtc_ptr) case(rtc_ptr)
@ -171,18 +179,25 @@ always @(posedge clkin) begin
+ (rtc_data_r[55:52] << 1) + (rtc_data_r[55:52] << 1)
+ (rtc_data_r[55:52] << 3) - 10; + (rtc_data_r[55:52] << 3) - 10;
12: data_out_r <= rtc_data_r[59:56]; 12: data_out_r <= rtc_data_r[59:56];
// 14: mode_r <= SRTC_IDLE;
15: begin 15: begin
rtc_data_r <= rtc_data_in; rtc_data_r <= rtc_data_in;
data_out_r <= 8'h0f; data_out_r <= 8'h0f;
end end
default: data_out_r <= 8'h0f; default: data_out_r <= 8'h0f;
endcase endcase
rtc_ptr <= rtc_ptr == 13 ? 15 : rtc_ptr + 1; rtc_ptr <= rtc_ptr == 13 ? 15 : rtc_ptr + 1;
end else begin end else begin
data_out_r <= 8'h00; data_out_r <= 8'h00;
end end
// 1'b1: // control register is write only // 1'b1: // control register is write only
endcase endcase
end else if(mode_r == SRTC_WRITE2) begin
we_countdown_r <= we_countdown_r - 1;
if (we_countdown_r == 3'b000) begin
mode_r <= SRTC_WRITE;
rtc_we_r <= 0;
end
end end
end end