From 25f64fde21ee52ce3544f73f80cc7054914ff47d Mon Sep 17 00:00:00 2001 From: TinyTapeoutBot <139130078+TinyTapeoutBot@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:15:43 +0200 Subject: [PATCH] feat: update project tt_um_jamesrosssharp_1bitam from jamesrosssharp/tt09-am-sdr Commit: a2a5c0f7128774bb6a97d489772b01d4c283540d Workflow: https://github.com/jamesrosssharp/tt09-am-sdr/actions/runs/11538461894 --- .../commit_id.json | 8 ++-- .../tt_um_jamesrosssharp_1bitam/docs/info.md | 43 ++++++++++++++++-- .../stats/metrics.csv | 40 ++++++++-------- .../tt_um_jamesrosssharp_1bitam.gds | Bin 16752092 -> 16752092 bytes 4 files changed, 62 insertions(+), 29 deletions(-) diff --git a/projects/tt_um_jamesrosssharp_1bitam/commit_id.json b/projects/tt_um_jamesrosssharp_1bitam/commit_id.json index 7e893d4d..7ed65e6f 100644 --- a/projects/tt_um_jamesrosssharp_1bitam/commit_id.json +++ b/projects/tt_um_jamesrosssharp_1bitam/commit_id.json @@ -1,9 +1,9 @@ { - "app": "Tiny Tapeout tt09 30dbb0cd", + "app": "Tiny Tapeout tt09 b176ed7c", "repo": "https://github.com/jamesrosssharp/tt09-am-sdr", - "commit": "7650db3ffba93eaa69990b231e6e18236e432c42", - "workflow_url": "https://github.com/jamesrosssharp/tt09-am-sdr/actions/runs/11192111947", + "commit": "a2a5c0f7128774bb6a97d489772b01d4c283540d", + "workflow_url": "https://github.com/jamesrosssharp/tt09-am-sdr/actions/runs/11538461894", "sort_id": 1727598365626, - "openlane_version": "OpenLane2 2.1.7", + "openlane_version": "OpenLane2 2.1.9", "pdk_version": "open_pdks bdc9412b3e468c102d01b7cf6337be06ec6e9c9a" } \ No newline at end of file diff --git a/projects/tt_um_jamesrosssharp_1bitam/docs/info.md b/projects/tt_um_jamesrosssharp_1bitam/docs/info.md index e2023837..c8e385b9 100644 --- a/projects/tt_um_jamesrosssharp_1bitam/docs/info.md +++ b/projects/tt_um_jamesrosssharp_1bitam/docs/info.md @@ -9,19 +9,52 @@ You can also include images in this folder and reference them in the markdown. E ## How it works -This is a Software Defined Radio pipeline for AM radio reception written in verilog. It works using -an external comparator as a 1-bit ADC frontend which is oversampled and decimated 4096 times to give -around 6 bits of precision. It is based on this [Hackaday Project](https://hackaday.io/project/170916-fpga-3-r-1-c-mw-and-sw-sdr-receiver). +This project is a Software Defined Radio pipeline for AM radio reception written in verilog. It works using an external comparator as a 1-bit ADC frontend which is oversampled and decimated 4096 times to give an extra 6 bits of precision. It is based on this Hackaday Project: [https://hackaday.io/project/170916-fpga-3-r-1-c-mw-and-sw-sdr-receiver](https://hackaday.io/project/170916-fpga-3-r-1-c-mw-and-sw-sdr-receiver) by Alberto Garlassi. + +Although this is a fully digital core, but there are plans to make an analog frontend circuit as an analog design in future Tiny Tapeouts, so both designs would be hooked up together to create a radio with few external components. + +Also, this core is very big - 3x2 Tiny Tapeout tiles (@ 64% utilisation). An area of future development could be to simplify the demodulation pipeline to reduce gate count. ## How to test -You need to connect an external comparator and RC network. +You need to connect an external comparator and RC network. You will probably need a simple RF amplifier as well. See below for more information. + +The core has a SPI interface for setting the demodulation frequency and gain. It consists of a single +32-bit shift register. It has the following format:- + +| Bits 31 - 30| Bits 29 - 26 | Bits 25 - 0 | +|-------------|--------------|-----------------| +| Unused | Gain | NCO Phase incr.| + +The gain can take on the following values: + +| "Gain" value| Actual Gain| +|--------------|------------| +| 0 | x1 | +| 1 | x2 | +| 2 | x4 | +| 3 | x8 | +| 4 | x16 | +| 5 - 7 | x32 | -![Alt text](schematic.png "the schematic for the external circuitry") +If the gain is set too high, the demodulated signal will wrap and sound distorted, so adjust the gain down to the minimum needed to hear the station clearly. + +The "NCO Phase increment" is the value that is added to the NCO phase every clock cycle. Use the following python code to calculate the value to write, based on the desired carrier frequency: + + hex(int((1<<26) * / )) + +E.g., for 936kHz (ABC Radio national Hobart) at 50MHz clock frequency, it would be: + + > hex(int((1<<26) * 936000 / 50000000)) + '0x132b55' ## External hardware +![Schematic diagram of external circuitry](schematic.png "the schematic for the external circuitry") + - External comparator - Resistor bias network - RC network - External SPI microcontroller to set station +- RF amplifier + diff --git a/projects/tt_um_jamesrosssharp_1bitam/stats/metrics.csv b/projects/tt_um_jamesrosssharp_1bitam/stats/metrics.csv index 9ad79b49..c6f024ec 100644 --- a/projects/tt_um_jamesrosssharp_1bitam/stats/metrics.csv +++ b/projects/tt_um_jamesrosssharp_1bitam/stats/metrics.csv @@ -23,10 +23,10 @@ timing__setup__tns__corner:nom_tt_025C_1v80,0.0 timing__hold__wns__corner:nom_tt_025C_1v80,0 timing__setup__wns__corner:nom_tt_025C_1v80,0.0 timing__hold_vio__count__corner:nom_tt_025C_1v80,0 -timing__hold_r2r__ws__corner:nom_tt_025C_1v80,0.318418 +timing__hold_r2r__ws__corner:nom_tt_025C_1v80,Infinity timing__hold_r2r_vio__count__corner:nom_tt_025C_1v80,0 timing__setup_vio__count__corner:nom_tt_025C_1v80,0 -timing__setup_r2r__ws__corner:nom_tt_025C_1v80,17.645237 +timing__setup_r2r__ws__corner:nom_tt_025C_1v80,Infinity timing__setup_r2r_vio__count__corner:nom_tt_025C_1v80,0 design__max_slew_violation__count__corner:nom_ss_100C_1v60,0 design__max_fanout_violation__count__corner:nom_ss_100C_1v60,57 @@ -40,10 +40,10 @@ timing__setup__tns__corner:nom_ss_100C_1v60,0.0 timing__hold__wns__corner:nom_ss_100C_1v60,0 timing__setup__wns__corner:nom_ss_100C_1v60,0.0 timing__hold_vio__count__corner:nom_ss_100C_1v60,0 -timing__hold_r2r__ws__corner:nom_ss_100C_1v60,0.861402 +timing__hold_r2r__ws__corner:nom_ss_100C_1v60,Infinity timing__hold_r2r_vio__count__corner:nom_ss_100C_1v60,0 timing__setup_vio__count__corner:nom_ss_100C_1v60,0 -timing__setup_r2r__ws__corner:nom_ss_100C_1v60,10.595914 +timing__setup_r2r__ws__corner:nom_ss_100C_1v60,Infinity timing__setup_r2r_vio__count__corner:nom_ss_100C_1v60,0 design__max_slew_violation__count__corner:nom_ff_n40C_1v95,0 design__max_fanout_violation__count__corner:nom_ff_n40C_1v95,57 @@ -57,10 +57,10 @@ timing__setup__tns__corner:nom_ff_n40C_1v95,0.0 timing__hold__wns__corner:nom_ff_n40C_1v95,0 timing__setup__wns__corner:nom_ff_n40C_1v95,0.0 timing__hold_vio__count__corner:nom_ff_n40C_1v95,0 -timing__hold_r2r__ws__corner:nom_ff_n40C_1v95,0.109296 +timing__hold_r2r__ws__corner:nom_ff_n40C_1v95,Infinity timing__hold_r2r_vio__count__corner:nom_ff_n40C_1v95,0 timing__setup_vio__count__corner:nom_ff_n40C_1v95,0 -timing__setup_r2r__ws__corner:nom_ff_n40C_1v95,18.460741 +timing__setup_r2r__ws__corner:nom_ff_n40C_1v95,Infinity timing__setup_r2r_vio__count__corner:nom_ff_n40C_1v95,0 design__max_slew_violation__count,0 design__max_fanout_violation__count,57 @@ -74,10 +74,10 @@ timing__setup__tns,0.0 timing__hold__wns,0 timing__setup__wns,0.0 timing__hold_vio__count,0 -timing__hold_r2r__ws,0.107602 +timing__hold_r2r__ws,inf timing__hold_r2r_vio__count,0 timing__setup_vio__count,0 -timing__setup_r2r__ws,10.524012 +timing__setup_r2r__ws,inf timing__setup_r2r_vio__count,0 design__die__bbox,0.0 0.0 508.76 225.76 design__core__bbox,2.76 2.72 506.0 223.04 @@ -147,10 +147,10 @@ timing__setup__tns__corner:min_tt_025C_1v80,0.0 timing__hold__wns__corner:min_tt_025C_1v80,0 timing__setup__wns__corner:min_tt_025C_1v80,0.0 timing__hold_vio__count__corner:min_tt_025C_1v80,0 -timing__hold_r2r__ws__corner:min_tt_025C_1v80,0.314248 +timing__hold_r2r__ws__corner:min_tt_025C_1v80,Infinity timing__hold_r2r_vio__count__corner:min_tt_025C_1v80,0 timing__setup_vio__count__corner:min_tt_025C_1v80,0 -timing__setup_r2r__ws__corner:min_tt_025C_1v80,17.670050 +timing__setup_r2r__ws__corner:min_tt_025C_1v80,Infinity timing__setup_r2r_vio__count__corner:min_tt_025C_1v80,0 timing__unannotated_net__count__corner:min_tt_025C_1v80,85 timing__unannotated_net_filtered__count__corner:min_tt_025C_1v80,0 @@ -166,10 +166,10 @@ timing__setup__tns__corner:min_ss_100C_1v60,0.0 timing__hold__wns__corner:min_ss_100C_1v60,0 timing__setup__wns__corner:min_ss_100C_1v60,0.0 timing__hold_vio__count__corner:min_ss_100C_1v60,0 -timing__hold_r2r__ws__corner:min_ss_100C_1v60,0.855458 +timing__hold_r2r__ws__corner:min_ss_100C_1v60,Infinity timing__hold_r2r_vio__count__corner:min_ss_100C_1v60,0 timing__setup_vio__count__corner:min_ss_100C_1v60,0 -timing__setup_r2r__ws__corner:min_ss_100C_1v60,10.682551 +timing__setup_r2r__ws__corner:min_ss_100C_1v60,Infinity timing__setup_r2r_vio__count__corner:min_ss_100C_1v60,0 timing__unannotated_net__count__corner:min_ss_100C_1v60,85 timing__unannotated_net_filtered__count__corner:min_ss_100C_1v60,0 @@ -185,10 +185,10 @@ timing__setup__tns__corner:min_ff_n40C_1v95,0.0 timing__hold__wns__corner:min_ff_n40C_1v95,0 timing__setup__wns__corner:min_ff_n40C_1v95,0.0 timing__hold_vio__count__corner:min_ff_n40C_1v95,0 -timing__hold_r2r__ws__corner:min_ff_n40C_1v95,0.107602 +timing__hold_r2r__ws__corner:min_ff_n40C_1v95,Infinity timing__hold_r2r_vio__count__corner:min_ff_n40C_1v95,0 timing__setup_vio__count__corner:min_ff_n40C_1v95,0 -timing__setup_r2r__ws__corner:min_ff_n40C_1v95,18.477751 +timing__setup_r2r__ws__corner:min_ff_n40C_1v95,Infinity timing__setup_r2r_vio__count__corner:min_ff_n40C_1v95,0 timing__unannotated_net__count__corner:min_ff_n40C_1v95,85 timing__unannotated_net_filtered__count__corner:min_ff_n40C_1v95,0 @@ -204,10 +204,10 @@ timing__setup__tns__corner:max_tt_025C_1v80,0.0 timing__hold__wns__corner:max_tt_025C_1v80,0 timing__setup__wns__corner:max_tt_025C_1v80,0.0 timing__hold_vio__count__corner:max_tt_025C_1v80,0 -timing__hold_r2r__ws__corner:max_tt_025C_1v80,0.321692 +timing__hold_r2r__ws__corner:max_tt_025C_1v80,Infinity timing__hold_r2r_vio__count__corner:max_tt_025C_1v80,0 timing__setup_vio__count__corner:max_tt_025C_1v80,0 -timing__setup_r2r__ws__corner:max_tt_025C_1v80,17.622231 +timing__setup_r2r__ws__corner:max_tt_025C_1v80,Infinity timing__setup_r2r_vio__count__corner:max_tt_025C_1v80,0 timing__unannotated_net__count__corner:max_tt_025C_1v80,85 timing__unannotated_net_filtered__count__corner:max_tt_025C_1v80,0 @@ -223,10 +223,10 @@ timing__setup__tns__corner:max_ss_100C_1v60,0.0 timing__hold__wns__corner:max_ss_100C_1v60,0 timing__setup__wns__corner:max_ss_100C_1v60,0.0 timing__hold_vio__count__corner:max_ss_100C_1v60,0 -timing__hold_r2r__ws__corner:max_ss_100C_1v60,0.866076 +timing__hold_r2r__ws__corner:max_ss_100C_1v60,Infinity timing__hold_r2r_vio__count__corner:max_ss_100C_1v60,0 timing__setup_vio__count__corner:max_ss_100C_1v60,0 -timing__setup_r2r__ws__corner:max_ss_100C_1v60,10.524012 +timing__setup_r2r__ws__corner:max_ss_100C_1v60,Infinity timing__setup_r2r_vio__count__corner:max_ss_100C_1v60,0 timing__unannotated_net__count__corner:max_ss_100C_1v60,85 timing__unannotated_net_filtered__count__corner:max_ss_100C_1v60,0 @@ -242,10 +242,10 @@ timing__setup__tns__corner:max_ff_n40C_1v95,0.0 timing__hold__wns__corner:max_ff_n40C_1v95,0 timing__setup__wns__corner:max_ff_n40C_1v95,0.0 timing__hold_vio__count__corner:max_ff_n40C_1v95,0 -timing__hold_r2r__ws__corner:max_ff_n40C_1v95,0.111562 +timing__hold_r2r__ws__corner:max_ff_n40C_1v95,Infinity timing__hold_r2r_vio__count__corner:max_ff_n40C_1v95,0 timing__setup_vio__count__corner:max_ff_n40C_1v95,0 -timing__setup_r2r__ws__corner:max_ff_n40C_1v95,18.443205 +timing__setup_r2r__ws__corner:max_ff_n40C_1v95,Infinity timing__setup_r2r_vio__count__corner:max_ff_n40C_1v95,0 timing__unannotated_net__count__corner:max_ff_n40C_1v95,85 timing__unannotated_net_filtered__count__corner:max_ff_n40C_1v95,0 diff --git a/projects/tt_um_jamesrosssharp_1bitam/tt_um_jamesrosssharp_1bitam.gds b/projects/tt_um_jamesrosssharp_1bitam/tt_um_jamesrosssharp_1bitam.gds index 2e30bb6359444eee3be313abf3720363ddb68dfd..97b691c90d4ce4ff3d2bbb4c85c1d5c995f715cb 100644 GIT binary patch delta 3541 zcmY+`dq7lG9tUvm%-lP7UN9iTykKVVk)@lWq^2d0HG9~DDND^V$kK2v0a@w2u(T^> ziI34vMG9t0REyN4zsyW*SIbqBrH8SZXzsG^)&ka=TR!M}FWz(XkIx_X$GzwLe&_to z91d+iXFUWfg7)A5>j3+JaRVYIw*IM5+RD7)JQPyct^#Ko%j%ZW*@{MaM650`kyX~n zrEKSSQe~`ozbD=;O>tSzj}fc)d*bULZ_sRT~+=CWh zJhyR1GLK|d+k^3K+ovWP5k2|NYf;j$eS@4vG#))T!)rXS%CRONt9-*L$MyG>#}m3D;+E-?l8nh~-&DROH&WAd=gQI|sOMpF?lOq)%Jm!S z5~Y~d`}q;8O14kTTlrkt$9`7UrG#0uTbjV~V~#~EJk^#PD{v>U#F%4DYuM)irD`GfT1MgI%mS+mVGHF}qmrYSqFr zi{uo_ZM4W@5`E+9b`Ml&{tinU-x5Onv=|==r_#(`%gHd$4*ilwC2qNqA47^{$S+>7 zB{_1j7y%m;j7@F~Q^`#EQ68q=5;-Q0sa7#V#TMGMOm5&^r1ecYl{U%~BYb*r@1ioiY*bgON>f@DCtp*BUqL^Wb}0$sbQveYN@&Xx zzApV8oaMGQiLbQ-x^=iUN7RFlk)+L|(%fuo3ZI`UXIbZqCv?_b;%MkOEO^QKpcqC! zeW#kNb9niLxsIk9)tx_Y$E>xZjgbCphxAdC~S02vWHg1)K-4I^pE*OgZh@(e0|KDKUUj##ta*l%9@j1 z7FPJKNABOX!Y=jLB%WKe6df~nh|N7zgtV(9c7tsmU#+e4YSE&Z4G**r&xw>Y6EF8EczF36%^aEW-SY?Wi3 zXbyw|G^WW>F@kTC)>X{C)McUe4#xxH)M5U|hZ%3_+tX7SQmOMY=NbMlMgP4Pc{ya& z|CgcAc;{Mv%V=GrA9I-wPjPzv7j~ldk6v}KzzHr$fJAUZ5+uVwNC6L|f){+?hX4dY z8zUV;5QYe3z#te5LtrRe0>j`^xD1BF2>2CT4kKX{WWs0|16gndjD>M99skLk{FZ9{d_6!!)ImM0hgV<&yb2p(6EwhU&A9lb8uoGHf7kmhRhQGjW*aIKI$FLXv3j1I`w8AHF0NUVh&<>x%XYe_E0SDnr z=zzb&S8xcvhQrVaN8l)Y1IOSW@K5N1f5CD1H~a^_h40|M&<#D%3n$=v_yPV0C*emp X1^!wMku)Bd773I#rPU@ui&Qz{cP7kx@W>uJZqKVj{nO@_8RgE|KSkMFl|OZ zMdp}}_>38!pKl9Nq{39qmq*K%cCIj0^A2G}2dqBk{wB#v^VXR@7sKiGMvpmVD%@gv zjPDK|-D~=ckH_$qmv!|873w@{>Jzmh$%ptitmSrxk7WhD7Ai_J_lvLbmY*s|o8RVb zMtPIXHeLY5?lhm|ORc9$MdjwZ!bXMEy2_j~)Occgi}b!}UVq8del{jIO<|i(D>rVe zPnP0Z?-xX^D%n0ZZ{u@mANyH(w-RBo9%&*gh&vXu$TVACywIJ*lH-nX@f96v{NM?h zt~y~}E*j(LSF(q?elUNL&-2i?Xjdh+sPkIOEWVKp&FQ1qEtWcwA6hs_uKO)(()iaH z&_}J0ST>41M|b*IOVA@zO|7L{;42=0iqx!noe0|JYKT_Ly#ta*l&RSAk z7FP6@M;_R`CXn9V(0gtV(9ev@rJU#)HPZTt8G;kS7MKj3=JxG`i} zz1Fr|tf+oRtv?r2koZJDS-zkv$6ZSRP;v=g*-wEdhI3PohlZNuzmL<;yd z3W=RS;Q^|hXD%6y0RsFYX*YWk;*MmTwc`t&@BN)|x8^ z=#B5}TSZ7eBuib6(>yorR?VP>k&ZU;mj288Y`!DRTb$4n7yT+=7i7^dxJ0~EzS^-~ zGzUTf8rSTo9L2Xu>ni46=CV*nr{e)}>M;M~BaFB7?dh!wtJHOc^DO_DV&Gnjz7)3V z|I1K#f^!|eWwfr*kGV`oraHa;i#t*KN3SMW=mZxeK{B`@1yW%!q=5(0!3#d{LjZ!H zjS+${L?8;8Fa(CeFc=P(!3ek30W)D1+y%4Y zZukYvfqS43ir`+D3-`hOFc0R#15gYL;Fquv9)yQr5tKkFl)+*shhM=GsDOvz5qK0H zgU8_scoKdMl~4swK{Y%L&%keBDb&Dk;dihMo`vUNIn=@mSP83OHN;^JtcB-+!SCS( zcoFL0C0GaRp&lAw1H23y;SaD0HbW!)5t`r?coklQKS48Wffjfj-hc$W30q+s5WEH3 z;ceIf@4!xY7j{7_?1uN?efR+Oz+U(eK7xJlXV?!1pbb8TgU}9tfe!ctK84TVb2tQF zKqvea{sxEPOE>~ua1@Tg-{Cm?1O5r!@Gm$4|Azm-SMW9b7kZ!<`rssd1K+~`;1qlZ Xr{VwbJ^TP?;4GYj^As%X-<|U#14ig<