hw: support duty cycles other than 50%

Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
Sean Cross 2019-05-23 17:09:01 +08:00
parent 6d8875850c
commit 8b2241a9e6

View File

@ -336,21 +336,24 @@ class SBLED(Module, AutoCSR):
self.ctrl = CSRStorage(4)
self.bypass = CSRStorage(3)
self.pwm_count = CSRStorage(24)
self.pulse = CSRStorage(24)
self.duty = CSRStorage(24)
self.sent_pulses = CSRStatus(32)
self.detected_pulses = CSRStatus(32)
count = Signal(24)
led_value = Signal()
last_led_value = Signal()
rgb = Signal(3)
sent_pulses = Signal(32)
detected_pulses = Signal(32)
rgba_drv = Signal(3)
self.sync += [
last_led_value.eq(led_value),
# When the PWM count is updated, reset everything and
# copy the results out.
If(self.pwm_count.re,
If(self.pulse.re,
count.eq(0),
self.sent_pulses.status.eq(sent_pulses),
@ -359,19 +362,30 @@ class SBLED(Module, AutoCSR):
self.detected_pulses.status.eq(detected_pulses),
detected_pulses.eq(0),
).Elif(count < self.pwm_count.storage,
count.eq(count + 1),
led_value.eq(0),
).Elif(count < self.pulse.storage,
count.eq(count + 1),
If(count < self.duty.storage,
led_value.eq(0),
).Else(
count.eq(0),
led_value.eq(~led_value),
If(led_value,
led_value.eq(1),
# On the transition from 0 > 1, increment the counter
# and see if the LED has changed. If so, increment
# the number of detected pulses.
If(~last_led_value,
sent_pulses.eq(sent_pulses + 1),
If(detected_pulse,
detected_pulses.eq(detected_pulses + 1),
),
),
),
).Else(
# Reset the count once it gets greater than "Pulse"
count.eq(0),
led_value.eq(0),
),
]
# Wire up the bypasses
@ -404,7 +418,7 @@ class SBLED(Module, AutoCSR):
o_RGB2 = pads.rgb2,
p_CURRENT_MODE = "0b1", # Half current
p_RGB0_CURRENT = "0b000011", # 4 mA
p_RGB1_CURRENT = "0b000001", # 2 mA
p_RGB1_CURRENT = "0b000011", # 4 mA
p_RGB2_CURRENT = "0b000011", # 4 mA
)