From 0c8f29c7bf62b6d9db663cded5c753b166a01e17 Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Thu, 23 May 2019 09:50:08 +0800 Subject: [PATCH] hw: add pulse detector to rgb block This will be used to validate that the RGB LED is working. Signed-off-by: Sean Cross --- hw/factory-bitstream.py | 83 ++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/hw/factory-bitstream.py b/hw/factory-bitstream.py index 00d7613..978ef42 100644 --- a/hw/factory-bitstream.py +++ b/hw/factory-bitstream.py @@ -328,26 +328,84 @@ class Platform(LatticePlatform): raise ValueError("programming is not supported") class SBLED(Module, AutoCSR): - def __init__(self, pads): + def __init__(self, pads, detected_pulse): rgba_pwm = Signal(3) self.dat = CSRStorage(8) self.addr = CSRStorage(4) self.ctrl = CSRStorage(4) + self.bypass = CSRStorage(3) + self.pwm_count = CSRStorage(24) + self.sent_pulses = CSRStatus(32) + self.detected_pulses = CSRStatus(32) + + count = Signal(24) + led_value = Signal() + rgb = Signal(3) + sent_pulses = Signal(32) + detected_pulses = Signal(32) + rgba_drv = Signal(3) + + self.sync += [ + # When the PWM count is updated, reset everything and + # copy the results out. + If(self.pwm_count.re, + count.eq(0), + + self.sent_pulses.status.eq(sent_pulses), + sent_pulses.eq(0), + + self.detected_pulses.status.eq(detected_pulses), + detected_pulses.eq(0), + + ).Elif(count < self.pwm_count.storage, + count.eq(count + 1), + + ).Else( + count.eq(0), + led_value.eq(~led_value), + If(led_value, + sent_pulses.eq(sent_pulses + 1), + If(detected_pulse, + detected_pulses.eq(detected_pulses + 1), + ), + ), + ), + ] + + # Wire up the bypasses + self.comb += [ + If(self.bypass.storage[0], + rgb[0].eq(led_value), + ).Else( + rgb[0].eq(rgba_pwm[0]), + ), + If(self.bypass.storage[1], + rgb[1].eq(led_value), + ).Else( + rgb[1].eq(rgba_pwm[1]), + ), + If(self.bypass.storage[2], + rgb[2].eq(led_value), + ).Else( + rgb[2].eq(rgba_pwm[2]), + ), + ] + self.specials += Instance("SB_RGBA_DRV", i_CURREN = self.ctrl.storage[1], i_RGBLEDEN = self.ctrl.storage[2], - i_RGB0PWM = rgba_pwm[0], - i_RGB1PWM = rgba_pwm[1], - i_RGB2PWM = rgba_pwm[2], + i_RGB0PWM = rgb[0], + i_RGB1PWM = rgb[1], + i_RGB2PWM = rgb[2], o_RGB0 = pads.rgb0, o_RGB1 = pads.rgb1, o_RGB2 = pads.rgb2, - p_CURRENT_MODE = "0b1", - p_RGB0_CURRENT = "0b000011", - p_RGB1_CURRENT = "0b000001", - p_RGB2_CURRENT = "0b000011", + p_CURRENT_MODE = "0b1", # Half current + p_RGB0_CURRENT = "0b000011", # 4 mA + p_RGB1_CURRENT = "0b000001", # 2 mA + p_RGB2_CURRENT = "0b000011", # 4 mA ) self.specials += Instance("SB_LEDDA_IP", @@ -367,7 +425,6 @@ class SBLED(Module, AutoCSR): i_LEDDADDR0 = self.addr.storage[0], i_LEDDDEN = self.dat.re, i_LEDDEXE = self.ctrl.storage[0], - # o_LEDDON = led_is_on, # Indicates whether LED is on or not # i_LEDDRST = ResetSignal(), # This port doesn't actually exist o_PWMOUT0 = rgba_pwm[0], o_PWMOUT1 = rgba_pwm[1], @@ -375,7 +432,6 @@ class SBLED(Module, AutoCSR): o_LEDDON = Signal(), ) - class SBWarmBoot(Module, AutoCSR): def __init__(self): self.ctrl = CSRStorage(size=8) @@ -766,9 +822,6 @@ class BaseSoC(SoCCore): i_externalResetVector=self.reboot.addr.storage, ) - self.submodules.rgb = SBLED(platform.request("led")) - self.submodules.version = Version() - # Add USB pads usb_pads = platform.request("usb") usb_iobuf = usbio.IoBuf(usb_pads.d_p, usb_pads.d_n, usb_pads.pullup) @@ -783,6 +836,8 @@ class BaseSoC(SoCCore): # Add GPIO pads for the touch buttons self.submodules.touch = TouchPads(platform.request("touch")) + self.submodules.rgb = SBLED(platform.request("led"), self.touch.i.status[1]) + self.submodules.version = Version() # Add "-relut -dffe_min_ce_use 4" to the synth_ice40 command. # The "-reult" adds an additional LUT pass to pack more stuff in, @@ -850,7 +905,7 @@ def main(): cpu_type = "vexriscv" cpu_variant = "min" if args.with_debug: - cpu_variant = "debug" + cpu_variant = cpu_variant + "+debug" if args.no_cpu: cpu_type = None