forked from Github_Repos/cvw
Retimed peripherals for AHB interface
This commit is contained in:
parent
4e6caf64d9
commit
24f767a404
@ -340,7 +340,7 @@ module freg3adr (
|
|||||||
generate
|
generate
|
||||||
for (i = 0; i < numRegs; i = i + 1) begin:register
|
for (i = 0; i < numRegs; i = i + 1) begin:register
|
||||||
|
|
||||||
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
floprc #(`XLEN) reg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
||||||
end
|
end
|
||||||
|
|
||||||
endgenerate
|
endgenerate
|
||||||
|
@ -21,7 +21,7 @@ module fcsr(
|
|||||||
//for clk-based write
|
//for clk-based write
|
||||||
assign regInput = (write) ? {24'h0,frm,flags} : regInput;
|
assign regInput = (write) ? {24'h0,frm,flags} : regInput;
|
||||||
|
|
||||||
floprc #(32) (.clk(clk), .reset(reset), .clear(clear), .d(regInput), .q(regOutput));
|
floprc #(32) fcsrreg(.clk(clk), .reset(reset), .clear(clear), .d(regInput), .q(regOutput));
|
||||||
|
|
||||||
assign readData = regOutput;
|
assign readData = regOutput;
|
||||||
|
|
@ -28,7 +28,7 @@ module freg1adr (
|
|||||||
generate
|
generate
|
||||||
for (i = 0; i < numRegs; i = i + 1) begin:register
|
for (i = 0; i < numRegs; i = i + 1) begin:register
|
||||||
|
|
||||||
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
||||||
end
|
end
|
||||||
|
|
||||||
endgenerate
|
endgenerate
|
||||||
@ -167,7 +167,7 @@ module freg2adr (
|
|||||||
generate
|
generate
|
||||||
for (i = 0; i < numRegs; i = i + 1) begin:register
|
for (i = 0; i < numRegs; i = i + 1) begin:register
|
||||||
|
|
||||||
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
||||||
end
|
end
|
||||||
|
|
||||||
endgenerate
|
endgenerate
|
||||||
@ -340,7 +340,7 @@ module freg3adr (
|
|||||||
generate
|
generate
|
||||||
for (i = 0; i < numRegs; i = i + 1) begin:register
|
for (i = 0; i < numRegs; i = i + 1) begin:register
|
||||||
|
|
||||||
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
|
||||||
end
|
end
|
||||||
|
|
||||||
endgenerate
|
endgenerate
|
@ -44,7 +44,9 @@ module clint (
|
|||||||
assign memread = MemRWclint[1];
|
assign memread = MemRWclint[1];
|
||||||
assign memwrite = MemRWclint[0];
|
assign memwrite = MemRWclint[0];
|
||||||
assign HRESPCLINT = 0; // OK
|
assign HRESPCLINT = 0; // OK
|
||||||
assign HREADYCLINT = 1; // Respond immediately
|
// assign HREADYCLINT = 1; // Respond immediately
|
||||||
|
always_ff @(posedge HCLK) // delay response
|
||||||
|
HREADYCLINT <= memread | memwrite;
|
||||||
|
|
||||||
// word aligned reads
|
// word aligned reads
|
||||||
generate
|
generate
|
||||||
@ -63,7 +65,7 @@ module clint (
|
|||||||
// register access
|
// register access
|
||||||
generate
|
generate
|
||||||
if (`XLEN==64) begin
|
if (`XLEN==64) begin
|
||||||
always_comb begin
|
always @(posedge HCLK) begin
|
||||||
case(entry)
|
case(entry)
|
||||||
16'h0000: HREADCLINT = {63'b0, MSIP};
|
16'h0000: HREADCLINT = {63'b0, MSIP};
|
||||||
16'h4000: HREADCLINT = MTIMECMP;
|
16'h4000: HREADCLINT = MTIMECMP;
|
||||||
@ -85,7 +87,7 @@ module clint (
|
|||||||
else MTIME <= MTIME + 1;
|
else MTIME <= MTIME + 1;
|
||||||
end
|
end
|
||||||
end else begin // 32-bit
|
end else begin // 32-bit
|
||||||
always_comb begin
|
always @(posedge HCLK) begin
|
||||||
case(entry)
|
case(entry)
|
||||||
16'h0000: HREADCLINT = {31'b0, MSIP};
|
16'h0000: HREADCLINT = {31'b0, MSIP};
|
||||||
16'h4000: HREADCLINT = MTIMECMP[31:0];
|
16'h4000: HREADCLINT = MTIMECMP[31:0];
|
||||||
|
@ -45,7 +45,9 @@ module gpio (
|
|||||||
assign memread = MemRWgpio[1];
|
assign memread = MemRWgpio[1];
|
||||||
assign memwrite = MemRWgpio[0];
|
assign memwrite = MemRWgpio[0];
|
||||||
assign HRESPGPIO = 0; // OK
|
assign HRESPGPIO = 0; // OK
|
||||||
assign HREADYGPIO = 1; // Respond immediately
|
always_ff @(posedge HCLK) // delay response to data cycle
|
||||||
|
HREADYGPIO <= memread | memwrite;
|
||||||
|
// assign HREADYGPIO = 1; // Respond immediately
|
||||||
|
|
||||||
// word aligned reads
|
// word aligned reads
|
||||||
generate
|
generate
|
||||||
@ -67,12 +69,12 @@ module gpio (
|
|||||||
// register access
|
// register access
|
||||||
generate
|
generate
|
||||||
if (`XLEN==64) begin
|
if (`XLEN==64) begin
|
||||||
always_comb begin
|
always_ff @(posedge HCLK) begin
|
||||||
case(entry)
|
case(entry)
|
||||||
8'h00: HREADGPIO = {INPUT_EN, INPUT_VAL};
|
8'h00: HREADGPIO <= {INPUT_EN, INPUT_VAL};
|
||||||
8'h08: HREADGPIO = {OUTPUT_VAL, OUTPUT_EN};
|
8'h08: HREADGPIO <= {OUTPUT_VAL, OUTPUT_EN};
|
||||||
8'h40: HREADGPIO = 0; // OUT_XOR reads as 0
|
8'h40: HREADGPIO <= 0; // OUT_XOR reads as 0
|
||||||
default: HREADGPIO = 0;
|
default: HREADGPIO <= 0;
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
always_ff @(posedge HCLK or negedge HRESETn)
|
always_ff @(posedge HCLK or negedge HRESETn)
|
||||||
@ -86,14 +88,14 @@ module gpio (
|
|||||||
if (entry == 8'h40) OUTPUT_VAL <= OUTPUT_VAL ^ HWDATA[31:0]; // OUT_XOR
|
if (entry == 8'h40) OUTPUT_VAL <= OUTPUT_VAL ^ HWDATA[31:0]; // OUT_XOR
|
||||||
end
|
end
|
||||||
end else begin // 32-bit
|
end else begin // 32-bit
|
||||||
always_comb begin
|
always_ff @(posedge HCLK) begin
|
||||||
case(entry)
|
case(entry)
|
||||||
8'h00: HREADGPIO = INPUT_VAL;
|
8'h00: HREADGPIO <= INPUT_VAL;
|
||||||
8'h04: HREADGPIO = INPUT_EN;
|
8'h04: HREADGPIO <= INPUT_EN;
|
||||||
8'h08: HREADGPIO = OUTPUT_EN;
|
8'h08: HREADGPIO <= OUTPUT_EN;
|
||||||
8'h0C: HREADGPIO = OUTPUT_VAL;
|
8'h0C: HREADGPIO <= OUTPUT_VAL;
|
||||||
8'h40: HREADGPIO = 0; // OUT_XOR reads as 0
|
8'h40: HREADGPIO <= 0; // OUT_XOR reads as 0
|
||||||
default: HREADGPIO = 0;
|
default: HREADGPIO <= 0;
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
always_ff @(posedge HCLK or negedge HRESETn)
|
always_ff @(posedge HCLK or negedge HRESETn)
|
||||||
|
@ -48,11 +48,13 @@ module uart (
|
|||||||
assign MEMWb = ~MemRWuart[0];
|
assign MEMWb = ~MemRWuart[0];
|
||||||
assign A = HADDR[2:0];
|
assign A = HADDR[2:0];
|
||||||
assign HRESPUART = 0; // OK
|
assign HRESPUART = 0; // OK
|
||||||
assign HREADYUART = 1; // Respond immediately
|
//assign HREADYUART = 1; // Respond immediately
|
||||||
|
always_ff @(posedge HCLK) // delay response to data cycle
|
||||||
|
HREADYUART <= ~MEMRb | ~MEMWb;
|
||||||
|
|
||||||
generate
|
generate
|
||||||
if (`XLEN == 64) begin
|
if (`XLEN == 64) begin
|
||||||
always_comb begin
|
always @(posedge HCLK) begin
|
||||||
HREADUART = {Dout, Dout, Dout, Dout, Dout, Dout, Dout, Dout};
|
HREADUART = {Dout, Dout, Dout, Dout, Dout, Dout, Dout, Dout};
|
||||||
case (HADDR)
|
case (HADDR)
|
||||||
3'b000: Din = HWDATA[7:0];
|
3'b000: Din = HWDATA[7:0];
|
||||||
@ -66,7 +68,7 @@ module uart (
|
|||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
end else begin // 32-bit
|
end else begin // 32-bit
|
||||||
always_comb begin
|
always @(posedge HCLK) begin
|
||||||
HREADUART = {Dout, Dout, Dout, Dout};
|
HREADUART = {Dout, Dout, Dout, Dout};
|
||||||
case (HADDR[1:0])
|
case (HADDR[1:0])
|
||||||
2'b00: Din = HWDATA[7:0];
|
2'b00: Din = HWDATA[7:0];
|
||||||
|
Loading…
Reference in New Issue
Block a user