// This CPLD is a timer circuit that generates a 500Hz tick. It takes a 2MHz
// clock in. Scales that down to 125MHz with a 4 bit counter.
// Then it counts 125 of those in a 7 bit counter that resets on 7c.
// When the reset occurs, the pin_nINT line goes from Hi-Z to low.
//
// The falling edge of pin_nCS pin brings pin_nINT back to Hi-Z.
//
// SCK and Dout are used to read the 3 bit tick counter. This is used
// to ensure that the count is kept synched. Dout is updated on the
// falling edge of SCK and the MSB is shifted first.
//
module timer (
input pin_CLK,
input pin_nCS,
input pin_SCK,
output pin_Dout,
output pin_nINT
);
reg [10:0] counter;
reg [2:0] ticks;
reg [2:0] tickShift;
wire nTick;
reg nInt;
reg nCS0;
reg nCS1;
reg SCK0;
// Not synthesized. Just for testing
initial begin
counter = 0;
ticks = 0;
end
assign nTick = ~(counter == 11'b11111001111); // 124'15 causes 125'0->0'0
assign pin_nINT = (nInt == 1'b1) ? 1'bz : 1'b0;
assign pin_Dout = pin_nCS ? 1'bz : tickShift[2];
always @(posedge pin_CLK) begin
if (nTick == 1'b0) begin
counter <= 0;
ticks <= ticks+1;
end
else begin
counter <= counter+1;
end
nCS0 <= pin_nCS;
nCS1 <= nCS0;
// Set interrupt on the CLK. Reset it on the falling edge of
// pin_nCS+2 clocks
if (nTick == 1'b0) begin
nInt <= 1'b0;
end
else if ((nCS1 & (~nCS0)) == 1'b1) begin
nInt <= 1'b1;
end
// search for falling edge of SCK in CLK
SCK0 <= pin_SCK;
if (~pin_nCS) begin
if (SCK0 & ~pin_SCK) begin
tickShift[2:0] <= { tickShift[1:0], 1'b0 };
end
end
else begin
tickShift[2:0] <= ticks[2:0];
end
end
endmodule
Thursday, August 20, 2015
Simplified Timer
I realized that the timer CPLD verilog was overly complicated. So I simplified it:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment