From 6334cfd2c1079a44445f4dff2988ca9bec79abbc Mon Sep 17 00:00:00 2001 From: harbaum Date: Mon, 10 Sep 2018 10:42:29 +0200 Subject: [PATCH] Add YPbPr tutorial --- tutorials/soc/lesson12/image.hex | 502 +++++++++++++++++++++++++++ tutorials/soc/lesson12/image.png | Bin 0 -> 34560 bytes tutorials/soc/lesson12/image.qip | 3 + tutorials/soc/lesson12/image.v | 164 +++++++++ tutorials/soc/lesson12/img2hex.sh | 4 + tutorials/soc/lesson12/osd.v | 182 ++++++++++ tutorials/soc/lesson12/rgb2ypbpr.sv | 55 +++ tutorials/soc/lesson12/scandoubler.v | 147 ++++++++ tutorials/soc/lesson12/soc.qpf | 30 ++ tutorials/soc/lesson12/soc.qsf | 165 +++++++++ tutorials/soc/lesson12/soc.rbf | Bin 0 -> 241782 bytes tutorials/soc/lesson12/soc.v | 194 +++++++++++ tutorials/soc/lesson12/user_io.v | 417 ++++++++++++++++++++++ tutorials/soc/lesson12/video.v | 124 +++++++ tutorials/soc/readme.md | 34 ++ 15 files changed, 2021 insertions(+) create mode 100644 tutorials/soc/lesson12/image.hex create mode 100644 tutorials/soc/lesson12/image.png create mode 100644 tutorials/soc/lesson12/image.qip create mode 100644 tutorials/soc/lesson12/image.v create mode 100755 tutorials/soc/lesson12/img2hex.sh create mode 100644 tutorials/soc/lesson12/osd.v create mode 100644 tutorials/soc/lesson12/rgb2ypbpr.sv create mode 100644 tutorials/soc/lesson12/scandoubler.v create mode 100644 tutorials/soc/lesson12/soc.qpf create mode 100644 tutorials/soc/lesson12/soc.qsf create mode 100644 tutorials/soc/lesson12/soc.rbf create mode 100644 tutorials/soc/lesson12/soc.v create mode 100644 tutorials/soc/lesson12/user_io.v create mode 100644 tutorials/soc/lesson12/video.v diff --git a/tutorials/soc/lesson12/image.hex b/tutorials/soc/lesson12/image.hex new file mode 100644 index 0000000..63ed88f --- /dev/null +++ b/tutorials/soc/lesson12/image.hex @@ -0,0 +1,502 @@ +:020000040000FA +:200000000000000000000000000000000000000000000000000000000000000000000001DF +:2000200000002000000024010000200000000001000024252424240524040400000024252B +:200040002400000000002425200000000000000000000000000000010000242548496C4D7F +:2000600048040400000024252424282528252825242424042404242524002400040424243F +:200080002400240424242829282424000000000004284828040024294C4D28040000000158 +:2000A00000000000000000000000000000000000000000000000000000000000002400001C +:2000C000002400240024002400240000002000000024042824280024002400040000002440 +:2000E000002400240024012400200020000000000000000000240000002400242448284CE3 +:2001000024240004002400240424002404240424002404240024002424240024042404245F +:2001200004240024042824482428002400200004044C284C04240428284C28280024000047 +:2001400000000000000000000000000000000000000000000000000000000000000100009E +:20016000000000000000240024000000200000000000242424252400000000000000000062 +:200180002400000024012400000000000000000000000000242524000000040024242424F1 +:2001A0002404040000000400040000000400040004052405040004042424242424252404C4 +:2001C0002404242424252424242424000000000428494C4D4C2928294C4D4C284849280018 +:2001E00000000024000000000000000000000000000000240000002400000024000000244B +:200200000000002400240024002400242044242400242044242424240024002400000024FA +:200220000024002400240024000000240000000000000024002400240024002400242428E6 +:200240000024002400240024000000040004002400240024002400240428042804280428A2 +:2002600004240428042424240024002400200024284C4C704D4C484C484C494C496D492485 +:2002800000000000000000000000000000000000000000000000000000000001000000005D +:2002A0000000000100002425240024252424444544242424242424252000200100002021F3 +:2002C000242524252400242100000000000000000000000124242400000024012400242425 +:2002E0000400000100002401000000000000000000000001000004252804282428042829B5 +:2003000024042425240424250000200100000425284D5051704D4C2948284C72957271497A +:20032000000000000000000000000000000000000000000000000000000000040024000095 +:2003400000000000002400240024002420242048244824242448242400240020002400246D +:200360000024002400240024002000000000000000000024002400240024002400240024D1 +:20038000002400000024002400240024000400000000000000240428282804280428082C79 +:2003A000042400240024002400240000002400240448284C4C7028482428259196B69291E0 +:2003C00000000000000000000000000000000000000000000000000000000000000000001D +:2003E00000000000000000002400200020002000242424002425242020000000240000003C +:200400002425240000002000000000000000000000000000242524000000000004002400BA +:20042000000000000000000000010400000000000000000000002429282928282828282829 +:2004400028040400040424042400000000010000040428294C4D4C28240424496D92957216 +:20046000000000240000002400000024000000240024002400000000000000240000000080 +:20048000000000240004002400240024002000240024002400240024002400240000002488 +:2004A00000240024002000240000002000000024000000240024002400240024002424244C +:2004C000002400240000002400240024002400200020002400040428082C282C082C282CA0 +:2004E0002424002400040024000000240020000400040428284C284804240024256D6D6D54 +:200500000000000000000001000000000000000000002401000000000000000100000001B3 +:2005200000000001000000010000200124000001000000000000240000002401200000000A +:200540000000242520002000000000000000000100000000240024010000240024254825EE +:2005600024002000000000000000242524252421000000000000042528282C2C2C282C29E6 +:200580002804240000000001000000000000000104052829282828242400040124496D29E7 +:2005A00000000000002400240024000000000000002400240000000000240024002400001B +:2005C00000000020002400200020002400240024002000240024002400240024002400240F +:2005E000002400240024002000240020002000000024002000240020002400242448252486 +:20060000002400240024000400242149254825240020002000040028284C284C282C282C2A +:2006200028280024002400000004002400000024284C282C0828242800240004046D494868 +:2006400000000000000000000000000000000000000000000000000000000000000000009A +:20066000000000000000000000000000202124002000200020212421240020002020242087 +:20068000200020002001200024000000000000000000000020002000202024244424240061 +:2006A00024000000200000000001244548494825240000000400040428282C2C2C2C2C280A +:2006C000282400000000000000000000000004254C292C2828282804240000002429482582 +:2006E0000000002400240024000000000000002400000024000000240000002400000000FE +:200700000000002400240024002000240024002400202044456D4948202424440024202406 +:200720000020002400240024002400240020002400200020002000240044244825440024E0 +:200740000024002400240024002425494549454820240024002404280428284C284C282C3C +:2007600024240024000000040000000000000448284C282C282804280024002400240424E5 +:20078000000000010000240100000000000000000000000000000000000000010000000032 +:2007A0000000000000002400000020212020242524458D8DB1B6B18D6C6D916D442544257A +:2007C000202024252020242520002000000020012000202120002020242544454424242067 +:2007E000202020212021242120002445484948252424242524242804042428294C4C4C28E1 +:20080000240400000000000000000000000024294C2C2C2C2C2824040400240500000000EA +:20082000000000240024002400240000000000000000000000000000002400000000000004 +:20084000000000000024002400200024448C698D8DD5D6FADAFDDAFAD6FEDADA91B18D8D85 +:20086000698D696924440024002400200024002000240024002420484468444844440024E4 +:2008800000200024002400242044214445482024202404282428042804280428284C28282E +:2008A00004240000002000000000000000000028284C284C28280404002400240004000438 +:2008C000000000000001000000000000000000000000000000000000000000000000000017 +:2008E000000000000001202020214469B1DAF9FAF9FAD9D6D9DAF9FAFDFEFDFEFEFFFEFA18 +:20090000FAD6D5B28C494445484524202420242424254445686D91B6B5B6B5B2B58D44453A +:200920004825242024202445686944254425240024202424282928242404240428252404A4 +:2009400024040000000000000000000000000424284D4C49280404002405240000000400BC +:2009600000000024002400240000002400000000000000000000002400000024000000009F +:200980000000002000202044448D91F9FAFEDAF9D5D5D5FDDAFDFAFDDAFDFAFDDAFEFEFEA1 +:2009A000FAFEFAFED6DAB6FAB6B56D68244849918DB1B2FADAFEDAFEFEFEFEFEDADAB1D991 +:2009C000D6B169684448488C6D8D44242044202400240028244828280424002400240024B9 +:2009E00000240024000000040000002400240024044828480004000400240024000400240B +:200A00000000000000000400000000000000000000000000000000010000000000000000D1 +:200A2000000020252420448DD5FAFDFAF9D6D5D5D5D9F9FAF9FAFDFAF9FAFDDAD9DAFDFE1A +:200A4000F9FAF9FAF9FAFEFFFEFFFEDBD9DAFEFFFEFFFEFFFEFEFDDAFDFEFEFEFEFAFEFE82 +:200A6000FDDAF9FAF9DAF9D6D5B16824242524212000242528294829240404000000000112 +:200A8000040424000000000100000000000024050400240000000400000024040424282537 +:200AA0000000000000240000000000000000000000040000000000000004000000200000EA +:200AC0000020448D8DB1B1F5D5F9FAF9D5F9D5F9D5F9D9FDF9FDFAFDF9F9D5F9D5F9D5F9F7 +:200AE000D9FDDAFDFAFEDEFEDEFEFEFEFAFEFEFEFEFEFEFEFAFEDAFDD9FDDAFEFAFDDAFD66 +:200B0000DAFDDAFEFEFEDAFEFAD96D440024002400200024244825482424000000000024FD +:200B2000002400000000000000000004002404240004002400240024000400240448242415 +:200B400000000000000000000000000000000000000000000000000000000000000120254F +:200B60006465ACD2F5D2F5F6F9FAF9D5F5F5F5D5F5FAF9FAFDFAF9FAF9F9F8F5F9D5D9D9DC +:200B8000FDFAFDFEFDFEFDFEFDFEFDFEFEFEFEFEFDFEFDDEFDFEFDFEFDFEFDFEFDFEFDFACB +:200BA000FDFEFDFEFDFEFDFAFDDAB58D91B2918D480020254825242424000000000100016B +:200BC00024002000000000000000000000002425240000002405240000000404242524257D +:200BE000000000000000000000000000000000240000000000000004000000240044448998 +:200C0000A9CDCDF1D1F5D5F9D5F5D5F5D1F5D5F9D5F9F9FDD9F9D9F9D5F9D9F9D9F9D5FD38 +:200C2000DAFDD9FDDAFEFEFEDAFEFAFDDAFEFEFEDAFDDAFDDAFDDAFDDAFEFEFDDAFDDEFDAF +:200C4000DAFDDAFDDEFEFAFEDAF9DAF9DAFEDAFE91682424002424240024000000200024A7 +:200C600000240024000000000000000400240048252400240024002400000024042404288F +:200C8000000000000000000000000000000000000000000000000000000020004065A8AD3A +:200CA000ECCDECEDF0F1F5F6F5F1F0F1F4F5F5F5F9F5F9F9F8D5F9D5D4D5F9FAF9F9F9FA40 +:200CC000FDFAFDFAFDFAFDFEFDDEFDFAF9DAFDFEFDDEFDFEFDFEFDFEFDFEFDFEFDDAFDFE00 +:200CE000FDDEFDFEFDFEFDFEF9DAF9FAF9FAFDFEF9B66D25000024252400000000002001A5 +:200D000000002400000000000000000000000425242524042404240000000425242424250F +:200D20000000000000000024000000000000000000000000000000000024204460A8C9ED49 +:200D4000E9E8C9EDCDF0D1F1CDF1CDF1D1F5F5F5D5F5D5F9F5F9D5F5D5F9D5F9D5FDF9FDAD +:200D6000D9FDDAFDFAFEFAFEFAFDDAFDD9FDDAFEFAFDDAFEFEFDFAFDFAFDDAFDDAFDDAFD1D +:200D8000DAFDDAFDD9FDFAFDD9FDDAF9D5F9DAFDFAFE8D4400242448242400200020002089 +:200DA00000240024002400240024000000040024002404240424002400240024042804281F +:200DC00000000000000000000000000000000000000000000000000000006465C8C9E8E9E8 +:200DE000E8E5E8E9ECEDECCDECEDF0EDF0F1F4F5F4D5F5F5F5F5F4F5F4F5F8F5F9F9F9F903 +:200E0000F9FAFDFAFDFAFDFEFDFAF9FAFDFEFDFEFDFEFDFAFDFEFDFAF9FAF9FAFDFEFDFE56 +:200E2000FDFAF9DAFDFAFDFAF9FAF9F9F9D5F9D5D5B16C242024242524242000000000006E +:200E400000002400000000002400000000000000000024042404040000002404242524253C +:200E6000000000000000000000000000000000000000002000000024002464ADC9E9E5E87A +:200E8000E5E8E9E8C9ECC9ECC9EDCDF1CDF1D1F5D1F5F1F5D1F5D1F5D1F5F5F9D5F9D5F9CA +:200EA000D5F9F9FDDAFDFAFDDAFDF9FDDAFDFEFDFAFDDAFDDAFDF9FDD5F9D5FDD9FDFAFDF9 +:200EC000DAFDF9FDD9FDF9FDD9F9D5F9D5F5D5D5B1D5918D49482448242400240020002018 +:200EE000002400240000002400240024000000000000002400240024002404240024042836 +:200F00000000000000000000000000000000000000000000000000002020A4A9E8E5E4E5AE +:200F2000E4C5E8E5E8E9ECEDECEDF0F1F0D1F5F6F0D1F1F1F0D1F0F1F0F1F4F5F4F5F5F549 +:200F4000F9F9F9FAF9D9F9FAFDFAF9FAF9FAFDFEFDFAFDFAF9DAF9D9F4F5F9FAF9FAFDFAB6 +:200F6000FDFAFDFAF9D5F9FAF9F9F9F6F5D5F9F6F9D6FADAB59291492420240000000000FC +:200F80000000240000000001040024000000000100000000240024000404282524042425F5 +:200FA000002400240000000000000000000000000000000000000020004485C9E5E8C5E4C1 +:200FC000C4E4C0E4C4E8C9ECCDF0CDF1D1F5F1F5D1F0CDF1CDF0CDF1CDF0CDF1D1F5D5F934 +:200FE000F5F9D5F5D5F9D5F9F9FDD9F9D9F9D9FDD9FDD9FDD9FDD5F9D5F9F5F9D9FDDAFD74 +:20100000F9FDF9F9D5F9D5F9D5F9F9F9D5F9D5F9DAFDFAFEDAFEB69148480024002000200E +:201020000024002400240024002400240004000400040024242804240028294D29480428F9 +:201040002425240000000000000000000000000000000000000000002041A4C5E4E5E4C0EC +:20106000C4C0E4C1E4E5E8E9ECEDECEDF0F1F0EDF0EDF0CDECCDF1CDF0CDF0F1F5F1F5F5BE +:20108000F5D1D0D1F5F5F5F5F9F9F8F5F8D5F8D9F9F9F9F9F9FAF9F9F5F5F9F5F9FAF9FA11 +:2010A000F9FAF9D5F5F5F9F5F9FAF9FAF9DAD9DAFDFEFDFEFEFEFEDAB549242020000000FF +:2010C0002424242000000000242428492805040004042429482928242425484D4D4D2829BF +:2010E0000024000000000000000000000000000000000000000000242044A4C8C1E4C0C4AF +:20110000A0C4C0E4C0E4C4E8C9EDCDF1CDF1CDF1CDF1CDF1CDF1D1F1CDD1CDF5D1F5F1F57F +:20112000D1F1D1F5D1F5F5F9D5F9D5F9D5F9D5F9D5F9F9FDD9F9F9F9D5F5F5F9D5F9F9F93B +:20114000D5F9D9F9D5F9F9F9D5F9D9FDDAFEFAFEDAFEFEFEDAFEFEFEDAB1452400240024D7 +:201160000024242400000024004849714D4804280428284C284828480428296D4D4D294CCB +:201180004825240000000000000000000000000000000000000000002021A4A5C4C1C4C526 +:2011A000C4A0C0C1C0C5E8E9C8C9CCCDCCCDCCCDD1D1F1F2F5F2F6F6F5D2F1F2F1F1F5F2CD +:2011C000F0D1F0F1F0F1F4F5F4F5F9F9F8F9F9F9F8F9F9FAF9F9F9F9F4D5F5F5F4D5F5F5B7 +:2011E000F9F9F9D5F4F5F9FAF9D9F9FAFDFEFEFEFDDEFEFEFDFEFEFFFEDA914520002425B1 +:20120000242424250000240424284C71704D282828294C2928284829282528294C29282914 +:20122000926D25240000000000000000000000000000000000200020004481A9A0C4A0C4F0 +:20124000A0C0A0C0A0E4C5E8A5C8A9CDCDCDA9CDCDF5D2F6F6FAF7FBF6F6D2F5F1F5F1F5BF +:20126000CDF1CDF1CDF0D1F5D5F9D5F9F9F9D5F9D5F9F9F9D5F9F5F9D5F4D1F5D1F4D1F57D +:20128000D5F9F5F5D5F9D5F9D5D9D9FEFEFEDEFEDAFEDAFEFAFEFAFEDAFED6912424202432 +:2012A00024442424002400240448297151704C4C4C704D4C284C284C28480428282808289E +:2012C000DA6E2400000000000000000000000000000000000000000020218485A4A1A0A1D2 +:2012E000C0A1A0A0C0C1C4C5A8C9CDCED1CECDAED1D2F6F6FAFBFAFBFAFBF6D6F5F6F5D231 +:20130000F1CDF0EDF0F1F4F5F5F5F9F9F9F9F9D5F9F9F9F9F8F5F4F5F4F5F4F5F4F1F0F17A +:20132000F5F5F5F5F5F5F9F9D9D5D9FAFDFEFEFEFEFEFDFAFDFAF9FAFDFAFED690442424C1 +:2013400024252424240024042424284D7051505170717071704D4C29282928282828280480 +:201360006E490000000000000000000000000000000000240000002400244084808480A45E +:20138000A1C4A0C4A0A080A485CDCEF2D2D2D2F6D2F6D6FAD7FBDBFBDBFBFBFAD6F6F2F5E4 +:2013A000CDF1F1F5D1F5F5F9D5F9F5F9D5F9F5F9D5F9F9F9D5F5F1F4D1F5F5F9F1F1CDF09B +:2013C000CDF1F1F1D1F5D5F9D5F9FAFDDAFEFEFEDAFEFAFDDAF9F9F9DAFEFAFEDAB54844C1 +:2013E000244424440024042804284D7171714D707195959571702828042828280428040433 +:20140000240000000000000100000000000000000000000100000000000040416065A8892F +:201420008460A4A5A0A0A08184AED2D2D6D2F6F7D6D6D6D7D6D7DADBFAFBFAFBFAD7FAF74C +:20144000F5D2F5F2F5F5F5F6F5F5F9FAF9F5F5F5F4F5F9F5F4D5F4F1D0D1F4F1F0CDCCCDF3 +:20146000CCC9ECCDCCCDD0D1D0F5F9FAF9FAFEFEFDFAFDFAF5D5F5F5F9FAF9FAFDDAB169C4 +:20148000442424242424282948497091957170517075959695714C2928294C4D28240404E1 +:2014A00000000024000000000000000000000000000000240024002400240024208DB2D124 +:2014C0008584A0C4A0A480A485D1D2F6D2F6D7FBD6D692B26D9192DADBFFDBFBDBFAD7FACF +:2014E000F6F6F2F6F5F5D1F5D1F5D5F9F5F5D5F5F5F9F5F9F5F5D1F5D1F4F1F5F1F1EDF129 +:20150000C8ECC8ECCCECC9CCCCD0ADD1D1F5D6FED9FDFAF9D5D4D1F5D5F9D5F9DAFDD6B130 +:20152000244420240028244C484C4D7071704D504D95959975954D716D95929149480024E6 +:201540000000000000000000000000000000000000000000200000000000000048B6DAD7BC +:20156000D569A081A481808188CEF6F7F6D7D6D7FAD7B18E4869B6DBFAFBFAFBFADBFAFB23 +:20158000FAF7F5D6F5F2F1D1F5D5F5D1F5D1F4F5F9F5F9F5F5D1F0D1F4F1F0F1F0CDECCD08 +:2015A000ECCDCCCDF0F1F0F1F0F1F0D1F4F5F9FAF9FAF9F5F0D1F0F5F9F6D9D9F9FAFEB6CA +:2015C0004824200024212424282828494C4D504D5071959695717172959695714C28240558 +:2015E000002000000000002400000024000400000000002400200024002400286EFFDBFE85 +:20160000D6B185846084808465CDD2FAD7FAD7FAD7D6B2B66DB2D6FAD7FAD7FAD7FBFBFF40 +:20162000D7FAD6F6D1F5D1F5D1F5D1F5D1F5D5F9D5F9D5F5D1F5F1F5D1F5F1F0CDF0CDF0FC +:20164000CDF0D1F4D1F5F1F5CDF1D1F5D1F5D5F9D5F5F1F5CDF1D1F9D5F9D5F9D9FDDAB50B +:20166000244420240024002404282448284C4C704C7071957195719572957171282804287B +:201680000000000100000405040000000000000000000000000000012401244ADAFBFAFBDE +:2016A000DAD6CD856060808184A9D6F7FAD7FADBDAD7D6B7B5B6D6D7DAD7FAD7D6DBFAFB49 +:2016C000FAD7F6F6F5F2F5F6F5F5F5F6F5F5F9FAF9F5F5D5D4F5F5F5F0F1F4F1F4F1F5F5C9 +:2016E000F4F1F5F5F5F5F5F5F5D1F5F5F4F5F5D1F0D1F0F1F0F1F5F5F9F6F9FAF9FAD56968 +:2017000024242420200024242424242528284C4D504D5051707195767571704D280404045A +:2017200000200000002400240024002400240024002400040000002400242592DBFFDBFFD6 +:20174000D7FAD2AD606480A481C9B2F6D6FAD7FAD7DAD7DAB6DAB7DAD7FAB6D6B6FAD7FB5C +:20176000F6FAF6FAD5F5D5F9F5F9F5F5F5F5F5F9F5F9D5F5D1F5D1F5D1F0D1F5D5F9F5F9BA +:20178000F5F9D5F5D5F9F6F9F5F9F5F5F5F5D1F0CDF0CDF1F1F5D1F5F5F9D5F9F5F9B16867 +:2017A00024482024002400242024242400240448284C2C4C4C7071755170284C0424000446 +:2017C000000000000000000024252405240004002405240004000000000149B7FFDBFADB6E +:2017E000FADBFAD2A965808184A9B1D2D6D7DAD7DADBDADBDAD7D6D7DAD7D6D7D6DBFAFB5F +:20180000FAFBF9F6F5F6F5F6F9F6F5F6F5F6F5F6F5F6F5F5F5F5F4F1F0F1F4F5F5F5F9F914 +:20182000F9F6F5F5F9FAF9FAF9F6F5D1F0F1F0F1F0F1F0F1F5F5F5F5F5F6F5F5F5F5D169E3 +:201840002425442424202424242524202400040428292C284C4D70514C2D28282804040496 +:20186000000000240000002400242428002400240024042400040004002469FEDBFFFBFEB6 +:20188000DBFBF7FAAEAD818485CDB2F6B6DAD6FAD7FBDBFAD7DAD6DAB6D6D6FAD7FBFBFF97 +:2018A000D7FAF6FAD5F5F5F9D5F9F5F5D1F5D5F5D5F5F1F5D1F5F1F5D1F5D5F5D5F5D5F9E3 +:2018C000F5F9F9F9D5F9F9F9D5F5CDD0CDF0CDF5F1F5D1F5D1F5D1F5D1F5F5F9D5F5B18D8E +:2018E000496D6D8D2424002420442444002000240428284C284C4D4C2828284C24240428D7 +:20190000000000000000040524042425240424052404242524042401002591FBFADBFFDBDE +:20192000DADBFAFBD68E646564AED6D7D6D7FADBFADBDADBDAD7D6D7D6D7FAFBFAFBFFFB16 +:20194000FADAF9F6F5F6F5F6F5F5F5F6F1F1F5F6F5D1F4F1F0D1F0F1F4F5F5F5F4F5F5F658 +:20196000F9FAF9FAF9D5F5D5F0CDC8C9CCCDF0F1F4F1F0D1F0D1F0F1F0F1F5F6F5D5D5D698 +:20198000B5B6DAB66820242524242425240024052424282928292829040428292804242990 +:2019A000002000000024002404240424002400240024042404280024004892FFDBFEDBFFFF +:2019C000DBFEDBFBB26D4544458DB2D6D6FAD7FADBFADBFBDBFAD7FAD7FADBFFDBFFDBFF05 +:2019E000FAFAD6FAD5F5D5F5F5F5F1F5D1F5D1F5F1F5D1F1CDF0D1F5F1F5F1F5F1F5D5F988 +:201A0000D5F9FAF9F5F5EDF1C9ECC9ECCDF1D1F5F1F5D1F5F1F1CDF1D1F5D5F9D5F9DAFEC9 +:201A2000DBFEFBDA49240024244420240024002424280428242804040428294D494C284CFC +:201A40000000000000000001242524040400040424040404242524252449B5DBFADBDADBBF +:201A6000DADBDADB95494825244991B2D6D7DADBFADBFADBFADBFADBFADBFAFBFFFFFEFB8A +:201A8000FAFBF5F6F5F6F5F6F5F6F5F1F1F2F5F5F5F5F4D1F0F1F0F1F0F1F4F1F4F1F5F5EC +:201AA000F9F6F9F5F5D1ECC9E8E9ECEDF0F1F1F1F1F1F0F1F1F1F0EDF0F1F5F6F9FAFAFF27 +:201AC000FEFFFEB66C24242024242424240004042425242424040405484D5051714D6C7132 +:201AE000000000240000002400240024000400240024002400242428246DB6FADBFADBFE87 +:201B0000DBFBDBFA926D2548214969D6D7DAD7FBD7FADBFAD7FBDBFFDBFBFBFFDBFFFBFF8C +:201B2000F6FAF5F9D1F5F5F9D2F5F1F5D1F5D5F9D5F9F1F5D1F5D1F1CDF1F1F5D1F5D1F566 +:201B4000D5F5F1F5CDF1E9ECC9ECCDF1CDF1F1F5CDF1D1F5F1F5F1F1CDF1D5F9D6FAFAFE8B +:201B6000DBFEDADA8D8D696C496824480424042804282448252400484D717195727171BA7D +:201B80000000000000000001040424040400240524000001040424252449D6DBFADBFADBA9 +:201BA000FADBFADBB149482544456DB2DAD7DADBDADBFAFBFADBFEFBFAFBFFFFFEFBFAFBAD +:201BC000FAD6F5F6F5F5F5F6F5F6F5F6F5F2F5F6F9F5F9F6F5F1F0F1F0F1F5F1F0F1F5F19B +:201BE000F0CDCCCDECCDECE9E8E9F0F1F0F1F1F1F0F1F5F1F0F1F1F1F0D1F5F6F9FAFEFB6A +:201C0000FAD6FADBFAD6D6D6D5916C4524242829240424254425244971727576957299BA84 +:201C2000000000000000002400240024002400240024002400240024006DD6FADAFADBFA7A +:201C4000DBFADBFBB28D454945696AD6D6FAD7FAD7FADBFFDBFFDBFFDBFFDBFFDBFEDBFFB7 +:201C6000F6FAD6F5F5F5D5F5F5F5D2F5F1F5D5F9F9F9F5F9F5F5D1F5D1F5F1F5F1F5F1F18C +:201C8000CCCCC8CCC8ECC9ECC8ECCDF1CDF1CDF1CDF5D1F5D1F5D1F5F1F5D1F9DAFEFAFA31 +:201CA000D6FAD6FAFAFAD6FAD6D549442448244824280424244825484D917175719596BA49 +:201CC000000000000000000024052400040000000000000004000400246DDADBFADBFADBBB +:201CE000FADBFADBB66E694544498DB2DAFBFADBDAD7FAFBFAFBFADBFAFBFADBDADBFAFB0E +:201D0000FAF6F5D6F5F6F5F6F5F6F5F6F5F6F9FAF9FAF9FAF5D5F5F5F5F5F5F1F0F1ECCD7A +:201D2000CCCDECC9E8E9E8E9E8E9ECEDECCDD0F1F0F1F0F1F1D1F1F1F5F2F5F6FAFAFADA8F +:201D4000FAFAFAFBFADAD5D6D58D68446869484848242424484948294C6D71719596959605 +:201D6000000000240000002400240024000400040024002400040024006DD6FAD6FAD6FA7E +:201D8000DBFAD7FA928D6969254969B2B2FAFBFFD7FBDBFFDBFFDBFFDBFFDBFFD7FADBFEBF +:201DA000D6FAD6F9D1F5F5F5D1F5F5F5D5F5D5F9D5F9F9F9D5F5F5F9F5F5F1F5CDEDCDECD1 +:201DC000C8ECEDECE8E8C8E8C9ECC9ECC9ECCDF5D1F1D1F1D1F1D1F5D1F5D6FAD6FAFAFEAB +:201DE000FAFEFAFEFAFEFAF9D6F9B1B08DD18DB16D6C2448244C2848284C4D7571957195D5 +:201E00000000000000000000000000000000000000002425000004012069D6D7D6D7FADBBC +:201E2000FADBFAD7916969492425446991D7FFFBFADBFADBFAFBFFFBFAFBFFFFFAFBFAFB82 +:201E4000FAD6F5F6F5F6F5F6F5F2F5F6F5F6F9FAF9FAF9F6F5D1F5F6F5F5F5D1ECEDECED4C +:201E6000ECEDF0F1ECC9E8E9E8C9CCC9CCEDF1F1F0F1F1F1F1F1F1F1F1F2F5F6FADAFAFB23 +:201E8000FADAFAFBFEFAF9DAF9F6F5D1D1D1D5D6D9B28C4948484C4D4C4D5051704D4C4D93 +:201EA000000000000000000000000000000000000024002400040000006DB6FAD6FAD7FA18 +:201EC000D6FAD6B249482524002400446DDADBFFFBFFDBFFDBFFDBFFDBFFDBFFFBFFFBFB1B +:201EE000D6FAD6FAD5F9D2F5D1F5D1F5D5F9D5F9F5F9F5F5D1F1D1F5F5F5F1F1C9ECCDF1E6 +:201F0000D1F5F1F5EDECC9E8C8ECC9ECCDF1F1F5EDF1CDF1EDF1CDF1D1F5D6FADAFAD6FA0C +:201F2000DAFAD6FAFAFAD6FAF5F5D1F1D1F5D1F9FAFEB191486C4D704C704D704C70284CA9 +:201F40000000000000000000000000000000000000002400000000002069D6D7DAD7DAD7C5 +:201F6000DAD7B56D48452421242524256DB7FEFBFFFBFFFFFFFBFFFBFFFFFEFBFBFBFAFB3F +:201F8000FAD7F5F6F5F6F5F2F5F2F5F5F5D5F5D5F5F5F1D1F0CDF0F1F5F5F1D1ECEDF0F19E +:201FA000F4F5F5F5F1CDECC9ECEDECEDF0F1F1F1F0EDECEDF1EDD0CDF5F6FAFAFAFBFAFB6C +:201FC000FAD7D5D6F9FAF9D6F1CDCCCDF5F6F9FAF9FAD9D69471504D7071704D4C4D2828C3 +:201FE0000000000000000000000000000000000000000024000000240049B2FAD6FAD6FA04 +:20200000D6D6928D45482024002400242592DBFFDBFFDBFFDBFFFFFFDBFFDBFFDBFFFBFF37 +:20202000D7FAF6FAD6F9F5F5D1F5F1F5D1F5F1F5D1F1EDF1CDEDCDF1D1F5F1F1CDF1EDF172 +:20204000D1F5F5F5F1F1EDECC9EDEDF1CDF1CDF1CDEDC9EDCDF1CDF1D2FAD6FADBFFFBFFA9 +:20206000FBFAD1F5D5F9F1F5C9E8A9F1D1F5D6FADAFEFAFED6B56C6C4C7051702C4C284C74 +:202080000000000000000000000000000000000000000001000000000025B1D7D6D6FAD715 +:2020A000D6B6B16E6845442020202401246EDAFFFEFFFFFFFEFFFFFFFEDBFFFFFAFBFBFBDC +:2020C000FAFBFAFAF9F6F5F6F5F1F5F1F0F1F1F1F0EDF1EDECEDECF1F0F1F1F1F0EDF1F1BB +:2020E000F1F1F5F6F5D1ECEDECEDF1F1F0F1F0CDECEDECEDECEDF1F2F5F6FAFBFADBFEFBFF +:20210000FAD6F1D2F1D1F1CDC8C5CCF2F5F1F5FAFEFAFEFBD5B1906D4C4D4C4D4C28284DFD +:20212000000000000000000000000000000000000000000000000000002469D6D6D6D6DAE0 +:20214000B6B68E6D6588658444642524206DB7FFFFFFDBFFDBFFDBFFDBFFDBFFFBFFFBFBDE +:20216000FAFAD6FAF6F9F6F5F1F5F1F5D1F5D1F1EDF0E9EDC9ECCDF1CDF1CDF1EDF1EDF10F +:20218000D1F5D1F5F1F1CDEDCDF0CDF1F1F1CDCCC9EDE9EDEDEDCDF1CDF1D2FADBFEDBFFC0 +:2021A000FBFAD2D1CDF1C9C8A0E8C9F1CDF1D1FAFAFEDAFED6B18D8D4848244C2848246CFC +:2021C000000000000000000000000000000000000000000000000000000168B2D6D6D6D68C +:2021E000D6B28D498489A8A988654845486EDAFFFFFBFEDBFEDBFADBFADBFADBFAFBFAFB05 +:20220000FAFBFAF6F5F6F5F1F1F1F1F1F0F1F0CDECEDECE9E8E9ECEDECEDECEDECEDF0EDE6 +:20222000D0D1F5F5F1D1ECEDECEDECEDF1EDECC9ECEDECEDEDCDECC9CCC9D1F2FAFBFEFFC8 +:20224000FEDBF5D2F1EDECC5C4C5ECEDECCDF1F6F9FAF9FAF5B18C8D6C4428282824484DC7 +:20226000000000000000000000000000000000000000002000000000002025B1D6D6D6D6F0 +:20228000B2B28E6960A8A5A8658845684591B2DAD7FFDBFFDBFBDBFFDBFBDBFAD6FAD6FAE7 +:2022A000D6FAD6FAD6F5F1F5CDF1EDF1CDF1EDF1C9EDE9ECC9ECE9ECC9ECEDF1CDEDCDF175 +:2022C000CDF5F1F5CDCCC9ECCDF1CDF1EDEDC9ECC9EDCDF1CDEDC9EDC5E9CDF5D6FEFBFEDC +:2022E000DBFEF6F6EDF1E9ECC4E8E9EDC9EDCDF5D6F9F6FAD2D1ADB16D68284C28484C7037 +:2023000000000000000000000000000000000000000024000000000000002469B5D6D6D6D5 +:20232000B1928D658485A88564656849696A8D8E91B7FAFBFAFBFFFBDAD7DAD7D6D7FAFB9A +:20234000F6D6F5F6F5F6F5F2F0D1F1EDECEDECEDECEDECE9E8E9ECEDECC9ECEDECEDECED0B +:20236000F0F1F5F1ECC9E8E9ECEDF0EDECC9E8E9ECEDD1D2D1CEEDC9E8C9CDF2F9FBFEFBA6 +:20238000FAFBFAF7F1CEEDE9C4C5EDEDE8C9EDF2D5D6F5F6D5D2D1D2B18D4C4D4C4D70719E +:2023A000000000000000000000000000000000000024244400200000000000448DD6B2D642 +:2023C000B2B1696464A985884568496D496D4969458D92DADBFFDBFFD7DAD7DAD6FAF7FAD3 +:2023E000F6F6D6F5F1F5F1F5F1F1EDF1C9ECC9EDE9ECE9EDC9ECE9EDC9ECC9EDCDECCDF117 +:20240000F1F5F1F1C8C8C4E8C9ECEDF1C9E8C5EDCDF1ADD1ADD1CDCDC5E8C9F1D6FAFAFA43 +:20242000DAFEFBFAF2F1EDEDC4E8C9EDC9EDC9F1D1F5D1F5D2D5D2F6B5B56D704C7051955C +:202440000000000000000000000000000000000000254849240000000000002068B2D6B2E0 +:20246000B18E89656485686569696969696A69454445496EB1D7FAFBFADBDAD7D6D7F6D797 +:20248000F5F6F5F6F5F1F5F1F1F1ECEDECE9E8E9ECEDECEDECE9ECE9E8E9ECEDECEDECED81 +:2024A000F1F1ECCDC4C4C4C5E8E9ECEDE8C9E8E9CDCDADAED1D2F1CEE9C9EDEDF5FAFAFA7E +:2024C000FAFBFAFBF6D2F1CDC8C9E8C9E8E9ECEDF1F2F1F2F5D2D5F6F9B690494C4D4C4D8E +:2024E000000000000000000000000000000000000024454825240024000000242591B2B67C +:20250000AEAD898865896969496D49694969454945492544458D92D6D7FAD6D6B2D6D2D609 +:20252000D2F5F1F5D1F5F1F5F1F1EDECC9ECC9ECC9EDEDF1C9EDE9ECC9E8C9ECC9EDEDF104 +:20254000EDF1C9E8C4C4C4E8C4E8C9ECC9E8C9EDADCD8DB1B2F6F2F1C9EDCDF1D1F9D6F9A0 +:20256000D6FAFBFED6F6F1D1A5C8C9EDC5E9C9EDCDF5F1F5D6FAD6D5D6FA91682428284CD1 +:202580000000000000000000000000000000000000002425242024000000002124499192D9 +:2025A000AD8DA985698A6D6A6949484948454445444564454441446AB1B2D6D2D1B2D1D2FA +:2025C000D1D2F1F2F1F1F1F1F0EDF1EDECC9ECEDECEDECEDECCDECEDE8E9E8E9E8EDEDEDD3 +:2025E000ECE9E8C5C4A4C4C5C4C9E8E9ECC9CCEECDADB1B2D5D6F5F2EDCDF1F2F1F2F5F6C1 +:20260000F5FAFEFFFEDBFAD2C8C9E9E9C8C5C8CDF1EDF1F2D5F6D5B1D1D6D56D2424282415 +:20262000000000000000000000000000000000000000004425480024000000242469696D3E +:2026400089AD85A969AD6A6949492544454421442044456545442144458D8ED2B2D2AED113 +:20266000CDF1CDF1CDF1CDF1EDF1EDEDC9ECC9EDE9ECEDEDC9ECE9EDC4E8C4E8C8ECC9ED43 +:20268000E9ECC4C4A4A480A4A4C8C9EDCDF1CDF1ADD1AED6D6FAF6F5CDF1CDF1D1F5D1F50E +:2026A000D6FADBFEFBFEF6F6CDEDC9E9C5E8C9EDEDEDCDF1D1F5D2D1A9F1D6D56D4404249E +:2026C0000000000000000000000000000000000000002425484524000000000124496849E1 +:2026E0008889A8A9AD896945442120214445444144454445444544214445698EB1AECDCE66 +:20270000EDCDECEDECCDECEDF1EDECEDECEDE8E9ECEDECEDECE9ECC9C4C0C4C5E8E9E8C968 +:20272000E8C9C8A5848060608485A8A9CDCEF1D2D1AED1D2F5F6F5F2F1F2F1EDF1F2F5F181 +:20274000D5FAFEFBFEFBF9F6F1EDE8C9E8E9E8E9EDCDCCEDF1D2D1D2CDCED5D6B169242417 +:202760000024002400000004000000000000000000240048254824240000002420696D9141 +:2027800089ACC9EDA9A96564204020442044204421442144254425442144456869ADCDF125 +:2027A000CDEDEDF1C9EDC9F1EDF1EDEDC9EDC9ECE9EDE9EDC9ECE9E8A0C4C0E8C4E8C4E858 +:2027C000C5E8C9C860604064608889CDADD1D2F5CEF1D2F5D2F5D1F5F2F1EDF1CDF1D1F57C +:2027E000D5F9DAFEDAFAD2F5D1F1C9ECC5E9C9E9A9CDA9F1D2F6D2D1ADD1D1F5ADAD444420 +:2028000004000400000004000000000000000001240024252425442520002021448DD5D6AF +:20282000F1CDEDEDCDC9A9A984656441442124252425242524252425242544256489CDEE5E +:20284000ECC9ECEDECC9ECEDEDEDEDEDE8C9C8C9E8E9E8C9C8C9E8C9C4C0E4E5E4C4E4C504 +:20286000E8E9CCA9846064616485ACADADB2D1D2F1D2F1F2F1F2F5F2F1F1F1EDECEDF1F239 +:20288000F5F5F9FAF9D6F5D2F1D1EDC9C8C9C9EEF1CEF1F2F5F6F5B2ACD2F5D2ACAD884467 +:2028A000002404280448294824280004000000000024002400242548202420688DD5F6F5C9 +:2028C000F1F1E9EDC9E8A9C9A5A885894444214424442144244421242044204460A9C9EDD4 +:2028E000C9ECC9EDE9ECC9EDEDF1E9EDC9E8C4E8C8E8A0C4C4E8C9E8C4E4C5E8C4E4C4E8B7 +:20290000C8ECC9C86484608484A889CDADD1D2F5D1F1CDF1EDF1CDF1F1F1EDF1EDF1EDF147 +:20292000F1F5D1F9F6F9D2F1D1F1CDEDC5E8C9EDF2F6F2F1CDF1D2F5ADD1F2F1CDD1AD84D6 +:2029400028294C4D717271716C4D480400000000040424042424444548456891F5F6F5D18B +:20296000F1EDECC9C8C5A480A4A5A48564414420442540214421202044204040A4C9EDEDFE +:20298000E8C9ECEDEDC9E8E9EDEDECE9E8C5C4C5E8C5C4C4C4E9E8C9C4C5E4C5E4C5E4E50A +:2029A000E8E9CCA9A4858485A8A9CCCDD1D2F5F2F1CDECEDF1EDF0EDF1F1ECEDECEDECED6C +:2029C000F0F1F1F1F5F6F1D1ECEDEDC9C8C5C8E9EDCECDCDEDCDF1F2CDADF1F1CDCDD18978 +:2029E000719576997295717571914D4800000020000400240024206869B1D6FAD6F5F1F5AF +:202A0000EDF1EDECC9C880A480A4A5A460604044204440644040406440646084A5EDE9ED7D +:202A2000C4C4C9EDC9EDC9EDC9EDC9ECC5C8C4E8C4E4C4E4C4E8E9ECC5C4C0C4C0E4C4E81A +:202A4000C9EDC9C884A8A4C8A9CDC9CDA9F1D1F5EDF0C9ECC9EDCDF1CDF1EDECC9E8C9EC28 +:202A6000C9ECCDF1D1F5F1F1C9EDE9EDC5C8C5EDC9EDCDF1CDEDD1F5CDD1CDF1C9EDD1F1A8 +:202A80009596BA96959695769595954D24000001000000012420244991D6F9F6F5F6F5F27A +:202AA000F1CDEDEEEDC9C8A5A4A5C8C9C8A588856040606160618485848084A5C8E9EDE927 +:202AC000C4A0C8EDE8E9E8E9E8E9ECE9E8C4C4C5E8C5C8C5C4C5E8E9C4C5C4C5C4C4C8E981 +:202AE000E8C9C8C5A4A4C8C9C8C9EDC9C8C9F1EDECCDECE9ECE9ECEDECEDECC9C8C9E8E9DD +:202B0000ECEDF1EDF0F1F1EDECCDEDC5C4C5E8E9ECEDEDEEF1EDF1F2F1D1F1D2C8CDD1F129 +:202B20009ABA969A9699759571999671250400000000000000244491B6FAD6FAF5F5D1F575 +:202B4000EDF1CDF1EDEDC9EDC5E8C9EDC9EDA9A9646460846084808480A480C8C9EDC9E976 +:202B600084A4C5EDE9EDC9E9C9ECE9EDC4C4C4E8C5E8C5C8A0C4A4C8C4E8C5E4C4E8C4EC79 +:202B8000C9E8A5C8A4C8A5C8C9EDC9EDC9CCC9F1EDEDC9EDE9ECC9EDE9EDE9E8C4E8C9EC60 +:202BA000C9ECCDEDCDF1CDF1CDEDC9C8A0C4C5E9C9EDC9EDEDF1CDF1D1F1D1F1A8F0D1F5E3 +:202BC00099969576957695759596957148000000000000004469B1D6F9FAF9F6F5D2F1F26D +:202BE000F1CDECC9ECEDECC9ECC9C8C9EDEDCDA984606061808180808081A4A5E8EDCDA903 +:202C00008485C8C9E8E9E8C9E8EDEDC9C4A0C4C5E8E9E8C5A4A0A4A5C8C9E8C9C8C5C8C9B5 +:202C2000E8C5C4C5C4C5C8C9E8E9ECEDECC9C8C9ECE9E8C9E8E9E8E9ECE9E8C9E8E9E8E904 +:202C4000ECEDECEDECEDF0EDEDEDE8C5A0A0C4E9EDE9C8C9ECEDECEDF1F2F1D1CCCDF5F656 +:202C600075757575517575957195716C040400000000002469B5D6FAF6FAF6F9D5F5F5F520 +:202C8000CDEDC9ECC5E8C9EDC9EDC9E9C9EDC9C96060608460808080608080A8C9EDA9A81F +:202CA0004064A5CCC9EDE9EDC9EDEDEDA0A0A0C8C5E9C9C8A0A480C4A5E9E9ECC4C8C4E8D9 +:202CC000C5C8C4C8A4C8C4E8C9EDE9EDC9C8A4E8C9E8C5E8C5E8C9E8C9E8E8E8C4E8E8EC5D +:202CE000C9EDEDECC9F1EDF1CDF1E9C8A0A0C5E9C9E9C9E9C9EDCDF1CDF1D1F1C9EDD1F978 +:202D00007451747574717571714D4C250000000100000049B1D6F9D6D1D1D1D2F5F6F5D175 +:202D2000CCEDEDE9C8C5C8C9ECCDEDC9C8C9EDCAA88584618060806160606085A8A988617D +:202D4000404084A9C8C9EDC9E8E9E8C5A080A4C5C8C9C8A5C4A0A0A1A4C5E8E9C8C4C8E95E +:202D6000C8C5C4C5C4C5C8C9E8E9ECEDECC9C4C5C8C9E8C9E8C5E8C5E8C5E8E5E8E9E8E983 +:202D8000E8E9ECEDECEDEDEDEDEDEDC9C4A0C4E9E8E9E8C9ECEDF1EDECCDF1F2CCADD0F621 +:202DA000507451745150294C284804040000000000242091D6FAF6F5D1D1D1F5D5F9F1CD78 +:202DC000C9EDE9EDC9C8A5C9A9EDCDEDA5C8A9EDC9C98584608460806064406460844040EA +:202DE00020446088A5CDC5C9C5E8A5C480A080C4C9E8A0A4A4A480A080C8C5E9C4C8C5E881 +:202E0000C4C4A0C4A4C8C5C8C8ECC9EDE9E8A0C4C4E8C5E8C4E8C4C4C4E8C4E8C4E8C9E8EC +:202E2000C8ECC9EDCDEDCDEDCDF1EDEDC5C4A1E9C5E9C9EDCDF1CDF1CDF1D1F5ADAC69D50E +:202E400074717451702D28040400000000000000000068D6FAFAF5F6F5F2F5F6F5F2F1C96B +:202E6000E8E9E8E9E8C5A4A5A8A9EDCDC9A5A8A9CDC9A885848180606060404060604040C8 +:202E800040406465A4A5C8C5C4A5C8A5808080A5C8C5A480A4A5A08080A5C4C9C8C5C4C536 +:202EA000A4A0A4A5A4C5C8C5C8C9E8C9E8C5A4A0C4C5C4C5C4A5C4C5C4C5E4C5E8E9E8E984 +:202EC000E8E9ECEDECEDECEDEDEDEDEDEDC9C4C5E8E9E8E9ECCDCCC9ECEDF1F1AD89486D0D +:202EE0005074507471500404000000200000000000248DFAD6D5D1F5D2F6D6F9F2F1EDEDF1 +:202F0000C5E8C5E8C9C884A465A9C9EDA9C985A485C9A9A88084608460644064406440600C +:202F20004044406480A8A5C8A0A4A5C8808080A4A5C480A480A480A480A4A0C8A5C4A4C4CD +:202F400080A4A0A4A0C4A4C8A4C8C5E8C5C4A0C4A0C4A0C4A0C4A0C4C4E8C4E8C4E8C8ECEB +:202F6000C9ECEDEDCDEDEDF1CDEDCDF1E9EDC5E8C5E9C9EDC9CCA8CCC9ECCDF18DB12448A5 +:202F800074717475956D280400000000000000002069D5D6D1ADADCED1D2F5F6F1CDEDE9E6 +:202FA000C8C5C8C9E8C9A8856485A9CECDC9A8858485A8858080808164606441404064610D +:202FC000444040408485C8A5A0A0C4A580808080A480A48080A5A4818080A4A5A4A0A4A06B +:202FE0008080A4A5A4A4A4A5A4A5C4A5A4A0A4A0A0A0A4A5A4A0C4C5C4C4C4C5E8C9E8E9D4 +:20300000E8E9ECEDECEDECEDECC9ECC9EDE9E8C5C8C5C8C5C8C9CCC9C8C9CDCDB1B26C2508 +:203020005175719571712524002400240024002020D1D2AD84A8C9F1ADD1D1F1C9EDC9E90F +:20304000A4C8A5EDCDEDA9A4648885ADC9CD89844464606480A48084606440644064606446 +:203060004064204464A885A480A4A5A8808480A480A48080608480846084808080A480A442 +:2030800080A480A480A480A480A480A480A480A4A0C4A4C4A4C8A4C8A4C4C4E8C9E8E9ECD2 +:2030A000E9ECC9EDC9ECC9EDC9EDC9E9C9EDC9E9A5C88584A9EDC9EDC9ECCDF1B1F56E48B9 +:2030C0004C4D4C4948292400040004000001000068D2ADA9CDCDEDC9C8C9EDCDE8E9ECC973 +:2030E000A8A5C8CDF1CDCDA564656485A9A9896564416061808184606440604060616460B8 +:2031000064614040648584848080A4A584808480848180808060848080808080808080803F +:20312000A4A5A480808080808480A080A4A0A4A5C4C5C4C5C8C9E8C9C8C5C4E9E8E9E8E941 +:20314000E8E9E8E9ECE9ECEDECE9E8C9E8E9E8C9A8A5A485C8CDECC9E8E9ECEDD1D6B54908 +:203160000024002400240424000404240024004489D1CDF1F2F1C9C8A5EDE9EDC5C8A9CD30 +:203180008988A4CDCDEDC9C985846488658965682044406460646084404440644064608451 +:2031A0006064406460848484608480A460848084608460846060608460848084808480A44F +:2031C00080A484A4608080A480A480A480A4A4C8A4C8C4E8C5E8E9ECC5E8C5ECE9E8E9EC29 +:2031E000C9E8E9ECC9ECE9ECC9EDE9ECC5E8E9EDA5A4A9ADA9F1C9C8C9ECCDF1ADD1B668D8 +:2032000000000400244948292404240520002045D1D2F5F6F1CEE9C9E8EDEDE9C4A084A9BB +:20322000A86584A9C8A9C9C9A88584654440442540206465646064654440444564608461E2 +:20324000606060616065848584608481806080806060606060606461846084808080A4A520 +:20326000A4A5A480808080808080A4A4A4A5C8C5C8C9E8E9E8E9ECE9E8C9E8E9E8E9ECE993 +:20328000E8E9E8E9E8E9E8E9E8E9E8E9C8C5E8E9C880A8A9CCCDCDA9A8CDECF1B1B2DA496A +:2032A0000428254D4D914D4D28280424002441ADD2FAF6F6CDA9A5C9EDF1C9EDA5A4608411 +:2032C0006484608484A4A5C9A5C485842040204420444068646460644464406460846084AA +:2032E0006084606060846584848460846084608060806064606460846084808480A480A431 +:20330000A4A480808084808480A4A0A4A4C8C4E8C4E8C9E8C8ECE9ECC8E8C5E9E9E8E9EDF2 +:20332000E9E8C9E8E9ECE9E9C9E8C9E8C5E8C5E9C9A484A8A9F1ADA884ACCDF5B1D1D66D68 +:2033400071729596B5969576714D2804202588D2F5F6F5D2A86184A9F1F2EDCDCDCDAC892C +:2033600084858484A484A4C5C8A5A885644044454040406584648464646464648461848472 +:2033800084606060606184858460606060616060806060606060606084818480A484A4A500 +:2033A000A48480808081A480A4A5C4C5C4C5C8C5E8E9E8E9E8E9E8E9E8E9E8E9E8E9E8E950 +:2033C000E8E9E8E9E8E9E8E9E8E9E8E9E8E9E8C9C8A58485A8ADAD896889D1D2B1B2DA6D46 +:2033E00096B996BA96BA9ABA96954D482068ADF6D2F6D1A86084A5EDCDF1CDF1CDF1EDCDF4 +:20340000A5CDA9C8A5A480C8A5C484A8656464644040408860848084608460846084608452 +:20342000606460644064608460846060406460846084608460806084608480A480A480A474 +:2034400080A480A480A4A4C8A4C8C4E8C5E8C4E8C4E8C4E8C5E8C9ECC9E8C4E8C5E8E9EC8A +:20346000C9E8C9ECC9E8C5E8C5E8E9E8E5E8C9E8C5C480A484AD8E8D6991B1D16EB2B66DD4 +:20348000717195969596999A99969149446DF5F6F5D2A8616085CDEEF0CDEDEDEDEDF1ED5D +:2034A000C8C9EDC9C8A5A4A1A4A5848584658465604064658480A480848084818460848568 +:2034C000646060406060848180806060606184618060806180608060808080808080A081BB +:2034E0008080A4A5A4A5C8C5C8C5E8E9E8C5E8E9E8E5E8E9E8C9E8E9E8C5E8E9E8E9E8E991 +:20350000E8C9ECE9E8C5E8E9E8C9E8E9E8E9E8E9E8C5A4A584A98D8E6D6EB18E6D8E966E2C +:2035200051745174517471957195514C4891D2F5CDC8808484CDCDEDC9EDC9EDEDEDCDED4F +:20354000C9EDC9E9A9A8808480A480A4848464644064608480A480A4808460846084608416 +:20356000406440646084608460846060608480846084608480A46084808480A080A480A473 +:2035800080A4A0C8A4C8C5C8C4E8C5E8C5E8C5E8C4E8C5E8C9ECC9E8C5E8C5E8C5E8C9ED77 +:2035A000C9ECC9EDC9E8C5E8C5E8C5E9E9E8E5E8C5E8A1C88588456E6E926E6E4A92926DBC +:2035C00050515051705170717171502D4C6DACADC8A58485A8CDEDEDEDE9E8C9ECC9EDEDBB +:2035E000EDEDE8C9C8858484A4A5A4A4848464606460646584848480848084808460646441 +:203600006440404060608080848160608081848180618480A0808080808080808080A080D6 +:20362000A4A5A4A5C8C5C8C5C8C9E8C9E8E9E8E9E8C5E8C9E8E9E8E9E8E9E8E5E8E9E8E9BA +:20364000E8E9ECE9E8C9E8C5E4C5E8E9E8E9E8E9E8C5A4A58865496E7293926E6D6E914AF5 +:203660002D504C504D504D704D702C4C284C89CDA5A484C8A9EDC9EDC9EDE9ECC9E8CDF1FD +:20368000EDEDC9C8A5A460A484C8A5C884A4608460646084808480A4808480846080608411 +:2036A000406040644060608460846084608484A4608480A480A480A480A080A480A480A492 +:2036C00080A4A4C8A4C8C4E8C5E8C4E8C5E8E5E8C5E8C4E8C5E8C5E8C5E8C5E8C5E8E9ECE0 +:2036E000C9E8E9ECC9E8C5E8A0C4C4E8C5E8E9ECC9C480A46588256D6F9793924A926E4966 +:203700005051504D2828282928294C4D4848ACCDC8A5C8C9CDCDEDEDEDEDEDE9E8C9ECED2B +:20372000ECC9C8C5A4808485A4A9C8C9A8A58480606060608480A481808084818060646198 +:203740004040404040408081808084818081A4856060A485A080A4818080A481A080A4A101 +:20376000A4A0A4C5C4C5C8C5C4C5E8C5E8C5E8E9E8E5E8E5E4C5E8E9E8E5E8E5E4E5E8E98A +:20378000E8E9ECE9E8E9E8C5C4A0C4E5E8E9E8E9C8A080816465494A727396934D6F922A0B +:2037A0007195714D242404240428284C486CADD1A5C8A9EDCDEDC9EDEDEDE9EDC9E8C9ED79 +:2037C000E9ECC5C8A4A4608484C8C5EDC9C88584608060806084808480846084808060646F +:2037E00040644044406460846084608480A48584608480A480A480A480A480A480A480A444 +:2038000080A4A0C8C4C8C5E8C4E8C4E8C4E8C5E8E4E8C5E8C4E8C5E8C4E8C5E8E4E8E5E86E +:20382000C9ECC9ECE9ECC9C8A0C4A0E4C5E8C5C8A4A46084648825694E9673934A92934D4A +:20384000999A954D2804242524252828686DCDADA8C9CCEEF1EDEDCDEDCDECC9E8C9C8C982 +:20386000ECE9C8C9C885806084A5C8C9C8C9A48080808060808184808080808080606060C1 +:20388000404040404041806180808080A4A584606081A485A4A4A4A0A4A0A4A0A0A1A0A0FA +:2038A000A4A0A4A5C4C5C4C5C4C5C4C5C4C5C4C5E4E5E8E5E8E9E8E5E8E5E4E5E8E5E8E9DD +:2038C000E8E9E8E9ECE9E8C5C4A0A0C5C4C5C4A5A48160608465494A4E7392734E6F964E41 +:2038E00071959671292824280428244844B1CDCDA5CDCDF1CDF1EDEDA5C8C9E9C5E9C4C8D6 +:20390000C5E8C5E8A5A4808480A4A4C8A5C8A4A460806080608480846080608460804064CB +:2039200040404044406460846080808480A48080608480A480A4A0A480A4A0A480A480A4D3 +:2039400080A4A0C4A0C4C4C4A0C4C4C4A0C4C4E4C4E8C5E8C5E8E9E8C5E8E4E8C5E8E9E82D +:20396000C9E8E9ECC9EDC9C8A0A4A0C4C4C4A4C460846084608845694A7273724A72976E22 +:203980004C4D7172916D4C292404242568ADD1ADC8CDEDEEF0CDF1CDA485C4A5C4C5C8A5C1 +:2039A000A4C5C8C9C8A584858080A4A5A4A5A481808080818060848160606461646064410C +:2039C000402040414040806180808081A4A584608085A4A5A480A4A5A4A0A4A1A0A0A0A1B2 +:2039E000A4A0A4A1A4A1C4C5A4A0C4C5C4C5C4C5C4C5E8E9E8E9E8E9E8E5E8E5E8E5E8E95D +:203A0000E8E9E8E9ECE9E8C5A4A0C4C5C4C5A4A580808461848569664E7372734E4E964A04 +:203A2000285071BAB6BA926D2424004488D1ADADA9F1CDF1CDF1CDCD84A480A4A0E8C5C428 +:203A4000A0C4C5E9A9C885A480A480A480A480A480846084608460846064406460644064AA +:203A60002040204040646084608060A480A4608060A4A5A480A480A4A0A4A0A4A0A480A491 +:203A8000A0A4A0A4A0C4A0C4A0C4A0C4A0C4A0C4C4E8C5E8C5E8E9E9E5E8C5E8C4E8C5E89B +:203AA000E9E8C9E8C9ECC5C4A0C4A0C4C4E4A5C48084608484A865694A7273734A6E734975 +:203AC000507195BABABBBA7248042025ACD2ADADADD2EDCDECCDCCA98885A485A4C5E8C519 +:203AE000C4C5C8C9A8A9A8A5A4A5A4A4A48080808480808080808060604040406061444010 +:203B0000202020206061808180608081A4A180608485A4A5A4A5A4A0A4A1A0A0A4A0A4A071 +:203B2000A4A1A0A0A4A1A4A1A4A1A4A0C4A1C4C1C4C5E8C5E8E9E8E9E8E5E8E5E8C5E8E913 +:203B4000E8E9E8C9E8E9C8C5C4C5C4C5E8C5C4C5A4808081848564654E7372734E4A922650 +:203B6000719596BA96BAB69529240048ADD58DD18EB2A9ADA5C9A9A8648884A8A0C4A4C8A2 +:203B8000C5C8C9C8A9A8A5A8A4A8A4A480A4608480848084608460844060404440642040D5 +:203BA0000020002440646084608480A480A0608480A4A5C8A5C4A4A4A0A4A0A480A4A0C4DB +:203BC000A0A4A0A480A4A0C4A0C4A0C4A0C4A0C4C0E8C5E8C5E8E5E8C5E8C4E8C5E4C4ECC4 +:203BE000C9E8C9E8C9E8C5C4A0C4C4E8C5E8C5E8A0A0608480A865892A7273724A4E7349B0 +:203C0000747175769596956E28002049B1B2B1B2928E8965646584658489A8A5A4A5C4C563 +:203C2000E8C5C8C9A889A8A9A4A5A8A5A4848060806084808080846160404040404020207D +:203C400020202020606184656060A4A5A4808485A4A5C4C5C4A5C4A1A0A0C4A1A0A0A4A13A +:203C6000A4A0A4A1A0A0A4A1A0A0C4A1C4A1C4C5C4C5E4E5E4C5E8E5E4C5E4E5E4C5C4E913 +:203C8000E8E9E8E9E8C9C8C5C4C5E8E9E8C5E8C5C4808485A4A589654D6F72734E4A922A17 +:203CA0005074517571956D4C042400488DB192B66E6E6A452044406464A885A4A4C8A5E903 +:203CC000EDE8A4C884A885A884A884A884A460846084608480A4608460844060204400200E +:203CE0002020204460846164608485A4A0A480A4A0A4A5C8A5C4A1A4A0C4A0C4A0C4A0A433 +:203D0000A0C4A0A4A0A4A0A4A0C4A0C4A0C4A0C4C4E4C5E8C4E8C5E8C4C4C4E8C4E8C4E8A9 +:203D2000E9E8C9E8C9E8C5A4A0C4C5E9E9E8C5E9C5C480A4A4A865854A9273724A6E6F4A41 +:203D400050517051714D4824040000256D729697726F69254445644584858480A4C9E8E9B6 +:203D6000EDC9A8A588858889A885A4848484646084608480848180808461644040412020CA +:203D800020204041646564658485A4A5A0A1A4A5A4A5C4C5C4A5A4A1A4A1A4A0A4A1A4A062 +:203DA000A4A0A0A0A0A1A0A1A0A1C4A1C4C1C4C5C4C5C4C5E4C5C4C5C4C5C4C5E8C5C4C5BD +:203DC000E8E9E8C5E8E9C4A0A0C5E8E9E8E9E8E9C8A5A4A5C8A584856D6F726F4E4A722A3B +:203DE000507451702D28042800240024259297B66F724A49458D898880848084A0E9E9EDB3 +:203E0000CDEDA9A8648884A884A884A484846484608480846084608460846064204020441F +:203E2000204040646084648885A8A4A4A0C4A4A4A0A4A0C4A0C4A0C4A0C4A0C4A0C4A0C48D +:203E4000A0A4A0C4A0A4A0C4A0C4A0C4A0C4C0C4A0C4C4E8C4E4C4E8C5E4C0C4C4E4C4E481 +:203E6000C0E4C4E8C5E8A4A480C4C9EDE9E9E9E8C5C4A0C8A5C885A94A6E73724A4E6E4DE4 +:00000001FF diff --git a/tutorials/soc/lesson12/image.png b/tutorials/soc/lesson12/image.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd7739cac844b53c3fa448542ca735f9ba2ceae GIT binary patch literal 34560 zcmV)dK&QWnP)003kN1^@s60k%7j00004b3#c}2nYxW zdzf=XIv{tZ&N9J)NN@ z6skah064Trij+uAZAq<&cG$8ybQ%5A_rM?R`>?}T(6+-7YOAB8JEXQ+Qm8`;Nue`Ny|U)d4_CYA3LPsy*iLervt!UGGW(6hK5?K2-JPzD=90gpkhEW*vew< zSZ{jPXNnj|sW4BOl-g%YhG|NaxzMSjl)_>$aCUw|t(j-fp0VE-oCB-ScRicU25TKR zH(PFQcBq0N6riGjV#Hu9$762C8iJt|L#+mp3Z~$Lvf2pu9(LS+u;An@aQbjTnuQOdqDyT99gOv`!lS||mP^la6It{<);Z3`0;XVmBBdSUp;ArzE$H6Cv* zR^)gvmXslC{xORbNU572DaPx-%aQ3?;xiA|EB@)Hf>9L z;^lW3V=+?jPB>q*^le;6t;!TfraU7KEESCzaR!g0vz08BsEVi{Vi77)1Q9UCA|iP2 z==&aM)FB=+9QQBhOs<8his5*C7#g9t-S@j-FnI3?ogi89UQrdSv4|RSs*n|vm2sy; z3MmSCcGOgmDp+F()>E~TW1^NqE=oNH++xAn2E5LBv=~xViYesW-irZa4aF$QW=yaR zw5CubfmEEaI0SB7+ea}_Dz&tz9ZO*vGlxS)s^9=E?f9*;h%XF-W4Y`ILr=E|EQX%t z#;{l$_B#USuI!B3u z=0r|VwNPq1xz;wy;9LV=2!UENF-EEvoN-udNhwhaOeIpaBC2gcSVyhLNKSbP!rOCD zwNOf;)CwwqLBt_)q#9D0$BdRjj*z3F6hW)OI*+rV@yu+=BrF-BqEslyAFF~E8dz#V zDO3td#&pWiJKP|cWs6poL`6{)Q?sJEV%2~&9;;QTS*azXxzQ|f zf*8oTFpeWCJyk3!6=N&bMrs+E#>l*Pqc; zO39%0cKsaB6FBGSx{lzLQWB7<6-4UGl#VIbMn{RUwu@dpRKWnE?P80uSaI##S%aF2 z)=aJ$ElN=(*8*yel)$1^sitC$5IWD|G+;NGlxK2@R0Rx(2lY^G+wYWSa#W}aRq)j! z&SOo$*~*+UHCJjfjf#knX1KYo$WJcGz2o#Oa{pXe3=WK-DjaSy`{*c)o68mXpj5FgLIZTDvY7$f+rOG%bVl3n;s2GfMbbUDD zs2)LTD5VhN#5~W;Q>GTBl*~LwVocPk$9-)4vuJ6ts}aQqSacmJ7BmZ@w&7W|ao*Z~vt5(6pCLG$Gws~e#yxETBNij=IK)Aff(fwP z1QriE>{?Kl!DmbdZUEa0>I_wcunQdaBlA?LMX5zws#S|%$)%8Dq~!LyhL-%iIhiqp-8k_)YvHq=sEWi6Fj3pr;>X`+w!mcH+f z`znYi&VWsdHH}!SR0;*9q5|DQ@FxbAit!cKD}Dgi3*zl@VOy5-g8lx$JS$S67Rb3$ zOXGYgXJRU71%tua4(mLb3{o+@rx*)H5E8XS@{~yjW!x%<>&mn>Ogqbqs~s;cugIk` z$C~Ai)xfBk&2R#3<^6n46cMHH2f_YjMuKeC`&g9|yBGPE{&cgV82SXsyRoRKON$ zaAZx0sr13&t))aL*%7SAc}Pj2fD5fy$Vcj3OQe*F1%_ae&J$B5Pcvwt7R6eJ#RE`9 z=p4AvqH>%nwIyM0wU<&W0(8MpMX5Ox4|_xdg2k1JO2#`duE{i=E!26(ehTE2sWnk+ z%Meb@QKK}7t%zw+2^?Kmak4(g8-r>l&IcyF;iDH9OfiB8#!3qs7P1OC6^I$*DwcY? z=cou`1+6V|S>ur!AqrL+9mqM6DToA&c*L~moa#(0f*A~(dp-9ab(pgOTw>0KG(#+v zk|Sw`JS$p2iD)r6yI>I%Q)l9|YeMuZQhu9q?{K&(tsC((bi&&T`Y!N(Rz>{D*FUzI zM3RKomez1UtyER8V8uc*Xo11^h=q9`(NYLvq0VTk^wu!+J-!RXl$lDTXrcY~m6=!{{t z^sLq$J_x(3J(s&5Q%b?fvA|Kq2j3!X%7`|AXfar|^uA{`EO3^l#Vs5+b7UC<^H!KC zV8A+%9&A@ASxK`JdV@s}DHstfhJq6FOv%Gh9iSB&6pFS&5JQX3M$rl>)2M>AbW6wS zJ;&L782cTu&WJ>eDs`f9-~@AqT!mYS@o-3d@WC?{!;bBCyak}V;(hW8kS!9>NchjF zj_*o1w*dR(cKh5vBy`s!EvdFuaYDPkQd)Yul?T@AC0aB4!w#tlFA%)4IoS}r;f>et z^W@1B#xe2z@BfI8o?qg8PuCAjapY?M9PjP1+EmCDsv^e@jG}ng(o(IBUQinNoM{z% zsfxuC#5XEcD_RR+5H)zfYXMP0@T`{u>(zqA5D-&Inn{N(AO!C*wgJFmF#_H@Fosf< zm?|WNQs|tc>&#J@R$K?GO-C{T(nN8J^xy`;_Kn))8EQ1(1uI~EL+O+%^Efk2138sr z;ngIhs!)zqze=G>TOciA2}TTEFRV6|%~@vFEzAicUjCSFO00MTOyGQLusL;{f`kW>{-|N#uW)gmYKo`KggKH=*5GgTXabo=Vk1 z&K09VXDZA)oQ3mshqtX)`u5xB{L(Leg_D)xvv0l0g9oqi-uoZ%mw&n8`ex+(-fNtk zob%p?KjAv^MS>% zAf}1k{)%zlVFIi+1LQ)s8M`o;UQk;ZqcZQnNr5Ev3q!Z=30;SliQPCej&rNVZ!dGb zz1p{bu9R9a(2i3bAXLpL1sg1OPB;g_8frG=ZEc;DVzG9>h(ip={{PIy#bu*kl~(|4 zAd+L%b_XUj#*rWV_&t97;S09cds1rqbt{Q@1HEf$IOm9J1X@aW zzG;u8R;+bwR-W^-j?Jb=#4yiuOQ{Hl(b9=w)`F%)ni9r%hQ4nyNQ{(xU^zHWPd1cl ziD}~c#YZ3;=D6qb>Vm_~9y>U271tR;-{IGW>IzdXFe`b2eJ;#9Sgjmg_4q}P?ke>f zro&7w<=7npv}K1zFZA}`rc@j=W!B0xCiZ)nC(qJ(1_xpn%+;~Yd-6PyBUoCGUqoLP ztSKj~7{r;@2~n*t9UV&RdA@AV)uzXNQn>x6Znr7=F7STZ=e_i(CNvgQW{g*CO)P?P zvg)~a?)lso9`Sp>_doKDZ~P*CP$1GR9eLVw@$BzOI_{`f(v+#G{f0xUf3zU&!l*4|{_3nU6 z2I&+tD8sTNbb;&=)I9U{oMXe1F!b2okm5DtVTXz^ESJrNkw&_H zz^r>#YsV_DVD5QiI}mrLyz|vJxV)JuIk4#O6QkjK-~9pq_0Rt+-}?4n^ZfZw5D^}~ z{yOix{TAo4yGx8He-M~@z&;V1Y-rW-b3yVgF-3a%%m%9p?PS$_3b-sbUZ zk6A31{Lvr&F@N-*{|nDPe9kz|I5)8BJ6?bIfQOIHxwwk_@ZH4j=7L;i`sD&^8%IsC z@lR{O&xH@!sEO?5@$5>)ph&7kjqXkupK36)iKBOtpm=6Qxv~Z;l~VMVt$ob8E+0 z+gdozSyU_YoSL0T?8nk+6G%VK1wRR_PgcO6v}t|PjL@s{LDtGTkJ$7c;x- z$o{etcR*~>E%=T;1mv{|jY{1Mc@HH?(;ls$wh7ZU6+~vdgT>GhhEtM*UAZ8Y%qoF# zhC{048L&dI7F#PCYcq>18;(QpY&IJfiv_#g4wrL$36xTlc}i5@KvavgvRgh5xVs$^ zfP!s0p4KKs9RGpaPMV{r!z95=Yql3jNWNx+at8d;7a#Gpue{CUM?I&fh1Z`9y#8~i zoISiirW;6sG&{B*JwxWmqtH{W5Ob!+$YI=3e8%_zD;BRao`g(=dNsjr$2ukK@F7)% zz4NH^sP8acM>tvFx&al3I1slb%Z^e6(>Yx4I6r~2dWJZIFoV3`B14y{+8*i)u3Y1F zOO;5T_Z;+!E(DyhkQGm2N)x3hnhb6eSUgx_gGXr9@9^*;q65(39uEA?-~SbV`WGYP zPH<*se~}oLaF`(O+l95-GlT`FK9CPP@{MA50ka1V5oSeNt&Nk$_59XStG2FEdetHo zwP>c9FpOfXp-N@U2`5|D-GY!jFSeQe=n%1Z?-+u|dO>R@)`>)=W`~cSVFjBr&uSxR z9Z{285pp*g)!G{Kx6$sWZ68aWa%)by^^)CvBga=NLctq@uOq%ptb^z2!~1;xY{esI z`K@n!i7$WUEtY43c02qg<5v|*BJDG!jEuXAoo9lvSWUzUMbLup943X-Ar`33lRZUwf0G z{~uTk=RA7&n8P9R;(Fu{{{0{F|NhDMKog6uBe;RXZsuxtU`~~iEj5>yE*e2_*5REc z1lJr$D9%}|tJKIVlf@mEPZP)iQF1D%R+htx@UZ8D_piyRP-@25W4Ee6O3h7kZ26UBDUI0f=#cS8@8hi(v;9(QB^vXxohZf}Mf~R&e~*8xQ!G|Lo`ZrAKSN z&jsBt77q;1y(-(B~uNa*r*MfZ&Z_4Hz$o6Jm+%_FL=}srwyqyJtS^ ziQ@%#uC5N$Dj<%~1)R5(tmIg!xp^?HwhjkcsP--e zE7W@Q{YbOUS!b|LK=fsRxowYH;|RXTbraS#JDvB9p5;=HkrJ%8bc1KH=;?aj=v`In z(dhb9tJ+%te$s&OQ@a}a${~DrljHXU;J$;;_l{p&uK2CT_xS4Rf+3F#+dXzXP&*G@ z#EF1w^B()3(0F4sc!{KS#%v5G1Spj>WyX1=8Zh4Aq++yUwL&S)R~IZUDNKn(Lh$(2 z61pB$C5|&yz=iJU5*`rK(+m@2l-L~A zVhlKgam{EzJ$9UGrPP9!nWPmf24@Y3VxGmf-r6?wWwn`0wNO$)i%?7Ohwa93_MXWN-dh{K( z!el&TYPlxPm0>etoibS0%pG^pQ)>vs2!}>1Znii4XnR98-{ta|;r$rHd~IBT%pP$?MGT5$qY6>3qYLng&7Q%-a} z1mA|4Qp%*=hU<-1Ehql73;yKjB!fq{Lhp*krA?3++v06L1J?bi#!MGo9)~;A0H(_ zj!=)YBzB?=DMhG4txd*hKDvr=2TVSo`x)KONG^zXAOj|3a05~%so^8;q3VK_d8FE$*d&mh&S26aLdFA#y{Bb6wD&$m| zYsN~!E@+()?^|BZIlly5%hR8(f&nF__krFP%^3Vj%i($2&2sa}&O-yk{ zLPt)9kXrYnhKw%(YdpC(lpsVWsBNQ%ID=S&mma5{Iwi^>p*zT$+Qe5%q#TzN6Hz-8!?B7SA&u%yhbr=)SOfOJ$`LAeE8yu@4f#6{^mP>!=L==-|_wLzBmH#n305+ltHx(I9b}?^BS>c;cq9f)aLp>85~XA^g*Zj5b2u9i z<1wZ!7{k#QsHt)1qSRDC1X~TvO3?&^LF}Fs3pk4l9?_Y&y9;6895y_bBN&gguldOJMMwVnZQIMMK3z zpccxml43%RHl|#aIxDIcW0$zFgbMTFhBA!|KH;sWP9260OTb`YH?e>A5%V~*Ua#oQ zfK7_Hgp3LCikdb=oAN}gnPR~BK(!vkBcaC)%cdRHHW+Vgp!muxv1wu1pofaiN-zVu z$&9-la|V$G8Xs%RWdHym07*naRA&ymYxFR(vK`&9q=p_VzWEWIfpt$=45VC8V@bmX z>pY=TOy36AOED}@0$(_Pht0_u_fOCG{eSzP__G&($8OBvEr%jR6u)rvArrjC;wcD5 zkAqaEBAN+SS+5Mk$-r=S#vx_i``{VZ7rQp4Cg~fS#yI?~XR;bf zsTf-je>_*UQd5SU5wTdB6IpYn%z}!LkKDwVHRg~}1GP-#Ig(S8He?tG>j667B>dwY z8mtWrT}LMl8#;C>2o^P#TpG_aw{1|AC$Bx`H-Gatm~RS~AMW|qU%gMoU^7TkmWvKc z#u+)X(4(y%Ma|Jj&?&>2=gDUu@aX5BFxG_qZsgq`?#Po8Y+<=xvDqwe-T)b6Ed9cf zOJEu^*~}dDnr$@5px7?6I`O1Qalig+|C|p#_zBc%lrd@u#v#TwkveBw%~&hw@g6QIMp7=vmRCeCFYy-} zs=%;b;t7~+aB4x0(~(Z8E|X#*7lWn8`X1A*Kw3I9?J~9RO&KrXZ5vu@!zGr-uRY+m ze*4$iT^$&wf6sTm`vEGjUNs@#N$cCH3Sw&W9#oFK?Sk}z-x#_x$MSxlbB>2)$z(k7 zPzg>rU7R2S(|ll>4hRnC28OlA1V=72&-U-JfA$==Fii7~G44q@WB<*+`Cq=N3eTTk zaCLP>Ddpn@#y?>*)*X$Rrro>cXv_pf1s;Z;FD_14+YZJ^oM)oK7z=SMq%onvlToa* z*bq?bnXqh=u+5Ii4b0t=xpZtN!}ScwtO%Qjgp-HZ#Xa2Fm$7GWVNTvaPM;v>uj5bd zW4Z;CTIM43;xV#->ZoHTZYS!Luvsu!nNvhdX$0FjjQ5z}n{?87#D^CBrsm^Ah2R6C zLY-%({SGr{Ov;q~$b7vcPjg$FxiH`Cm@aSNP_d~pn1G1K&Y66esOdQ3;4`sITl*Qv7u>@mDXy@8B;2biYXaM6FD`L$=Ue{uRVT9CGw;9e#CAYSuGvG z8iIx3JB%DhFiS>7F`*fG!b0%NfE@y6@HBH~#`Vg{x#i*O8}6MwVpw&EEo6;U3eG!1 z-{ZR;waTIFn9Giswj9Q5QX0u6V&XZu~?lDFMmv#F55BXJ>w4MIAKvbS5VD# zp<)M%9XiYqptIb1Er=Y$lgAZ@DILwKwIdNHqd2`0{t#>$m>x=aFp5iwT2VFm{Y}to_@K;bqm~Shg}cIqKBbt zWumu;J*t{2P%M%XwJ5#skPzBZEfFmVzX#c6=6xi`f;Sx@EI|Vt3bLJvR}*DBqL+L0 z;)Z;+L-%tlfO5NelEboaD^3=tY}WS}78|VbSOsSUTU)gAn(<_8+EZ^{P`4Mzbd8jR zbzqngJ#cou;EP{;o7W$lGGAXXU2PH9B55s^m=nbm`~dw*=$3->!g96X$s4cp^vx%1 zj<>Ws9QJh1a{t}~HYX>XoSm>a-Ow)vN)@iI4}A3Oip$F#F)PLy$V#0u^R{w*0lRB( z|J(oizjN{8;#k$*TJp_HaalR`4gZ0y)yu}PV)_8hLa%-aaL zAgN$#6MAhIU4t|7miU!NOvio;dKAf(1~4m@#d6K&G_u|tSZ@kL?>Iky$m!V$-Wy5*AobVctyMoKdu zI7jU#qRfmbGNy?sMN&=FTAHIJSL)R6mExSGAG)R)8eX-pE-Pi*Zt-D^r}G1y?Qs$a zwqwz)*eq5otjEO)W5lL{(`H_%sgQOv>1t&E(KXM0^bFR>ZAODE$M;}lQH*L&QD*O4m-N%DWo@Q3VipR?{bk6+Ax85bD+HOly znt60sb*xT%7MqT~D|k0i%*dQ~%w^9!ZQ1QEiQ^uT%>CCsL)Q;Y^{9d|0p}K+oIK)l zpZhXj{e`ddxwqb7)31ozk^SYK-POp+dWkdI0F+{+-M*)S5lWk(N32D}9W!l-#HnWjWlgB%iWAK456ce)~H%VCDyHqler3=7VNj*GNo-0k?2Kl)=n^W^h< z<8xo?uW^?jQBy0P)Ee;3CCsi(aB3~g zHsKc?-g)-fU`B1Twh_{pDC3Ay@ZK=^4re{gk+j`%xY?0YBGgKXnLK24I9AcVW3gHi z)*I*?6h)^(9y4>P3GEC^(%M69tRKUz;j%fSRRn7t&Igi0wT7pkeT(1u zpMH-oeEF;NwP5=dCBavI?bkVc_Zjbf=R4GWrni<{XXbsx?Y4~DYqmGntWVcSa5%A) zB48m4SnpY_S3G|03BUY}U*$8ezs>!7XQVVyVnmC@nL?IAb%xM&$2$Pr-g$v$3{4Sd z4c_z^XK_A(J>HD6C>q=S{zB;KLyrxfYT8{FQcmP?X5LQ>A>iHr$Ju)|Tef7^d0*P) zwmGKUt!ul12G}4P00n}e2vLjxsbGZkreB2rq|l>;2T=@B3L#(!(`a)|xl>igY`08$ zJ>;%?FF;ZVX+NBZs;H`SYVTZ`Gv^%R8xk3FeF$SDM$eoBlgeZYQPgRRmK}|?DBB>l z#k3uA=*T$}7EjC&OCc478Vq*R)3g?m3+3y#_@&V=w|8#= zS=&;grAWbQ)6m)u-3cc5z}@~Ohy6Xve}NEB^H#{#!0DpKyHlmag5f zx_HcwfAgPk`vIyw5 zHk-$6SJ!9z@%kt1-PKN6&J*$Gsa7Aya0D&d_R0uPj)JRtiEy_*gFzrlFGp85QC7 z#Ls_r!~ga_{V$xxQ}t|^0=`PavM59kOkgsoP`S|KDd6@erhCWcQOovG%dpw93wvTp zoK6QCv!ZLatokdGa_r|@?hp68yZxH|?K=){7slJfa-S)T=n(xGJC?t_YzV;_30CDt z+Dg0^gb>aG)Kmqd#@3xuXG$vMkk5=1YELgkLhz`f`RK_<{L|n5UB39_bCN5hC;dcFPYySIlg)z z%ZzR{K1PbDQxKypMrmXzm;ky+Vk!7jWK5p>8_(|T!qwBB?NyI>Qqgw%hdphx;_50Q zwZUi4@i_DT-5YM-zhJx{+1)r!Z=oCuqA%!b7#80WiBigh7%9GhD73w$=@hnY2|*Kr zuQXFpfsDpzgsNzV;3HmFICzSQ#V^E|7`hEV`uuZ#@3()ORvV_%iMC(ig9F%?A-~4MPx{`C(MrM6Ee?eGDa4Zu@$>!I+WJrc_1{N93m+M5HQXo z(|BTW4r2|CwKR>zSd9pE>?TS?$Uqhz-Ka`AFuC^sD3n;pK9O8?&S_b|Wt50Ori6m< z1)UU9wBO<_R0U9zOCg`7=}9D9j^yNNjG^81lqM2=AWDJgEv2)_uB(fD%H(Mz92Uy% zfSgW<>4bI@+V=Hx$&nxmp)uIDp-6~1qf$mL0dgV>kDomu6;cG9EKjyi`OEhwR(;FX zTBOZ{cPC2DhzuHwDWH=;7D4ioI44G*7(q-5Cz-k$E*9ZtM` zchBi`q_c%>*U+yt-D*!Xh0Uc!=aMNYS7GH@38S>YT1C?|C@m<&deIO9sm@OK42V>p zG?{7-&>F0jNFz`>6N%&;S$7T3A8*+Xmgr9iAxOoO)rT5V5JW@STq8dFjPa9?c=3y0 z;QYczE6bxN7jS(^r(00Dj*0YlEW?-uF(yK&cES)VLr;=u8$-8RV^oW33}S82Z9~zL zQY0l%HIO2Zb)q;2aj8$Vs<(L&Kt+Lwf)p$EOr(T}qQbvjB29rbFQ}B6n2}b}cRjYP zJ3K~Fq(r3xDWjyOjc3`e)hG)xWU>py<3u^`iSH(s7k4aQ-xA;NAqLXgz(-rmYK0nl zP=Z(jF;w+AA%l*n2fk=xmfkI zD@C_Ckwav4X{rT-LKP^U-BU&jn#Ry|4bl{filiLyDdD^)oP~x($TQ77SGkZL=l0<*Oz?s9pD$D2xGqku6Y_H$J> zX-jbdVgu5mtj3rXkDq+X<&S?zY_1rFwi@#gw5_3r3KayQnxypE`4_1mbX75MO4oV0 z$%f)H<)j#c=j2B2_X|E{R@jYRjYRkXF^BHCOVyBtdi(KO(}2%AxKgC@7jz&RTL3h_hNeWu%fwEl{nj{F#Mn zXwQPdZjcDXQYo!M35tkh5o^O*X;R2&k;y7hLZV0yOGey}sM{I+@_>4CL`@N4Ep!ce zW676>vTBLOpq!uthw_m|6s#;~dxb)khAe80`@wJGiz4WjXfNnCTg=4;#aux0gz3os z_6Ab|o7OOHpi+baWzgv4X}mJ$mxY06Qs>;hp-te>p;!4JRS$>+~$ zFFGz(12Q^RtAVa-`1JG7&;?B@l|`)1prYV1DLTl4o(5s5vY?PDXAe`AU{&91Ns+~Q z45BjhY_7LPQD}P0_IhBoZisQNMS4y&O-GzEo$86DP~;xrXXG3)&Y)rkXL01|{>aU% zSDZfoRi3RrApuL&G^N4M^^H(kk6jrVRE)^z$$p|N zN2EWXqCdCe8!{cGRO6A95!nQk_GAjefE)y3fE*>VXrydW9<(=vlVb@Bsx>q#O%bJb z1XR6U$E+|;VTc4b5l<6wjHnrU2Vx({bEH^B8VqbKdDDiUw;e(;0uazf62x9^#fI0v899@Gb~sFLM8715maFXWWT5t5HAYC*+_LezT4BqV~N z>(9icbEH5{wM`%^BBI_T1-kXbPuM*Qs1N@I;-c7gdcA%vvuT8yz| zExyz42oOrrXj^4fT9L`5;7Bo0qN79y(N(|42SBBuemOhGs^8^oQ&jbmW2}W-LYPl1$zl5zt!=%9rt>@8ScKFRuLwa=oIqtmZ&ui*L&Shz_Qd0X z!)^!B^U>8~p8w&$;Sc}7Go2=4j4b}d-+cK~{?~v1e=_~-mxz+lR=~Pt=q<~1U_ULW zsIbbi?ktZUUt$)+s%sgnW!*M7QCZua*0hf<`RMsGo;`5R^19xIrq^dIfNPqpsPKxR}D%lw(XkB z)g|k84RfH?aD8#b)%KdMZLw0(+2)K6PBk*Y7)+;#XGU_)`P;ay0+p*A3NbpS`9LWJ zO+uA~pzhX%N`w7Y352L{%2GMabpZ;5mdI5Dy@U=*6KjH%F`x`dIDEU1X;9~h3d*2z zMfnOJDGTH{vK$^bJiKMz?xyGBS$aSPLF!5lJja_FXGwb`JRB%JoNOz2XGbll!` zGz7ZhF;)_kAj(2xGjYifAcnw_C*)?s<$6HP1#ry!d*;)cV5{(0HHy|qv`OSVS6k+{ zn}#??W665U(OM&ggj^S)$fe?F z6>}=ibydj72r3CyO~>{2k~qyIKcSRnz1h&(h7bb%YGAcq;X`7Y7rgg0AreJx0ST!n zvEWlAd%iVPdp|Red$g*I7$vC}5~;p5V^zE5S$1_sQ;0K3K&S$;)X*3SSrkG^6^5iM z%45M(+6sYG=6rl7kV}RsQ>H-i4!=J#op!|WL|?$F7Ns)Af$@uZjiYU$BAV* zv8Y0BB)V&{7h7}|h+>FyokA4^F&0vGNWG=$))g0QT9n)%fgosqL5#kRqw&w@FHS1xGZlP$6^Nu+Wh> zOuh9X>PRjXz71&;nW8eN+Fqh0auL!$;oM;AQ1?zwsW zhKs99)|(CY#}oU*$Z?$c4{t}ldhreW-H{?rWUWyBLMcZMbE4f@F8YWb8lq{4-g7wI z5IG}yKjd|!^xbY)=|&#sJby0)>AM}Xu2UM*qO8V~ac6UODwUZML?F0GbPvyjhy<^S`Q=Zw~-7@{fiMzuNrvx8;@i~K4AQhXw<1~$D z1a3m*gb@~HG**glrDaMfjP7a6`N1if7&6h-F(bL5k!uhmq#Dd3V)a%O2}PZw!xWg- zf`OvXqKzbA_LRLt>>SB2HD*E^N~y_E(Ivuhp*)OqNzxB3qLHL7qgD+VOF0HoIo5!i zP(39vIASgY1EtfnUB~9)0(EswX(Toj(p1P}s?xK*L+Ma6@}k4rfNa)?enZv+v#-{N zEI~I7xmd>I%9I!W4J#068?IUEFh!uikSDo6T2T8$}^g+L})@VI3mERIIk*>MUVa3G58CPD}t=X?JAFaL@^`HTO9 zUwreDQ}FDMJ5J*Rl)%I5TXv_Br$6|d-(5zojjR+VV^K2Gbe43URfiC2`SACM4?-xk zSwYIA7)T`%vH?1@TBD^zlvvpyqCP;RI`yfH#2Sb#CFGP4p#Tb;r`%2WHzVO;CW;9e zdnAIaEh0%usiA)&h$_$O6t->ft3udVgteGWrU*qy8Fm#P5=$m4iE0gI)zPj1k3ew0 zSICv^$a(+(AOJ~3K~$!xIQmqN^mI%xW@Ib~n@BQNYeOTDO`=;jsP%@_Z;5)qB|*%E zRyX8P@o;-&I=d*M*^*0n< zRn~`jk57)(V2E?%xJ=yb9yqy~qHCg#qkcgBs-uKdBTh>JDUrI~uw$$N%Qbw|vNT{C&<&`FXf$Q52wQ{fT8x+VLw5<%2{}cKlBl6UuNu@~p|usEaSq1w z(?Xgvc@c!{kV>(LnJJzKrG@OUN@Cg$-LDbNhLi+~jO{u)wPL)vXW4l=l~5}Q%#_6; zLP5Si;r`}J#=|?>>yGvFE4W&*TCLC<%k1{F$@1eLe8Tq0zv8ENKjY6|{WUL7_oNbO zHy5;KL!J%e;f~{R$La9E=~P9_Iv4)|B=&c9wC}P({!{MD_tqi+yDU(11VPp5RRTXk z!ss1ezIwwqH@E!G<0m*bB1OiSfx~e^+Ky8YynK6$bDqngV|n|Q)4LnWG-8Y*dPrCn zpZM7?f61Tz`JeOgr=M|geT7ttZfNSwz0s9tk}DKP3Q6?wTjYqyAhWqd<-Ybx`NRnXo!tMw3gCZj^l{jE0mKoK4D!o zSIJq__g4;-<{4`9BXs{ckt^o1BAE?xuxwF?P{?}XaSy9_fH!YglEU;Fz4r{icz{29 z&FSTPmTQUr^eJL^N-37K^aQ_RzT6V~Esrm@Jeoh_i@VQx8n5`{H~*f${pJnFs|=4j zTGOIRk6TWJIN-da-}c|tfOV05x72d}-l6;tX!3K6bpePE#02qe8>a}t!|}k)`*&o1 zd}d60+P?pmq;xnOIn5sLJbes2%AOn@#(Ab7i764Y<~Yr~`1%FkeEki}vM>z&`9~In z5K(7mUoPk5#}Y{?B88+oi%_Mn;2#lEJw{6bA;}0r%IGtePH1&TJ|twRPn1ral_CjT zf;o^}Mg$OZK%P8e@|Ev5Wy;Z$izHb|P6>I28)=~s+5(c~B5^7tnQ18KLLIRwRbfg- zfz~wAjKTgQeuA!4f8Z?++u0Tm@;^hn{+eL0U$>u|_qh`JzU zAuNt~+@n$^wi4crjDPkG;%7SyhM~D&-E1gMkj4duhNfs#H;^&tB9UnzjhP|!e7^aV zcMlV9-%af29Vb~T({a+oeZd6Fm3{Qx5&RFuDEz;@#J4Pws;Lp@WBkJ|djGKF>uOMhb~llKxCJB}POHwfdFvoZ(ShO(NF^GUr5|7i39L0y37m zxN{-9K$$$u0hWv$BV}@kC7>D*E)owDep$#yA(ceMj82>#c2L~HSTdm~WUDaR)RHCF zp9w3-y7FdZ&J`?KB*G>195C}j+YBgM=e$TwrtZ$Uc*@&5{4U_TdwBdDEj4ztCMaDq z0Hq`tg=!2*8R8@m!INbqy}sw+=Qre6C$1kqrdJJm&P-puXIUKGM}_8NkM)5lAubUu zEd;@MJJH4!pRd1Q_sv(l`05?f9vFt6lq1L85p6X?>Azcm-(Q6PUtgkp*!@0mWX}GO z^DeqS9{KX?uX%lQ!{;AAr2xw`lZD1jp0F&GBJrn*X1C+{%J9*qXI!;>6ALfVyvi1N z%qXL|+FsT>!cuc}Q>^KlRYsQ1#8QcpH6yJ?UM?q7izum)E)#Q=NM$Wi%^84MK*&f538yn5 zL9rdC>rg^d!h)X@28lG1qy({)ig*i^QN!#}N5@8JI%N>jkgP^%ODeFOCg%MK;dhX3 zNOpz#^u%hjrhRseTDJ&YhYCRn>~>B6=oxW;K#cFP{zRDseatvA)-(*dCm$2@XDixO9!uW2_uzISQ=tL;wamGI!i4R9isqb%64U2A( z?W+F!QB&rGnkLlbC?+CTE5!aia=J${kV>j5_a>m$EA+=-P{u%d0eUJ(?YO$SWSk00 z8w?hA%9Ps$1L$L<-0$$(;WhNln(QKSiagyu!#T+@dw%%%V{WG%zwmD{yzu$2> zO+37O&F;%D*`&bJ^_q;}&A9NwWo|Jz-DA5gt!1Uiuh_qONh=l2YQudN zya;gDtZ|!b%=QtR;er$^mTiAH^7Svj;^#m61@GVAa(Fmkt;QNn+q76?$T8yP88=nv zqsW=Qv9wK3qYW~7Saz`7qT(GoA5dYg)0~{oe4c_11?38io_t&=&Qn}O#L9)%##TO| zQbc*4j!1ECK~=K8Q5td1l1n8aTY(uG^w8IZI|cm9d-i|(g8A$Bm@%MZmB<-uQCd@6 zWV+ko-tVxvVn?`q#9P(!GHdQIEEpuF@~cmdc$_IppjH-fVUgD@dfOmMAi5Kz1}iN> zHsmB&jw4|@A=5+%2Tr>qCDsL4ghmGHv9Dke6N?IT)-v85kjapOWR8LEa>dohm$a9f zMLWh)S=^%0sK&5b4Q%`2Lsr~>dhz&&Vz|Ely4-d=|L6%t8eELH5J*cTmhUp>0-0Ag z@A%U{|1-XL{)}hWkL#2LL2!;u$_zphq~^V7I4aBidWGLyAT}3(qRas;D@S^sPaJj! zX73nJBR~J!pYvCL`4{~7$G^^R{p7d!{PWN0nwG9Mj!!5i>0HNzXY}i>lU$&Vs3~wybMGp3kZ6_4uzg%$zdftW?QD zpiQk&NrkYCq`hN$`Htn)9rA8Qnp9g_QXs9Z@=)(_rx_6o{c2z_EvGDbHF;hLfwo)B z`U-0rx+NfIL7XxuPt!I)AWaYC<6BbGQCwl@A5~tqG?dkvbbU=eToUpF;{k$^G*PpJ zNG=kKthK5O#4%!`qR9}Y#t4aB4@4hGw$NP}K3+ZH(9C@G{*ISl{WT{Qak}6S0WKm+ zD)~os!PPGxq(>iGGBq{l!|#6(ZGE>$3xZ9f*=*M+ZJ8I(w0L|vhfO1pqM(F8N`uyx z)#WvISmB)`9gmd5j`eZmcsh|+7syA?8Ji0hyGE`qNXBqH9q{8GsS3f*93Jk7%S5Xs zA_h*oJHGzgzv1OqzvTU!*Bp2E6z{RJ=J%Gx;ZGCu=va;i{PC9M;T6m`H06K}dxRUo zC$i6oSdbxu&j=S`iKJ<%3F|3WX`0eVbGB3JD!I=RQuMXuQzXS@WIBIng)?_gp}H1{ zf(Yqh#J#>}e*J*I8!1b!qF4z+RnLteQeuRVk;Nd|73Jy?Q`7TaHk_IsdvV3%$4_|v z=!(s{!(@-l9y2KH#-i62(JO>bq%f2GNFy&OLQ>j}WE+w=WAB)`y?xF2_CT9f=%zc5 z6c=J#aAF~Jf_A&YC{1g+8gp^A!d|a<@J9~E1FPYZRe#017w`D1Kl>T4UhUZJXAZlC z)B72vwfv(GtM2>bwKJCpQ6&Z6LWjQH3ngdeh#<@k7aa-6qK3Y>7>TjUp#%acG)=ok zv|AS2k~%|lN6O7NTpsQb_j~p}z~krG=fA=t*SMvA&v`kr+uac3krZdf-5vAp4zbKg zH=)A9+9;ua(DBFJWnX+;W*;=C&uGUJl?_ShP?k8>u*_!1?4tvQIDxK{f(u3R-!z2pFTW!v(qBauf~b`6nEdAr4#AdP_I- zTx~nHgT!h_m~UD9uBK<|f^8I92}E>|CM1ryfV2v8xg`%BrMI-#YosdNy?xF6c4AZ3 zteOs+bJhR(BeTlb&5Dcl73JXw^Gqy`&_vQoalb!u^H*=kui(19qHPQJH+x>bIPz}i zn0#UPZbm67|LDVQu@ca~+v2{f{%S2(zMUDL%`~~nmLwT#1;c7!SgkO|5M!)fg>&|p zMADjuVb!u)Ta;XI4{yltU!mtcV)i6sX&ya7Z?-HkaGVYt<_F#%-tln%9&sGOMdIuT zvxk@|XQ`MLx;A9BAs5LsJKnv!<@L+gJlsA&DrjSfIY2lO5AW#mhz&FO@PLj1yeBW7 z>;pMO#CgUo&sxX4L`qDUEFl-9QpmH8Qb~m<0`EK}1Pq#VavW|RINk5@(?p0KAq$jq zD%0$c(}LTbc-W2H&yn{o^JelKi^M6#EG3K9_@*Ow8`5w^**-yEKSgdY+0B7dDA;zz zWIhkw#hCrbXKxZF)G)Fej4BjK_s#jL1bG?>+I$_t@Zg@}uWmUtJP&;LDdc_>gE4 zsK%N<(n_JUO2irv`wPz8&<0o!>~e1iFXTbnrjh$PE%^N zV!hG~J&3d??qAZ3w`_~!i;HJ$w->0k;W(YRxp~E_S6}n$%~#yKd%@}c7I|{WR8=&k z)XrT&fz(K4k&PuQO;Qqe6#CeTITXIC#5#-hrZn4b$_T97eeio!jN+`W9y;dVy~p~9P_poEAU zC(7gzF0#19eo4Id@XZ|g<;nBv4e*7F^EypDhlVIER zTn`}n%l%IeeEs^D{If4UMFI<-gwvO*SJrz0-194E9f)fgopFI9+JCWk!ZZR70lvnK_xouU&4;|tME zxa^^^nAIBF^w@2Kk0;*m7hZmqw_JSsDHpxr#rs=s9^TS*hR40Zzq=!p!c|E8x4-ry z?q0kiEg4k1qL@wdM8Y ziv97#-MsMSX~s!`R~fGp9zn{r-!?~2o2rO2%7javR6LT5E17XV;Ep$3-M-+-Z~hwF zAALbPf`2$5Mn^c$fThbYMT#lVXK1J$_Ue72_=MXZSdJrI*MVJFmWA;&o>K(`&Cozw z+b~i~hE>OQd%>!2paiDbqjE$Rh3sWb?d(7-foK%6lNh7Xwn4Njvgt{xC+QY1C3A_4 zd10jmLkBu1Y&al8ASw^mlRHs8G9i-ud^TRWIw7LLin9T2KBD*UDX}2d0n=Wf!^Ckp zk>`;h7ic2B6F6JQi=%ZDx!3Y z2svVvq>+L)2F&cZ@C%OsyEww(RC7qW29VgIu~CwWK)3>Ptau2Q$S&hX$LZlfI;SuB zw%jbHB$=GlMahPJ_v~DdDXkD~U-7Qxe5Th!xpE5r|l5 z!~vWjtpa+Es7=JUNJ$fmJCfpp&Y4xeLa!ssX~KI)w~{=*dIX<-!4Fmo{@o4X;g0$K z0rRlq`q7r(xPHVhZV#N^yh5*jz(u3+qTovA-~8k!{LgRx82y8ve9YD5C0AEh=NfLH z9|n|^IOjOrzi0REj`y!l{PM4FxPNu5B26+mC6;AJTp6TPD6Nq>k)p>hBSYWw$&*Vy z{%FG|pI`Ie{oZf$FaGhba=q1v{d@K=UZUR|7_!AN;{1W-G;?>q=gW6H-Y*f`ty!5h z*7khT4UFT={~o)6^HLO#vN(^46Pr-{;eSS_TDM;=ZHVX*Uo zc)BAW7Hn=XULvAAtCj-D1N&DuY_jBKb7Z-F$Kys*%EZIl7i>O#%4WM^l^u6CZ+Ww6 zxl|JC9jd@@e)2IdfAjd}tn1jn5x zoMH|11I8&4RJDx_N~5(V#lSqBc(NM!;`wua^LKuYfA-J+5ufyy-W~C`H^?~CWiTj2 zkjPDoiVIDS$U|hDJf|sg)kHciz(>MzWIN7W#Y_T7j-p_&7A+J_DTEjaB_V9(09plx zj1`5CyPjYF=oz1EFA?KJIh~ky2OgFK_Q@4~p3%vmimEkn$as7eIHW>!5$^*zXDpRU z6+^@b#dfvAN=>U9%$csQ8i6#L=`=H*Ch|1W%fhO$6c=e%JwhsiNaPYwCD0RVs-(

