Skip to content

Instantly share code, notes, and snippets.

@cfelton
Last active June 2, 2016 17:02
Show Gist options
  • Save cfelton/720aff378cfd7843f078 to your computer and use it in GitHub Desktop.
Save cfelton/720aff378cfd7843f078 to your computer and use it in GitHub Desktop.
def rgb2ycbcr(rgb, ycbcr, clock, reset):
""" A RGB to YCbCr converter with reset.
Arguments:
rgb: red, green, blue interface
r: input 8-bit unsigned value in range of 0-255
g: input 8-bit unsigned value in range of 0-255
b: input 8-bit unsigned value in range of 0-255
ycbcr: the luma-chroma interace
y: output 8-bit unsigned value in range of 0-127
cb: output 8-bit unsigned value in range of 0-128
cr: output 8-bit unsigned value in range of 0-128
clock: system clock
reset: system reset
"""
temp_nbits = PRECISION_FACTOR + ycbcr.bitlength()
ytemp, cbtemp, crtemp = [intbv(0)[temp_nbits:] for _ in range(3)]
@always_seq(clk.posedge, reset=reset)
def logic():
ycbcr.valid.next = False
if rgb.valid:
yscale = Y_OFFSET + ((Y1 * rgb.red) + (Y2 * rgb.green) +
(Y3 * rgb.blue))
ytemp[:] = yscale # intbv(Y_OFFSET + Y1 * rgb.red +
# Y2 * rgb.green + Y3 * rgb.blue)[temp_nbits-1:]
cbscale = CB_OFFSET + ((CB1 * rgb.red) + (CB2 * rgb.green) +
(CB3 * rgb.blue))
cbtemp[:] = cbscale # intbv(CB_OFFSET + CB1 * rgb.red +
# CB2 * rgb.green + CB3 * rgb.blue)[temp_nbits-1:]
crscale = CR_OFFSET + ((CR1 * rgb.red) + (CR2 * rgb.green) +
(CR3 * rgb.blue))
crtemp[:] = crscale # intbv(CR_OFFSET + CR1 * rgb.red +
# CR2 * rgb.green + CR3 * rgb.blue)[temp_nbits-1:]
ycbcr.y.next = round_unsigned(
ytemp, temp_nbits, PRECISION_FACTOR)
ycbcr.cb.next = round_unsigned(
cbtemp, temp_nbits, PRECISION_FACTOR)
ycbcr.cr.next = round_unsigned(
crtemp, temp_nbits, PRECISION_FACTOR)
ycbcr.valid.next = True
return logic
def round_unsigned(val, msb, lsb):
rval = int(val[msb:lsb])
if val[lsb - 1]:
rval = int(val[msb:lsb]) + 1
return rval
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment