URL
https://opencores.org/ocsvn/eco32/eco32/trunk
Go to most recent revision |
Show entire file |
Details |
Blame |
View Log
Rev 68 |
Rev 69 |
Line 9... |
Line 9... |
wt, irq);
|
wt, irq);
|
input clk;
|
input clk;
|
input reset;
|
input reset;
|
input en;
|
input en;
|
input wr;
|
input wr;
|
input addr;
|
input [3:2] addr;
|
input [31:0] data_in;
|
input [31:0] data_in;
|
output [31:0] data_out;
|
output reg [31:0] data_out;
|
output wt;
|
output wt;
|
output irq;
|
output irq;
|
|
|
reg [5:0] prescaler;
|
|
reg tick;
|
|
reg [31:0] counter;
|
reg [31:0] counter;
|
reg [31:0] divisor;
|
reg [31:0] divisor;
|
reg divisor_loaded;
|
reg divisor_loaded;
|
reg expired;
|
reg expired;
|
reg alarm;
|
reg alarm;
|
reg ien;
|
reg ien;
|
|
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if (reset == 1) begin
|
|
prescaler <= 6'd50;
|
|
tick <= 0;
|
|
end else begin
|
|
if (prescaler == 6'd1) begin
|
|
prescaler <= 6'd50;
|
|
tick <= 1;
|
|
end else begin
|
|
prescaler <= prescaler - 1;
|
|
tick <= 0;
|
|
end
|
|
end
|
|
end
|
|
|
|
always @(posedge clk) begin
|
|
if (divisor_loaded == 1) begin
|
if (divisor_loaded == 1) begin
|
counter <= divisor;
|
counter <= divisor;
|
expired <= 0;
|
expired <= 0;
|
end else begin
|
end else begin
|
if (tick == 1) begin
|
|
if (counter == 32'h00000001) begin
|
if (counter == 32'h00000001) begin
|
counter <= divisor;
|
counter <= divisor;
|
expired <= 1;
|
expired <= 1;
|
end else begin
|
end else begin
|
counter <= counter - 1;
|
counter <= counter - 1;
|
expired <= 0;
|
expired <= 0;
|
end
|
end
|
end else begin
|
|
expired <= 0;
|
|
end
|
|
end
|
end
|
end
|
end
|
|
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if (reset == 1) begin
|
if (reset == 1) begin
|
Line 68... |
Line 47... |
ien <= 0;
|
ien <= 0;
|
end else begin
|
end else begin
|
if (expired == 1) begin
|
if (expired == 1) begin
|
alarm <= 1;
|
alarm <= 1;
|
end else begin
|
end else begin
|
if (en == 1 && wr == 1 && addr == 0) begin
|
if (en == 1 && wr == 1 && addr[3:2] == 2'b00) begin
|
alarm <= data_in[0];
|
alarm <= data_in[0];
|
ien <= data_in[1];
|
ien <= data_in[1];
|
end
|
end
|
if (en == 1 && wr == 1 && addr == 1) begin
|
if (en == 1 && wr == 1 && addr[3:2] == 2'b01) begin
|
divisor <= data_in;
|
divisor <= data_in;
|
divisor_loaded <= 1;
|
divisor_loaded <= 1;
|
end else begin
|
end else begin
|
divisor_loaded <= 0;
|
divisor_loaded <= 0;
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
|
|
assign data_out =
|
always @(*) begin
|
(addr == 0) ? { 28'h0000000, 2'b00, ien, alarm } :
|
case (addr[3:2])
|
divisor;
|
2'b00:
|
|
// ctrl
|
|
data_out = { 28'h0000000, 2'b00, ien, alarm };
|
|
2'b01:
|
|
// divisor
|
|
data_out = divisor;
|
|
2'b10:
|
|
// counter
|
|
data_out = counter;
|
|
2'b11:
|
|
// not used
|
|
data_out = 32'hxxxxxxxx;
|
|
default:
|
|
data_out = 32'hxxxxxxxx;
|
|
endcase
|
|
end
|
|
|
assign wt = 0;
|
assign wt = 0;
|
assign irq = ien & alarm;
|
assign irq = ien & alarm;
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|
© copyright 1999-2025
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.