c 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 A6aWAK literal 0 HcmV?d00001 diff --git a/tutorials/soc/lesson12/image.qip b/tutorials/soc/lesson12/image.qip new file mode 100644 index 0000000..2693b8e --- /dev/null +++ b/tutorials/soc/lesson12/image.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "image.v"] diff --git a/tutorials/soc/lesson12/image.v b/tutorials/soc/lesson12/image.v new file mode 100644 index 0000000..5a4b7ea --- /dev/null +++ b/tutorials/soc/lesson12/image.v @@ -0,0 +1,164 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: image.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module image ( + address, + clock, + q); + + input [13:0] address; + input clock; + output [7:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] q = sub_wire0[7:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .addressstall_a (1'b0), + .addressstall_b (1'b0), + .byteena_a (1'b1), + .byteena_b (1'b1), + .clock1 (1'b1), + .clocken0 (1'b1), + .clocken1 (1'b1), + .clocken2 (1'b1), + .clocken3 (1'b1), + .data_a ({8{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", +`ifdef NO_PLI + altsyncram_component.init_file = "image.rif" +`else + altsyncram_component.init_file = "image.hex" +`endif +, + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 16384, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.widthad_a = 14, + altsyncram_component.width_a = 8, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "image.hex" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "16384" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "0" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "14" +// Retrieval info: PRIVATE: WidthData NUMERIC "8" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "image.hex" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 14 0 INPUT NODEFVAL "address[13..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +// Retrieval info: CONNECT: @address_a 0 0 14 0 address 0 0 14 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL image.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL image.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL image.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL image.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL image_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL image_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/tutorials/soc/lesson12/img2hex.sh b/tutorials/soc/lesson12/img2hex.sh new file mode 100755 index 0000000..d1af36f --- /dev/null +++ b/tutorials/soc/lesson12/img2hex.sh @@ -0,0 +1,4 @@ +#!/bin/bash +avconv -vcodec png -i image.png -vcodec rawvideo -f rawvideo -pix_fmt rgb8 image.raw +srec_cat image.raw -binary -o image.hex -intel + diff --git a/tutorials/soc/lesson12/osd.v b/tutorials/soc/lesson12/osd.v new file mode 100644 index 0000000..a654b40 --- /dev/null +++ b/tutorials/soc/lesson12/osd.v @@ -0,0 +1,182 @@ +// A simple OSD implementation. Can be hooked up between a cores +// VGA output and the physical VGA pins + +module osd ( + // OSDs pixel clock, should be synchronous to cores pixel clock to + // avoid jitter. + input pclk, + + // SPI interface + input sck, + input ss, + input sdi, + + // VGA signals coming from core + input [5:0] red_in, + input [5:0] green_in, + input [5:0] blue_in, + input hs_in, + input vs_in, + + // VGA signals going to video connector + output [5:0] red_out, + output [5:0] green_out, + output [5:0] blue_out, + output hs_out, + output vs_out +); + +parameter OSD_X_OFFSET = 10'd0; +parameter OSD_Y_OFFSET = 10'd0; +parameter OSD_COLOR = 3'd0; + +localparam OSD_WIDTH = 10'd256; +localparam OSD_HEIGHT = 10'd128; + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// this core supports only the display related OSD commands +// of the minimig +reg [7:0] sbuf; +reg [7:0] cmd; +reg [4:0] cnt; +reg [10:0] bcnt; +reg osd_enable; + +reg [7:0] osd_buffer [2047:0]; // the OSD buffer itself + +// the OSD has its own SPI interface to the io controller +always@(posedge sck, posedge ss) begin + if(ss == 1'b1) begin + cnt <= 5'd0; + bcnt <= 11'd0; + end else begin + sbuf <= { sbuf[6:0], sdi}; + + // 0:7 is command, rest payload + if(cnt < 15) + cnt <= cnt + 4'd1; + else + cnt <= 4'd8; + + if(cnt == 7) begin + cmd <= {sbuf[6:0], sdi}; + + // lower three command bits are line address + bcnt <= { sbuf[1:0], sdi, 8'h00}; + + // command 0x40: OSDCMDENABLE, OSDCMDDISABLE + if(sbuf[6:3] == 4'b0100) + osd_enable <= sdi; + end + + // command 0x20: OSDCMDWRITE + if((cmd[7:3] == 5'b00100) && (cnt == 15)) begin + osd_buffer[bcnt] <= {sbuf[6:0], sdi}; + bcnt <= bcnt + 11'd1; + end + end +end + +// ********************************************************************************* +// video timing and sync polarity anaylsis +// ********************************************************************************* + +// horizontal counter +reg [9:0] h_cnt; +reg hsD, hsD2; +reg [9:0] hs_low, hs_high; +wire hs_pol = hs_high < hs_low; +wire [9:0] h_dsp_width = hs_pol?hs_low:hs_high; +wire [9:0] h_dsp_ctr = { 1'b0, h_dsp_width[9:1] }; + +always @(posedge pclk) begin + // bring hsync into local clock domain + hsD <= hs_in; + hsD2 <= hsD; + + // falling edge of hs_in + if(!hsD && hsD2) begin + h_cnt <= 10'd0; + hs_high <= h_cnt; + end + + // rising edge of hs_in + else if(hsD && !hsD2) begin + h_cnt <= 10'd0; + hs_low <= h_cnt; + end + + else + h_cnt <= h_cnt + 10'd1; +end + +// vertical counter +reg [9:0] v_cnt; +reg vsD, vsD2; +reg [9:0] vs_low, vs_high; +wire vs_pol = vs_high < vs_low; +wire [9:0] v_dsp_width = vs_pol?vs_low:vs_high; +wire [9:0] v_dsp_ctr = { 1'b0, v_dsp_width[9:1] }; + +always @(posedge hs_in) begin + // bring vsync into local clock domain + vsD <= vs_in; + vsD2 <= vsD; + + // falling edge of vs_in + if(!vsD && vsD2) begin + v_cnt <= 10'd0; + vs_high <= v_cnt; + end + + // rising edge of vs_in + else if(vsD && !vsD2) begin + v_cnt <= 10'd0; + vs_low <= v_cnt; + end + + else + v_cnt <= v_cnt + 10'd1; +end + +// area in which OSD is being displayed +wire [9:0] h_osd_start = h_dsp_ctr + OSD_X_OFFSET - (OSD_WIDTH >> 1); +wire [9:0] h_osd_end = h_dsp_ctr + OSD_X_OFFSET + (OSD_WIDTH >> 1) - 1; +wire [9:0] v_osd_start = v_dsp_ctr + OSD_Y_OFFSET - (OSD_HEIGHT >> 1); +wire [9:0] v_osd_end = v_dsp_ctr + OSD_Y_OFFSET + (OSD_HEIGHT >> 1) - 1; + +reg h_osd_active, v_osd_active; +always @(posedge pclk) begin + if(hs_in != hs_pol) begin + if(h_cnt == h_osd_start) h_osd_active <= 1'b1; + if(h_cnt == h_osd_end) h_osd_active <= 1'b0; + end + if(vs_in != vs_pol) begin + if(v_cnt == v_osd_start) v_osd_active <= 1'b1; + if(v_cnt == v_osd_end) v_osd_active <= 1'b0; + end +end + +wire osd_de = osd_enable && h_osd_active && v_osd_active; + +wire [7:0] osd_hcnt = h_cnt - h_osd_start + 7'd1; // one pixel offset for osd_byte register +wire [6:0] osd_vcnt = v_cnt - v_osd_start; + +wire osd_pixel = osd_byte[osd_vcnt[3:1]]; + +reg [7:0] osd_byte; +always @(posedge pclk) + osd_byte <= osd_buffer[{osd_vcnt[6:4], osd_hcnt}]; + +wire [2:0] osd_color = OSD_COLOR; +assign red_out = !osd_de?red_in: {osd_pixel, osd_pixel, osd_color[2], red_in[5:3] }; +assign green_out = !osd_de?green_in:{osd_pixel, osd_pixel, osd_color[1], green_in[5:3]}; +assign blue_out = !osd_de?blue_in: {osd_pixel, osd_pixel, osd_color[0], blue_in[5:3] }; + +assign hs_out = hs_in; +assign vs_out = vs_in; + +endmodule \ No newline at end of file diff --git a/tutorials/soc/lesson12/rgb2ypbpr.sv b/tutorials/soc/lesson12/rgb2ypbpr.sv new file mode 100644 index 0000000..1e1662e --- /dev/null +++ b/tutorials/soc/lesson12/rgb2ypbpr.sv @@ -0,0 +1,55 @@ +module rgb2ypbpr ( + input [5:0] red, + input [5:0] green, + input [5:0] blue, + + output [5:0] y, + output [5:0] pb, + output [5:0] pr +); + +wire [5:0] yuv_full[225] = '{ + 6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1, + 6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4, + 6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6, + 6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8, + 6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11, + 6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13, + 6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15, + 6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17, + 6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20, + 6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22, + 6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24, + 6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27, + 6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29, + 6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31, + 6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33, + 6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36, + 6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38, + 6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40, + 6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42, + 6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45, + 6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47, + 6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49, + 6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52, + 6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54, + 6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56, + 6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58, + 6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61, + 6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63, + 6'd63 +}; + +wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0}); +wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0}); +wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0}); + +wire [7:0] y_i = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8]; +wire [7:0] pb_i = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8]; +wire [7:0] pr_i = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8]; + +assign pr = yuv_full[pr_i - 8'd16]; +assign y = yuv_full[y_i - 8'd16]; +assign pb = yuv_full[pb_i - 8'd16]; + +endmodule diff --git a/tutorials/soc/lesson12/scandoubler.v b/tutorials/soc/lesson12/scandoubler.v new file mode 100644 index 0000000..6edcc8d --- /dev/null +++ b/tutorials/soc/lesson12/scandoubler.v @@ -0,0 +1,147 @@ +// +// scandoubler.v +// +// Copyright (c) 2015 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +module scandoubler ( + // system interface + input clk_in, + input clk_out, + + input scanlines, + + // shifter video interface + input hs_in, + input vs_in, + input [5:0] r_in, + input [5:0] g_in, + input [5:0] b_in, + + // output interface + output reg [5:0] r_out, + output reg [5:0] g_out, + output reg [5:0] b_out, + output reg vs_out, + output reg hs_out +); + +// scan doubler output register +reg [17:0] sd_out; + +// --------------------- create output signals ----------------- +// latch everything once more to make it glitch free and apply scanline effect +reg scanline; + +always @(posedge clk_out) begin + vs_out <= vs_in; + hs_out <= hs_sd; + + // reset scanlines at every new screen + if(vs_out != vs_in) + scanline <= 1'b0; + + // toggle scanlines at begin of every hsync + if(hs_out && !hs_sd) + scanline <= !scanline; + + // if no scanlines or not a scanline + if(!scanlines || !scanline) begin + r_out <= { sd_out[17:12] }; + g_out <= { sd_out[11:6] }; + b_out <= { sd_out[5:0] }; + end else begin + r_out <= { 1'b0, sd_out[17:13] }; + g_out <= { 1'b0, sd_out[11:7] }; + b_out <= { 1'b0, sd_out[5:1] }; + end +end + + + +// ================================================================== +// ======================== the line buffers ======================== +// ================================================================== + +// 2 lines of 1024 pixels 3*6 bit RGB +reg [17:0] sd_buffer [2047:0]; + +// use alternating sd_buffers when storing/reading data +reg vsD; +reg line_toggle; +always @(negedge clk_in) begin + vsD <= vs_in; + + if(vsD != vs_in) + line_toggle <= 1'b0; + + // begin of incoming hsync + if(hsD && !hs_in) + line_toggle <= !line_toggle; +end + +always @(negedge clk_in) begin + sd_buffer[{line_toggle, hcnt}] <= { r_in, g_in, b_in }; +end + +// ================================================================== +// =================== horizontal timing analysis =================== +// ================================================================== + +// total hsync time (in 16MHz cycles), hs_total reaches 1024 +reg [9:0] hs_max; +reg [9:0] hs_rise; +reg [9:0] hcnt; +reg hsD; + +always @(negedge clk_in) begin + hsD <= hs_in; + + // falling edge of hsync indicates start of line + if(hsD && !hs_in) begin + hs_max <= hcnt; + hcnt <= 10'd0; + end else + hcnt <= hcnt + 10'd1; + + // save position of rising edge + if(!hsD && hs_in) + hs_rise <= hcnt; +end + +// ================================================================== +// ==================== output timing generation ==================== +// ================================================================== + +reg [9:0] sd_hcnt; +reg hs_sd; + +// timing generation runs 32 MHz (twice the input signal analysis speed) +always @(posedge clk_out) begin + + // output counter synchronous to input and at twice the rate + sd_hcnt <= sd_hcnt + 10'd1; + if(hsD && !hs_in) sd_hcnt <= hs_max; + if(sd_hcnt == hs_max) sd_hcnt <= 10'd0; + + // replicate horizontal sync at twice the speed + if(sd_hcnt == hs_max) hs_sd <= 1'b0; + if(sd_hcnt == hs_rise) hs_sd <= 1'b1; + + // read data from line sd_buffer + sd_out <= sd_buffer[{~line_toggle, sd_hcnt}]; +end + +endmodule diff --git a/tutorials/soc/lesson12/soc.qpf b/tutorials/soc/lesson12/soc.qpf new file mode 100644 index 0000000..a057227 --- /dev/null +++ b/tutorials/soc/lesson12/soc.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "soc" diff --git a/tutorials/soc/lesson12/soc.qsf b/tutorials/soc/lesson12/soc.qsf new file mode 100644 index 0000000..979792e --- /dev/null +++ b/tutorials/soc/lesson12/soc.qsf @@ -0,0 +1,165 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY soc +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_* +set_global_assignment -name SYSTEMVERILOG_FILE rgb2ypbpr.sv +set_global_assignment -name VERILOG_FILE video.v +set_global_assignment -name VERILOG_FILE scandoubler.v +set_global_assignment -name VERILOG_FILE user_io.v +set_global_assignment -name VERILOG_FILE osd.v +set_global_assignment -name VERILOG_FILE soc.v +set_global_assignment -name QIP_FILE image.qip +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/soc/lesson12/soc.rbf b/tutorials/soc/lesson12/soc.rbf new file mode 100644 index 0000000000000000000000000000000000000000..076f0410f34743dda300f6c9f13d814d3140cbf3 GIT binary patch literal 241782 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%0DR_48I0({vX6RsE{PGE*u1;dH&;yq%g7xf1& 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 +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +// parameter STRLEN and the actual length of conf_str have to match + +module user_io #(parameter STRLEN=0) ( + input [(8*STRLEN)-1:0] conf_str, + + input SPI_CLK, + input SPI_SS_IO, + output reg SPI_MISO, + input SPI_MOSI, + + output reg [7:0] joystick_0, + output reg [7:0] joystick_1, + output reg [15:0] joystick_analog_0, + output reg [15:0] joystick_analog_1, + output [1:0] buttons, + output [1:0] switches, + output scandoubler_disable, + output ypbpr, + + output reg [7:0] status, + + // connection to sd card emulation + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + input sd_conf, + input sd_sdhc, + output [7:0] sd_dout, // valid on rising edge of sd_dout_strobe + output reg sd_dout_strobe, + input [7:0] sd_din, + output reg sd_din_strobe, + + + // ps2 keyboard emulation + input ps2_clk, // 12-16khz provided by core + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + + // serial com port + input [7:0] serial_data, + input serial_strobe +); + +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [7:0] byte_cnt; // counts bytes +reg [5:0] joystick0; +reg [5:0] joystick1; +reg [5:0] but_sw; +reg [2:0] stick_idx; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; +assign ypbpr = but_sw[5]; + +assign sd_dout = { sbuf, SPI_MOSI}; + +// this variant of user_io is for 8 bit cores (type == a4) only +wire [7:0] core_type = 8'ha4; + +// command byte read by the io controller +wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], SPI_CLK } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// drive MISO only when transmitting core id +always@(negedge spi_sck or posedge SPI_SS_IO) begin + if(SPI_SS_IO == 1) begin + SPI_MISO <= 1'bZ; + end else begin + + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + SPI_MISO <= core_type[~bit_cnt]; + + end else begin + // reading serial fifo + if(cmd == 8'h1b) begin + // send alternating flag byte and data + if(byte_cnt[0]) SPI_MISO <= serial_out_status[~bit_cnt]; + else SPI_MISO <= serial_out_byte[~bit_cnt]; + end + + // reading config string + else if(cmd == 8'h14) begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) + SPI_MISO <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card status + else if(cmd == 8'h16) begin + if(byte_cnt == 1) + SPI_MISO <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) + SPI_MISO <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card write data + else if(cmd == 8'h18) + SPI_MISO <= sd_din[~bit_cnt]; + + else + SPI_MISO <= 1'b0; + end + end +end + +// ---------------- PS2 --------------------- + +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +// keyboard +reg [7:0] ps2_kbd_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_kbd_tx_state; +reg [7:0] ps2_kbd_tx_byte; +reg ps2_kbd_parity; + +assign ps2_kbd_clk = ps2_clk || (ps2_kbd_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_kbd_r_inc; +always@(posedge ps2_clk) begin + ps2_kbd_r_inc <= 1'b0; + + if(ps2_kbd_r_inc) + ps2_kbd_rptr <= ps2_kbd_rptr + 1; + + // transmitter is idle? + if(ps2_kbd_tx_state == 0) begin + // data in fifo present? + if(ps2_kbd_wptr != ps2_kbd_rptr) begin + // load tx register from fifo + ps2_kbd_tx_byte <= ps2_kbd_fifo[ps2_kbd_rptr]; + ps2_kbd_r_inc <= 1'b1; + + // reset parity + ps2_kbd_parity <= 1'b1; + + // start transmitter + ps2_kbd_tx_state <= 4'd1; + + // put start bit on data line + ps2_kbd_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_kbd_tx_state >= 1)&&(ps2_kbd_tx_state < 9)) begin + ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits + ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down + if(ps2_kbd_tx_byte[0]) + ps2_kbd_parity <= !ps2_kbd_parity; + end + + // transmission of parity + if(ps2_kbd_tx_state == 9) + ps2_kbd_data <= ps2_kbd_parity; + + // transmission of stop bit + if(ps2_kbd_tx_state == 10) + ps2_kbd_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) + ps2_kbd_tx_state <= ps2_kbd_tx_state + 4'd1; + else + ps2_kbd_tx_state <= 4'd0; + + end +end + +// mouse +reg [7:0] ps2_mouse_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_mouse_tx_state; +reg [7:0] ps2_mouse_tx_byte; +reg ps2_mouse_parity; + +assign ps2_mouse_clk = ps2_clk || (ps2_mouse_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_mouse_r_inc; +always@(posedge ps2_clk) begin + ps2_mouse_r_inc <= 1'b0; + + if(ps2_mouse_r_inc) + ps2_mouse_rptr <= ps2_mouse_rptr + 1; + + // transmitter is idle? + if(ps2_mouse_tx_state == 0) begin + // data in fifo present? + if(ps2_mouse_wptr != ps2_mouse_rptr) begin + // load tx register from fifo + ps2_mouse_tx_byte <= ps2_mouse_fifo[ps2_mouse_rptr]; + ps2_mouse_r_inc <= 1'b1; + + // reset parity + ps2_mouse_parity <= 1'b1; + + // start transmitter + ps2_mouse_tx_state <= 4'd1; + + // put start bit on data line + ps2_mouse_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_mouse_tx_state >= 1)&&(ps2_mouse_tx_state < 9)) begin + ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits + ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down + if(ps2_mouse_tx_byte[0]) + ps2_mouse_parity <= !ps2_mouse_parity; + end + + // transmission of parity + if(ps2_mouse_tx_state == 9) + ps2_mouse_data <= ps2_mouse_parity; + + // transmission of stop bit + if(ps2_mouse_tx_state == 10) + ps2_mouse_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) + ps2_mouse_tx_state <= ps2_mouse_tx_state + 4'd1; + else + ps2_mouse_tx_state <= 4'd0; + + end +end + +// fifo to receive serial data from core to be forwarded to io controller + +// 16 byte fifo to store serial bytes +localparam SERIAL_OUT_FIFO_BITS = 6; +reg [7:0] serial_out_fifo [(2**SERIAL_OUT_FIFO_BITS)-1:0]; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_wptr; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_rptr; + +wire serial_out_data_available = serial_out_wptr != serial_out_rptr; +wire [7:0] serial_out_byte = serial_out_fifo[serial_out_rptr] /* synthesis keep */; +wire [7:0] serial_out_status = { 7'b1000000, serial_out_data_available}; + +// status[0] is reset signal from io controller and is thus used to flush +// the fifo +always @(posedge serial_strobe or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_wptr <= 0; + end else begin + serial_out_fifo[serial_out_wptr] <= serial_data; + serial_out_wptr <= serial_out_wptr + 1; + end +end + +always@(negedge spi_sck or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_rptr <= 0; + end else begin + if((byte_cnt != 0) && (cmd == 8'h1b)) begin + // read last bit -> advance read pointer + if((bit_cnt == 7) && !byte_cnt[0] && serial_out_data_available) + serial_out_rptr <= serial_out_rptr + 1; + end + end +end + +// SPI receiver +always@(posedge spi_sck or posedge SPI_SS_IO) begin + + if(SPI_SS_IO == 1) begin + bit_cnt <= 3'd0; + byte_cnt <= 8'd0; + sd_ack <= 1'b0; + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + end else begin + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + + if(bit_cnt != 7) + sbuf[6:0] <= { sbuf[5:0], SPI_MOSI }; + + bit_cnt <= bit_cnt + 3'd1; + if((bit_cnt == 7)&&(byte_cnt != 8'd255)) + byte_cnt <= byte_cnt + 8'd1; + + // finished reading command byte + if(bit_cnt == 7) begin + if(byte_cnt == 0) begin + cmd <= { sbuf, SPI_MOSI}; + + // fetch first byte when sectore FPGA->IO command has been seen + if({ sbuf, SPI_MOSI} == 8'h18) + sd_din_strobe <= 1'b1; + + if(({ sbuf, SPI_MOSI} == 8'h17) || ({ sbuf, SPI_MOSI} == 8'h18)) + sd_ack <= 1'b1; + + end else begin + + // buttons and switches + if(cmd == 8'h01) + but_sw <= { sbuf[4:0], SPI_MOSI }; + + if(cmd == 8'h02) + joystick_0 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h03) + joystick_1 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h04) begin + // store incoming ps2 mouse bytes + ps2_mouse_fifo[ps2_mouse_wptr] <= { sbuf, SPI_MOSI }; + ps2_mouse_wptr <= ps2_mouse_wptr + 1; + end + + if(cmd == 8'h05) begin + // store incoming ps2 keyboard bytes + ps2_kbd_fifo[ps2_kbd_wptr] <= { sbuf, SPI_MOSI }; + ps2_kbd_wptr <= ps2_kbd_wptr + 1; + end + + if(cmd == 8'h15) + status <= { sbuf[6:0], SPI_MOSI }; + + // send sector IO -> FPGA + if(cmd == 8'h17) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + sd_dout_strobe <= 1'b1; + end + + // send sector FPGA -> IO + if(cmd == 8'h18) + sd_din_strobe <= 1'b1; + + // send SD config IO -> FPGA + if(cmd == 8'h19) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + sd_dout_strobe <= 1'b1; + end + + // joystick analog + if(cmd == 8'h1a) begin + // first byte is joystick indes + if(byte_cnt == 1) + stick_idx <= { sbuf[1:0], SPI_MOSI }; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) + joystick_analog_0[15:8] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[15:8] <= { sbuf, SPI_MOSI }; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) + joystick_analog_0[7:0] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[7:0] <= { sbuf, SPI_MOSI }; + end + end + + end + end + end +end + +endmodule diff --git a/tutorials/soc/lesson12/video.v b/tutorials/soc/lesson12/video.v new file mode 100644 index 0000000..c18a0a5 --- /dev/null +++ b/tutorials/soc/lesson12/video.v @@ -0,0 +1,124 @@ +// A simple system-on-a-chip (SoC) for the MiST +// (c) 2016 Till Harbaum + +// video controller generating 160x100 pixles. The video mode is based +// upon a non-interlaced PAL or NTSC TV mode. + + +module video ( + // pixel clock + input pclk, + + // config input + input pal, + + // CPU interface (write only!) + input cpu_clk, + input cpu_wr, + input [13:0] cpu_addr, + input [7:0] cpu_data, + + // output to VGA screen + output reg hs, + output reg vs, + output [5:0] r, + output [5:0] g, + output [5:0] b +); + +// PAL timing: +// 864 pixel total horizontal @ 13.5 Mhz = 15.625 kHz +// 312 lines vertically @ 15.625 kHz = 50.08 Hz + +// NTSC timing: +// 858 pixel total horizontal @ 13.5 Mhz = 15.735 kHz +// 262 lines vertically @ 15.735 kHz = 60.05 Hz + +parameter H = 640; // width of visible area +wire [9:0] hfp = pal?51:56; // unused time before hsync +wire [9:0] hsw = pal?63:63; // width of hsync +wire [9:0] hbp = pal?110:99; // unused time after hsync + +parameter V = 200; // height of visible area +wire [9:0] vfp = pal?46:23; // unused time before vsync +wire [9:0] vsw = pal?2:3; // width of vsync +wire [9:0] vbp = pal?64:36; // unused time after vsync + +reg[9:0] h_cnt; // horizontal pixel counter +reg[9:0] v_cnt; // vertical pixel counter + +// horizontal pixel counter +always@(posedge pclk) begin + if(h_cnt==H+hfp+hsw+hbp-1) h_cnt <= 10'd0; + else h_cnt <= h_cnt + 10'd1; + + // generate negative hsync signal + if(h_cnt == H+hfp) hs <= 1'b0; + if(h_cnt == H+hfp+hsw) hs <= 1'b1; +end + +// veritical pixel counter +always@(posedge pclk) begin + // the vertical counter is processed at the begin of each hsync + if(h_cnt == H+hfp) begin + if(v_cnt==vsw+vbp+V+vfp-1) v_cnt <= 10'd0; + else v_cnt <= v_cnt + 10'd1; + + // generate negative vsync signal + if(v_cnt == V+vfp) vs <= 1'b0; + if(v_cnt == V+vfp+vsw) vs <= 1'b1; + end +end + +// 16000 bytes of internal video memory for 160x100 pixel at 8 Bit (RGB 332) +reg [7:0] vmem [160*100-1:0]; + +reg [13:0] video_counter; +reg [7:0] pixel; + +// write VRAM via CPU interface +always @(posedge cpu_clk) + if(cpu_wr) + vmem[cpu_addr] <= cpu_data; + +// read VRAM for video generation +always@(posedge pclk) begin + // The video counter is being reset at the begin of each vsync. + // Otherwise it's increased every fourth pixel in the visible area. + // At the end of the first three of four lines the counter is + // decreased by the total line length to display the same contents + // for four lines so 100 different lines are displayed on the 400 + // VGA lines. + + // visible area? + if((v_cnt < V) && (h_cnt < H)) begin + // increase video counter after each pixel + if(h_cnt[1:0] == 2'd3) + video_counter <= video_counter + 14'd1; + + pixel <= vmem[video_counter]; // read VRAM + end else begin + // video counter is manipulated at the end of a line outside + // the visible area + if(h_cnt == H+hfp) begin + // the video counter is reset at the begin of the vsync + // at the end of every second line it's decremented + // one line to repeat the same pixels over two display + // lines + if(v_cnt == V+vfp) + video_counter <= 14'd0; + else if((v_cnt < V) && (v_cnt[0] != 2'd1)) + video_counter <= video_counter - 14'd160; + end + + pixel <= 8'h00; // color outside visible area: black + end +end + +// split the 8 rgb bits into the three base colors. Every second line is +// darker to give some scanlines effect +assign r = { pixel[7:5], 3'b000 }; +assign g = { pixel[4:2], 3'b000 }; +assign b = { pixel[1:0], 4'b0000 }; + +endmodule diff --git a/tutorials/soc/readme.md b/tutorials/soc/readme.md index 97a84e7..cbe8ecd 100644 --- a/tutorials/soc/readme.md +++ b/tutorials/soc/readme.md @@ -721,4 +721,38 @@ Links: Files required on SD card: - [`soc.rbf`](https://github.com/mist-devel/mist-board/raw/master/tutorials/soc/lesson11/soc.rbf) renamed to `core.rbf` + +[Lesson 12](https://github.com/mist-devel/mist-board/tree/master/tutorials/soc/lesson12): YPbPr component video +------------------------------- + +SCART is a nice way to send a true "retro" video signal to a TV. +Unfortunately SCART or any other kind of RGBs input isn't available +on most modern TVs anymore. + +What many TVs still have is a so-called YPbPr component input. This +type of input uses three connections Y, Pb and Pr. Y carries a +geyscale signal together with a composite sync signal. Thus only +connecting the Y signal may already result in a grayscale image +on many TVs. The other two signal Pb and Pr carry color difference +signals. Together with the Y signal they allow the TV to reconstruct +the color. + +For YPbPr a special adaptor is need for the MIST as described in the +[MIST wiki](https://github.com/mist-devel/mist-board/wiki/YPbPr_Cable). + +Many TVs support various common video modes on their component inputs. +It is thus often possible to use the YPbPr with or without +scandoubler. With scandoubler enabled the resulting 720p modes may +even use scanline effects. + +This makes a YPbPr connection a very nice choice when connecting the +MIST to many modern TVs. + +Links: + - [MIST YpbPr adapter](https://github.com/mist-devel/mist-board/wiki/YPbPr_Cable) + - [Enabling YPbPr in the MIST .ini file](https://github.com/mist-devel/mist-board/wiki/DocIni#ypbpr) + - [Buy a cable](http://lotharek.pl/product.php?pid=168) + +Files required on SD card: + - [`soc.rbf`](https://github.com/mist-devel/mist-board/raw/master/tutorials/soc/lesson12/soc.rbf) renamed to `core.rbf` \ No newline at end of file