-
Notifications
You must be signed in to change notification settings - Fork 0
/
monostable.v
69 lines (56 loc) · 1.13 KB
/
monostable.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* Monostable circuit
*/
module monostable
(
usec,
sys_clk,
sys_clk_freq,
start,
incomplete
);
/* Inputs */
input [31:0] sys_clk_freq; // FIXME
input sys_clk; // clock
input [31:0] usec; // how many microseconds would you like?
input start; // input
/* Outputs */
output [7:0] incomplete; // 'percentage' of completetion
/* Internals */
reg usec_clock;
reg usec_clock_last;
reg [31:0] usec_lapsed;
reg [31:0] usec_sampled;
/* Create 1 us timer */
gen_clock data_reset_clock
(
.clock_in(sys_clk),
.in_freq(sys_clk_freq),
.out_freq(1_000_000),
.clock_out(usec_clock)
);
always@(posedge sys_clk)
begin
// start timing
if (start)
begin
usec_lapsed <= 0;
usec_sampled <= usec;
end
// increment counter on raising edge of usec_clock
else
begin
if (usec_clock_last == 0 && usec_clock == 1)
begin
if (usec_lapsed < usec)
usec_lapsed <= usec_lapsed + 1;
end
end
usec_clock_last <= usec_clock;
end
wire [31+8:0] _incomplete;
wire [31+8:0] usec_remain;
assign usec_remain = (usec_sampled - usec_lapsed) * 255;
assign _incomplete = (usec_remain / usec_sampled);
assign incomplete = _incomplete[7:0];
endmodule