-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathtopics.html
More file actions
892 lines (755 loc) · 34.1 KB
/
topics.html
File metadata and controls
892 lines (755 loc) · 34.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Upcoming topics</title>
<meta name="description" content="The ZipCPU blog, featuring how to discussions of FPGA and soft-core CPU design. This site will be focused on Verilog solutions, using exclusively OpenSource IP products for FPGA design. Particular focus areas include topics often left out of more mainstream FPGA design courses such as how to debug an FPGA design.
">
<link rel="shortcut icon" type="image/x-icon" href="/img/GT.ico">
<link rel="stylesheet" href="/css/main.css">
<link rel="canonical" href="https://zipcpu.com/topics.html">
<link rel="alternate" type="application/rss+xml" title="The ZipCPU by Gisselquist Technology" href="https://zipcpu.com/feed.xml">
</head>
<body>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-4ZK7HKHSVW"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-4ZK7HKHSVW');
</script>
<header class="site-header">
<div id="banner">
<a href="/"><picture>
<img height=120 id="site-logo" src="/img/fullgqtech.png" alt="Gisselquist Technology, LLC">
</picture></A>
</div>
<div class="site-nav">
<ul>
<li><a HREF="/">Main/Blog</a>
<li><a HREF="/about/">About Us</a>
<li><a HREF="/fpga-hell.html">FPGA Hell</a>
<li><a HREF="/tutorial/">Tutorial</a>
<li><a HREF="/tutorial/formal.html">Formal training</a>
<li><a HREF="/quiz/quizzes.html">Quizzes</a>
<li><a HREF="/projects.html">Projects</a>
<li>Site Topics
<HR>
<li><a href="https://twitter.com/zipcpu"><span class="icon--twitter"><svg viewBox="0 0 400 400"><path fill="#1da1f2" d="M153.62,301.59c94.34,0,145.94-78.16,145.94-145.94,0-2.22,0-4.43-.15-6.63A104.36,104.36,0,0,0,325,122.47a102.38,102.38,0,0,1-29.46,8.07,51.47,51.47,0,0,0,22.55-28.37,102.79,102.79,0,0,1-32.57,12.45,51.34,51.34,0,0,0-87.41,46.78A145.62,145.62,0,0,1,92.4,107.81a51.33,51.33,0,0,0,15.88,68.47A50.91,50.91,0,0,1,85,169.86c0,.21,0,.43,0,.65a51.31,51.31,0,0,0,41.15,50.28,51.21,51.21,0,0,1-23.16.88,51.35,51.35,0,0,0,47.92,35.62,102.92,102.92,0,0,1-63.7,22A104.41,104.41,0,0,1,75,278.55a145.21,145.21,0,0,0,78.62,23"/></svg>
</span><span class="username">@zipcpu</span></a>
<li><a href="https://www.reddit.com/r/ZipCPU"><span class="username">Reddit</a>
<li><a HREF="https://www.patreon.com/ZipCPU"><IMG SRC="/img/patreon_logomark_color_on_white.png" WIDTH="25"> Support</a>
</ul>
</div>
</header>
<div class="page-content">
<div class="wrapper">
<h1 id="blog-topics">Blog Topics</h1>
<p>The below list of topics includes both those things that I’ve already blogged
about and some of those things I’d still like to blog about. Those with
links are things I’ve blogged about.</p>
<p>If you are starting out with an FPGA design from scratch, then I’d like to
recommend some quick resources for you. First, you’ll want to read my
<a href="/blog/2017/08/21/rules-for-newbies.html">Rules for new FPGA designers</a>. After that, let me invite you to try out my
<a href="/tutorial">beginner’s tutorial</a>. The
<a href="/tutorial/intermediate.html">intermediate tutorial</a> is a
work in progress as I write this. You might wish to check it to see how
far I’ve gotten with it. Perhaps what’s there will be valuable for you
anyway.</p>
<h2 id="how-to-debug-an-fpga">How to Debug an FPGA</h2>
<p>If you are coming to the FPGA world from the big software world, you will
find that FPGAs can be very difficult to debug. In this series, we’ll work
through how to debug FPGAs, from blinky to a networked debugging controller.</p>
<ul>
<li>
<p>We already started with <a href="/blog/2017/05/19/blinky.html">blinky</a>, and how
<a href="/blog/2017/05/19/blinky.html">blinky</a> can be used to debug an FPGA</p>
</li>
<li>
<p><a href="/blog/2018/08/22/what-is-simulation.html">What is simulation</a>?
This is something you <em>need</em> to learn very early on to be successful.</p>
</li>
<li>
<p>A <a href="/blog/2017/05/22/a-vision-for-controlling-fpgas.html">Vision for controlling (and debugging) an FPGA</a>, to outline where we wish to go</p>
</li>
<li>
<p><a href="/blog/2017/05/24/serial-port.html">Getting that first UART working</a>
– I returned to discuss my serial port later, in <a href="/formal/2019/02/21/txuart.html">Using Sequence Properties to Verify a Serial Port Transmitter</a></p>
</li>
<li>
<p><a href="/blog/2017/05/26/simpledbg.html">Debugging by simple bus address</a>, i.e. requesting and then reading values
from a bus telling you what things are doing now. This includes discussing
CE</p>
</li>
<li>
<p>An example discussing <a href="/digilent/2017/05/29/fft-debugging.html">how to debug an FFT</a>. This also presents a method for “single-stepping” an FPGA that I find very powerful when debugging.</p>
<ul>
<li>I later came back to the topic of an FFT, presenting <a href="/dsp/2018/10/02/fft.html">how I formally verified the FFT itself</a>. I then came back again to discuss how you might <a href="/dsp/2020/04/20/axil2axis.html">debug an AXI Streams</a> such as the FFT’s input in general.</li>
</ul>
</li>
<li>
<p>Building a <a href="https://github.com/ZipCPU/dbgbus">debug control interface</a></p>
<ul>
<li>
<p>An <a href="/blog/2017/06/05/wb-bridge-overview.html">overview of an example UART-wishbone
bridge</a> built
for debugging purposes</p>
</li>
<li>
<p>How to <a href="/blog/2017/06/14/creating-words-from-bytes.html">build command words for our debuging wishbone
interface</a></p>
</li>
<li>
<p>A <a href="/blog/2017/06/08/simple-wb-master.html">simple wishbone bus
master</a></p>
</li>
<li>
<p>How to <a href="/blog/2017/06/15/words-back-to-bytes.html">turn responses from the wishbone bus into an output serial
stream</a></p>
</li>
<li>
<p>Adding <a href="/blog/2017/06/16/adding-ints.html">interrupt support</a> to the debug port</p>
</li>
<li>
<p><a href="/blog/2017/06/19/debug-idles.html">Adding a debug port idle indicator</a>, so that we can tell this is a valid
debug port</p>
</li>
<li>
<p><a href="/blog/2017/06/20/dbg-put-together.html">Connecting stream components together</a></p>
</li>
<li>
<p>A <a href="/blog/2017/06/22/simple-wb-interconnect.html">simple wishbone interconnect</a></p>
</li>
<li>
<p>How to <a href="/blog/2017/06/26/dbgbus-verilator.html">set up a test
bench</a>
to prove this works</p>
</li>
<li>
<p>An <a href="/blog/2017/06/16/dbg-bus-forest.html">outline of how the software controller will work</a></p>
</li>
<li>
<p><a href="/blog/2017/06/29/sw-dbg-interface.html">How to build a software controller</a> for the debug interface</p>
</li>
<li>
<p>How to <a href="/blog/2017/07/08/getting-started-with-wbscope.html">get started with a wishbone scope</a>, using our example design to read
internals of our logic and to write out
a <a href="https://en.wikipedia.org/wiki/Value_change_dump">VCD file</a> that we
can later examine.</p>
</li>
</ul>
</li>
<li>
<p>How to place a logic analyzer within your design, and to get the most
use out of it</p>
<p>o An <a href="/blog/2017/06/08/simple-scope.html">description</a>
of how to build a <a href="https://github.com/ZipCPU/wbscope">bus-based scope</a></p>
<p>o <a href="/blog/2017/07/31/vcd.html">How to write your own</a> <a href="https://en.wikipedia.org/wiki/Value_change_dump">VCD
file</a> so that you can
see the results of your own scope within
<a href="http://gtkwave.sourceforge.net">GTKwave</a></p>
</li>
<li>
<p><a href="/blog/2017/08/09/series-debouncing.html">Contact Bounces</a>:
A short series starting with a presentation of contact bouncing, and ending
with an example design that can measure (and mitigate) bounces.</p>
</li>
<li>
<p>Getting rid of the umbilical: moving your debugging channel to TCP/IP</p>
</li>
</ul>
<h2 id="open-source-fpga-tools">Open Source FPGA Tools</h2>
<ul>
<li>
<p><a href="/blog/2017/06/21/looking-at-verilator.html">Looking at Verilator</a></p>
<ul>
<li>
<p><a href="/blog/2017/07/17/debugging-dbgbus.html">Verilator doesn’t find everything (today)</a></p>
</li>
<li>
<p><a href="/blog/2018/09/06/tbclock.html">Using Verilator in a multi-clock environment</a></p>
</li>
</ul>
</li>
<li>
<p><a href="/blog/2017/10/19/formal-intro.html">yosys-smtbmc, and the formal methods it allows</a></p>
<ul>
<li>
<p><a href="/blog/2018/03/14/is-formal-hard.html">Are formal methods really all that hard?</a></p>
</li>
<li>
<p><a href="/blog/2018/03/10/induction-exercise.html">An Exercise in Formal Induction</a></p>
</li>
<li>
<p><a href="/formal/2018/07/14/dev-cycle.html">What does formal development look like in practice?</a></p>
</li>
<li>
<p><a href="/formal/2018/05/31/clkswitch.html">How to Formally Describe and Verify an Asynchronous Design: a clock switch</a></p>
</li>
<li>
<p><a href="/blog/2018/04/02/formal-cpu-bugs.html">Will Formal methods ever find a bug in a “working” CPU: the ZipCPU?</a></p>
</li>
<li>
<p><a href="/formal/2018/04/23/invariant.html">Using Invariants in Formal Verification</a>.</p>
<p>This article is now <em>deprecated</em>. The method described within is known
to passing broken designs. See <a href="/formal/2018/12/18/skynet.html">Swapping assumptions and assertions doesn’t work</a> for more info on that.</p>
</li>
<li>
<p><a href="/zipcpu/2018/07/13/memories.html">Formally verifying components with memory</a>. While the example in this article cover’s the formal verification of a block RAM, the properties discussed apply to any memory-type controller</p>
</li>
<li>
<p><a href="/formal/2018/09/08/hw-failure.html">My design works in simulation, but not in hardware. Can formal methods help me?</a></p>
</li>
<li>
<p>The problem with a test bench approach to formal methods</p>
</li>
</ul>
</li>
<li>
<p><a href="/zipcpu/2018/12/20/sby-makefile.html">Makefiles for formal proofs with SymbiYosys</a></p>
<p>Since writing this article, the format I was using to control parameters
within my design from the SymbiYosys script. The best way to do that now is
with Python code insertion into the SymbiYosys file. You can find an
example of that with the <a href="https://github.com/ZipCPU/zipcpu/blob/master/bench/formal/zipcpu.sby">ZipCPU’s SymbiYosys script</a>.</p>
</li>
<li>
<p><a href="/blog/2018/11/29/llvga.html">Using an open source VGA simulator</a></p>
</li>
<li>
<p><a href="/formal/2019/08/03/proof-duration.html">Just how long does a formal proof take to finish</a>?</p>
</li>
<li>
<p><a href="/formal/2019/10/05/formal-enough.html">Is formal verification enough, or is simulation required</a>?</p>
</li>
</ul>
<h2 id="basic-fpga-design">Basic FPGA Design</h2>
<ul>
<li>
<p>The <a href="/blog/2017/06/02/design-process.html">real FPGA design process</a>, and the <a href="/blog/2017/06/10/lost-college-student.html">student’s response</a></p>
</li>
<li>
<p><a href="/digilent/2017/05/18/cannot-be-done.html">It cannot be done</a></p>
</li>
<li>
<p><a href="/blog/2017/05/20/knight-rider.html">Knight Rider LEDs</a></p>
</li>
<li>
<p><a href="/blog/2017/06/02/generating-timing.html">Generating Timing</a></p>
</li>
<li>
<p><a href="/blog/2017/06/12/minimizing-luts.html">Minimizing LUTs</a></p>
</li>
<li>
<p><a href="/blog/2017/08/14/strategies-for-pipelining.html">Strategies for Pipelining logic within an FPGA</a></p>
</li>
<li>
<p>How to handle pipeline scheduling</p>
</li>
<li>
<p>How to design a state machine</p>
<p>This is handled in the <a href="/tutorial">tutorial</a>, lesson 3.</p>
</li>
<li>
<p><a href="/blog/2019/04/24/pl-pmodamp2.html">Project Ideas: the PMod AMP2</a></p>
</li>
<li>
<p><a href="/blog/2017/10/20/cdc.html">Handling clock domain crossings</a></p>
<ul>
<li>
<p><a href="/formal/2018/04/12/areset.html">Formally verifying the synchronizer for an asynchronous reset</a></p>
</li>
<li>
<p><a href="/blog/2018/07/06/afifo.html">Using a FIFO to pass data from one clock domain to another</a></p>
</li>
</ul>
</li>
<li>
<p><a href="/blog/2018/08/04/sim-mismatch.html">Reasons why Synthesis might not match Simulation</a></p>
</li>
<li>
<p><a href="/blog/2017/08/21/rules-for-newbies.html">Rules for new FPGA designers</a></p>
</li>
<li>
<p><a href="/blog/2019/06/28/genclk.html">Breaking all the rules to create an arbitrary clock signal</a></p>
</li>
<li>
<p><a href="/blog/2020/01/13/reuse.html">Lessons in Hardware Reuse</a></p>
</li>
</ul>
<h2 id="how-to-build-and-debug-a-softcore-cpu">How to Build and Debug a Softcore CPU</h2>
<ul>
<li>
<p><a href="/formal/2019/11/18/genuctrlr.html">Building and formally verifying a general purpose ultra-micro controller</a></p>
</li>
<li>
<p>How to debug a CPU core for an FPGA</p>
<ul>
<li>
<p><a href="/zipcpu/2017/05/20/which-came-first.html">Which came first: the CPU or the peripherals?</a></p>
</li>
<li>
<p>Thinking about the <a href="/zipcpu/2017/07/14/cpu-debugging-needs.html">debug capabilities you will
need</a>,
before you build</p>
</li>
<li>
<p><a href="/zipcpu/2017/07/26/cpu-sim-debugger.html">Debugging your CPU using Verilator</a></p>
</li>
<li>
<p><a href="/zipcpu/2017/08/11/simple-alu.html">The structure of a simple ALU</a></p>
</li>
<li>
<p><a href="/zipcpu/2017/11/18/wb-prefetch.html">The first ZipCPU prefetch</a></p>
</li>
<li>
<p><a href="/zipcpu/2017/08/23/cpu-pipeline.html">How the ZipCPU handles its pipeline logic</a></p>
</li>
<li>
<p><a href="/zipcpu/2017/12/28/ugliest-bug.html">Mystery post: The ugliest bug I’ve ever encountered</a></p>
</li>
<li>
<p><a href="/blog/2018/01/22/formal-progress.html">Updating ZipCPU files</a></p>
</li>
<li>
<p><a href="/zipcpu/2018/01/31/cpu-build.html">Building the ZipCPU toolchain, and demonstrating its pipeline</a></p>
<p>Besides building the toolchain, this post offers a fun way to view how
the logic moves its way through the ZipCPU as a result of the three
separate ZipCPU prefetch modules.</p>
</li>
<li>
<p><a href="/zipcpu/2018/02/12/zbasic-intro.html">Building and using an example ZipCPU demonstration design:
ZBasic</a></p>
<p>This discussion also includes a demonstration of what it takes to run
<a href="https://github.com/ZipCPU/tttt">4x4x4 Tic-Tac-Toe</a> on the
<a href="https://github.com/ZipCPU/zbasic">ZBasic</a> architecture.</p>
</li>
<li>
<p><a href="/zipcpu/2017/08/25/hw-debugging.html">Debugging your CPU while on the FPGA</a></p>
<p>Here, we discuss how the <a href="https://github.com/ZipCPU/zipcpu">ZipCPU</a>
can be halted, stepped, and even reset from the debugging bus.</p>
</li>
<li>
<p><a href="/zipcpu/2018/03/21/dblfetch.html">Building a compromise prefetch module</a> – one that isn’t as light on logic as the <a href="/zipcpu/2017/11/18/wb-prefetch.html">basic prefetch</a>, but yet offers more performance than the <a href="https://github.com/ZipCPU/zipcpu/blob/master/rtl/core/pfcache.v">prefetch and cache module</a>.</p>
</li>
<li>
<p>Building Formally Verifying an Instruction Cache</p>
</li>
<li>
<p><a href="/zipcpu/2019/04/02/icontrol.html">The ZipCPU’s interrupt controller</a></p>
</li>
<li>
<p>Profiling your CPU using Verilator</p>
<p>This will be about how I was able to measure, and optimize, <em>every</em>
clock used by <a href="/about/zipcpu.html">my CPU</a>
(as implemented on the
<a href="https://github.com/ZipCPU/xulalx25soc">XuLA2-LX25</a> when running the
<a href="https://en.wikipedia.org/wiki/Dhrystone">Dhrystone benchmark</a>.</p>
</li>
<li>
<p>Debugging your CPU using a wishbone scope, when you have no debugging
bus to work with</p>
</li>
<li>
<p><a href="/zipcpu/2021/07/03/slowmpy.html">Building a better Verilog Multiply for the ZipCPU</a></p>
</li>
</ul>
</li>
<li>
<p>How to debug the <a href="https://github.com/ZipCPU/zipcpu">ZipCPU</a> when running
the ZipOS found on the <a href="https://github.com/ZipCPU/s6soc">S6SoC</a></p>
<p>o How a <em>really simple</em> Operating System works.</p>
</li>
<li>
<p><a href="/zipcpu/2019/02/09/cpu-blinky.html">Why does blinky make a CPU appear to be so slow</a>?</p>
</li>
<li>
<p><a href="/zipcpu/2019/11/23/multithreaded-blinky.html">The ZipCPU meet blinky</a> discussing how to run blinky across multiple threads</p>
</li>
</ul>
<h2 id="wishbone-bus">Wishbone Bus</h2>
<ul>
<li>
<p><a href="/digilent/2017/05/22/moving-to-memory.html">Moving to Memory</a>, outlining why a bus is necessary</p>
</li>
<li>
<p>Building a <a href="/zipcpu/2017/05/23/simplebus.html">very simple bus</a>, as a basis for building more complex bus structures</p>
</li>
<li>
<p>How to build a <a href="/zipcpu/2017/05/29/simple-wishbone.html">Simple Wishbone Bus Slave</a></p>
<p>– <a href="/zipcpu/2018/04/17/ziptimer.html">An example of a simple timer peripheral</a></p>
<p>– <a href="/blog/2018/08/16/spiflash.html">An example of a flash memory controller</a>, and it’s <a href="/blog/2019/03/27/qflexpress.html">big brother, the QSPI flash controller</a></p>
</li>
<li>
<p>The <a href="/zipcpu/2017/05/29/select-lines.html">Wishbone Bus Select Lines</a></p>
</li>
<li>
<p>A <a href="/blog/2017/06/08/simple-wb-master.html">simple wishbone bus master</a></p>
</li>
<li>
<p>A pipeline (input) aware wishbone bus master</p>
</li>
<li>
<p><a href="/zipcpu/2017/11/07/wb-formal.html">Formally proving that a wishbone master conforms to the standard</a></p>
</li>
<li>
<p>Building a DMA bus master</p>
</li>
</ul>
<h2 id="avalon-bus">Avalon Bus</h2>
<ul>
<li>Formal properties of an Avalon bus component</li>
</ul>
<h2 id="axi-bus">AXI Bus</h2>
<ul>
<li>
<p><a href="/formal/2018/12/28/axilite.html">Using a formal property file to verify an AXI-lite peripheral</a></p>
</li>
<li>
<p><a href="/blog/2019/01/12/demoaxilite.html">Buildng a custom yet functional AXI-lite slave</a></p>
</li>
<li>
<p><a href="/formal/2019/04/16/axi-mistakes.html">The most common AXI mistake</a></p>
</li>
<li>
<p><a href="/blog/2019/04/27/axi-addr.html">Understanding AXI addressing</a></p>
</li>
<li>
<p><a href="/formal/2019/05/13/axifull.html">Examining Xilinx’s AXI demonstration core</a></p>
</li>
<li>
<p><a href="/blog/2019/05/22/skidbuffer.html">Building a Skid Buffer for AXI Processing</a></p>
</li>
<li>
<p><a href="/blog/2019/05/29/demoaxi.html">Building the perfect AXI4 slave</a></p>
</li>
<li>
<p><a href="/blog/2019/08/20/lego-design.html">Xilinx deleted this post</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/08/30/subbus.html">Connecting lots of slaves to a bus without using a lot of logic</a></p>
</li>
<li>
<p><a href="/formal/2019/09/06/axi-story.html">AXI Verification, the story so far</a></p>
</li>
<li>
<p><a href="/blog/2020/01/01/2019-in-review.html">2019: AXI Meets Formal Verification</a></p>
</li>
<li>
<p><a href="/blog/2020/03/08/easyaxil.html">Building an AXI-Lite slave the easy way</a></p>
</li>
<li>
<p><a href="/blog/2020/03/14/axi-reset.html">Locally resetting an AXI component</a></p>
</li>
<li>
<p><a href="/blog/2020/03/23/wbm2axisp.html">Building a basic AXI Master</a></p>
</li>
<li>
<p><a href="/dsp/2020/04/20/axil2axis.html">Debugging AXI Streams</a></p>
</li>
<li>
<p><a href="/blog/2020/06/16/axiaddr-limits.html">The hard part of building a bursting AXI master</a></p>
</li>
<li>
<p><a href="/blog/2020/08/31/run-length-encoding.html">Run length encoding with an AXI stream</a></p>
</li>
<li>
<p><a href="/blog/2020/12/19/axil-register-checking.html">Formally verifying register handling</a></p>
</li>
<li>
<p><a href="/blog/2021/03/20/xilinx-forums.html">Common AXI Theme’s on Xilinx’s Forum</a></p>
</li>
<li>
<p><a href="/zipcpu/2021/04/17/axilops.html">Building a Simple AXI-lite Memory Controller</a> for the ZipCPU</p>
</li>
<li>
<p><a href="/blog/2021/05/22/vhdlaxil.html">Examining Xilinx’s AXI-lite Slave Design in VHDL</a></p>
</li>
<li>
<p><a href="/blog/2021/06/28/master-examples.html">Examples of AXI4 bus masters</a></p>
</li>
<li>
<p><a href="/blog/2021/08/14/axiperf.html">Measuring AXI latency and throughput performance</a></p>
</li>
<li>
<p><a href="/blog/2021/08/28/axi-rules.html">AXI Handshaking Rules</a></p>
</li>
<li>
<p><a href="/zipcpu/2021/09/30/axiops.html">Upgrading the ZipCPU’s memory unit from AXI4-lite to AXI4</a></p>
</li>
<li>
<p><a href="/blog/2021/12/30/dbgaxil.html">Creating a simple AXI-Lite Master for the Hexbus</a></p>
</li>
</ul>
<h2 id="interconnects">Interconnects</h2>
<ul>
<li>
<p><a href="/zipcpu/2017/10/05/autofpga-intro.html">AutoFPGA – a component aggregator</a></p>
</li>
<li>
<p><a href="/zipcpu/2017/10/06/autofpga-dataword.html">Connecting a single-clock access component</a></p>
</li>
<li>
<p><a href="/zipcpu/2018/12/22/autofpga-ld.html">AutoFPGA’s linker script support gets an update</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/03/28/return-decoding.html">Logic usage and decoding return results with cascaded multiplexers</a></p>
</li>
<li>
<p><a href="/blog/2019/07/17/crossbar.html">Lessons learned while building crossbar interconnects</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/08/22/tech-debt.html">Technology Debt and AutoFPGA, the bill just came due</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/09/03/address-assignment.html">Understanding AutoFPGA’s address assignment algorithm</a></p>
</li>
<li>
<p><a href="/formal/2020/05/16/firewall.html">Building a Protocol Firewall</a></p>
</li>
</ul>
<h2 id="soc--fpga-architecture">SoC + FPGA Architecture</h2>
<ul>
<li>
<p><a href="/blog/2018/11/03/soc-fpga.html">How to interact with an FPGA from a CPU</a></p>
</li>
<li>
<p>Connecting a more generic component (ex flash, or SDRAM)</p>
</li>
</ul>
<h2 id="cpu-design-topics">CPU design topics</h2>
<ul>
<li>
<p><a href="/zipcpu/2018/01/01/zipcpu-isa.html">An overview of the ZipCPU instruction set</a></p>
</li>
<li>
<p>How to build a back-end for <a href="https://gcc.gnu.org">GCC</a> and/or
<a href="https://www.gnu.org/s/binutils/">binutils</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/02/04/debugging-that-cpu.html">Debugging a CPU</a></p>
</li>
<li>
<p><a href="/blog/2019/11/14/sdspi.html">Putting the pieces together to build a data recorder</a></p>
</li>
<li>
<p>How to build a back-end for your soft-core using
<a href="https://www.gnu.org/s/gdb/">GDB</a></p>
</li>
</ul>
<h2 id="dsp-topics"><a href="/dsp/dsp.html">DSP Topics</a></h2>
<ul>
<li>
<p><a href="/dsp/2017/09/27/quantization.html">Quantization error analysis</a></p>
</li>
<li>
<p><a href="/dsp/2017/06/15/no-pi-for-you.html">Representing angles within an FPGA</a></p>
</li>
<li>
<p><a href="/dsp/2017/07/24/dsp-debugging.html">Debugging DSP algorithms</a></p>
<p>o <a href="/dsp/2019/12/21/histogram.html">A basic histogram implementation</a>, and then <a href="/dsp/2020/02/07/bad-histogram.html">what happened when I went to use it</a></p>
</li>
<li>
<p>Interpolation</p>
<p>o <a href="/dsp/2017/06/06/simple-interpolator.html">Nearest Neighbour</a></p>
<p>o <a href="/dsp/2017/07/29/series-linear-interpolation.html">Series: How to build a Linear Interpolator</a></p>
<p>o <a href="/dsp/2018/01/16/interpolation-is-convolution.html">Interpolation is just convolution</a></p>
<p>o <a href="/dsp/2018/03/30/quadratic.html">Quadratic interpolator</a></p>
<p>o A filter based upsampling interpolation method</p>
<p>o Polynomial Interpolation a.la Harris</p>
<p>o Why splines are entirely <em>inappropriate</em> for real-time DSP</p>
</li>
<li>
<p>CIC Filters</p>
<p>o CIC upsampler</p>
<p>o CIC downsampler</p>
</li>
<li>
<p>Sine, Cosine, and Arctangent calculation</p>
<p>o <a href="/dsp/2017/07/11/simplest-sinewave-generator.html">Table based sin/cos generation</a></p>
<p>o <a href="/dsp/2017/08/26/quarterwave.html">Quarter wave table based sin/cos generation</a></p>
<p>o What is a <a href="http://www.andraka.com/files/crdcsrvy.pdf">CORDIC</a>, and how do I use it?</p>
<ul>
<li>
<p><a href="/dsp/2017/08/30/cordic.html">Generating Sin/Cos using a CORDIC</a></p>
</li>
<li>
<p>Using a CORDIC as a <a href="/dsp/2017/09/01/topolar.html">phase measuring device</a></p>
</li>
<li>
<p>The basic <a href="/dsp/2017/10/02/cordic-tb.html">CORDIC test-bench</a></p>
</li>
<li>
<p><a href="/dsp/2017/12/09/nco.html">Basic logic design of a numerically controlled oscillator</a></p>
</li>
<li>
<p>Downconverting an incoming signal using a CORDIC</p>
</li>
<li>
<p>Generating AM, FM, and QAM types of signals using the CORDIC</p>
</li>
</ul>
<p>o A quadratic table based sin/cos generator, optimized for reduced phase
noise and reduced spur energy. This requires two multiplies, and so it
improves performance over the
<a href="/dsp/2017/08/30/cordic.html">CORDIC approach</a></p>
</li>
<li>
<p>Some general topics on Filtering</p>
<p>o High speed filtering. These filters will run at your system clock speed,
or not at all.</p>
<ul>
<li>
<p><a href="/dsp/2017/08/19/simple-filter.html">A pair of very simple digital filters</a></p>
</li>
<li>
<p>The <a href="/dsp/2017/10/16/boxcar.html">Moving average</a> filter</p>
</li>
<li>
<p><a href="/dsp/2017/09/15/fastfir.html">High speed FIR implementation</a></p>
<ul>
<li><a href="/dsp/2017/09/29/cheaper-fast-fir.html">An improved high-speed implementation</a></li>
</ul>
</li>
<li>
<p>High speed <em>symmetric</em> FIR implementation</p>
</li>
<li>
<p>Halfband FIR implementation</p>
</li>
<li>
<p>Hilbert Transform</p>
</li>
</ul>
<p>o Low-speed filtering. These filters run N times slower than your system
clock speed. They are more efficient, if you can use them.</p>
<ul>
<li>
<p>In general, these will be the same filters as their high speed
counterparts.</p>
</li>
<li>
<p><a href="/dsp/2017/12/30/slowfil.html">A Generic (slow) FIR filter</a>.</p>
</li>
<li>
<p>A cascaded slow FIR filter. This article will present an approach
that allows you to cascade filter blocks together in order to implement
a longer filter.</p>
</li>
<li>
<p><a href="/dsp/2018/05/17/slowsymf.html">A symmetric slow FIR filter</a>.
This article modifies the <a href="/dsp/2017/12/30/slowfil.html">generic (slow) FIR
filter</a>,
in order to optimize it to exploit the linear phase relationship within
it. This article goes through the background of why a symmetric filter
is, as well as why such an implementation is superior to the generic one.</p>
</li>
</ul>
<p>o <a href="/dsp/2017/11/10/delayw.html">Building a delay</a></p>
<p>o Estimating a filter’s cost</p>
</li>
<li>
<p>Multi-rate signal processing</p>
<p>o Implementing a <a href="/dsp/2020/07/28/down-sampler.html">downsampler and filter</a></p>
</li>
<li>
<p>How to test a digital filter</p>
<p>o <a href="/dsp/2017/09/04/pwm-reinvention.html">Improved PWM: How to generating a cheap audio signal from an I/O pin</a></p>
<p>o <a href="/dsp/2017/09/16/pwm-demo.html">Testing the improved PWM signal</a></p>
<p>o <a href="/dsp/2017/11/04/genfil-tb.html">Building a generic filtering test harness</a></p>
<ul>
<li>
<p><a href="/dsp/2017/11/22/fltr-response.html">Evaluating the filter’s frequency response</a></p>
</li>
<li>
<p><a href="/dsp/2017/12/06/fastfir-tb.html">Testing a generic filter using the test harness</a></p>
</li>
</ul>
<p>o Finding IIR limit cycles</p>
</li>
<li>
<p><a href="/dsp/2017/10/27/lfsr.html">Generating a pseudorandom noise sequence</a></p>
<p>o <a href="/dsp/2017/11/11/lfsr-example.html">An Exampe LFSR</a></p>
<p>o <a href="/dsp/2017/11/13/lfsr-multi.html">Getting many bits per clock from an LFSR</a></p>
</li>
<li>
<p>Digital PLL design</p>
<p>o <a href="/dsp/2017/12/14/logic-pll.html">A logic PLL, running at the system clock rate</a></p>
<p>o <a href="/dsp/2020/03/12/quadpll.html">Adjusting our logic PLL to handle I+Q</a></p>
<p>o PLLs with better (CORDIC-based) phase estimators</p>
<p>o Using a PLL together with a FIFO, for asynchronous sample rate conversion</p>
</li>
<li>
<p>FFT and other spectral estimation topics</p>
<p>o <a href="/dsp/2020/03/17/cheap-spectra.html">Cheap spectral estimation</a></p>
<p>o <a href="/dsp/2018/10/02/fft.html">An Open Source Pipelined FFT</a></p>
<p>o <a href="/dsp/2020/11/21/spectrogram.html">Implementing a pre-FFT window function</a></p>
<p>o Building a scrolling raster framebuffer</p>
<p>o Color mapping the FFT’s results to the framebuffer</p>
<p>o Maximally resolved FFT window functions</p>
<p>o Optimizing the window function for high spectral resolution</p>
</li>
<li>
<p>Discrete Fourier Transform Filter Banks. (<a href="/dsp/freq-teaser.html">Teaser</a>)</p>
</li>
</ul>
<h2 id="hardware-reviews">Hardware reviews</h2>
<p>The ZipCPU blog isn’t really about hardware reviews. That said, there have
been several posts I’ve written that have highlighted one piece of hardware or
another, so it’s worth listing them specially here.</p>
<ul>
<li>
<p><a href="/blog/2017/09/14/even-i-get-stuck.html">Digilent’s Digital Discovery</a></p>
</li>
<li>
<p><a href="/blog/2017/12/16/max1k.html">Arrow’s Max-1000: A gem for all the wrong reasons</a></p>
</li>
<li>
<p><a href="/formal/2018/07/21/zipcpu-icoboard.html">Why I like formal: The ZipCPU and the ICO board</a></p>
</li>
<li>
<p><a href="/blog/2018/10/05/tinyfpga.html">The TinyFPGA</a></p>
</li>
<li>
<p><a href="/blog/2018/02/09/first-cyclonev.html">Debugging a Cyclone-V</a></p>
</li>
<li>
<p><a href="/zipcpu/2019/03/12/arrowzip.html">Introducing the ArrowZip ZipCPU design, featuring the Max-1000</a></p>
</li>
</ul>
</div>
</div>
<footer class="site-footer">
<div class="wrapper">
<h2 class="footer-heading">The ZipCPU by Gisselquist Technology</h2>
<div class="footer-col-wrapper">
<div class="footer-col footer-col-1">
<ul class="contact-list">
<!-- <li></li> -->
<li><a href="mailto:zipcpu@gmail.com">zipcpu@gmail.com</a></li>
</ul>
</div>
<div class="footer-col footer-col-2">
<ul class="soc-medlist">
<li>
<a href="https://github.com/ZipCPU"><span class="icon icon--github"><svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
</span><span class="username">ZipCPU</span></a>
</li>
<li>
<a href="https://twitter.com/zipcpu"><span class="icon icon--twitter"><svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
</span><span class="username">@zipcpu</span></a>
</li>
<li><A href="https://www.patreon.com/ZipCPU"><img src="/img/become_a_patron_button.png"></a></li>
</ul>
</div>
<div class="footer-col footer-col-3">
<p>The ZipCPU blog, featuring how to discussions of FPGA and soft-core CPU design. This site will be focused on Verilog solutions, using exclusively OpenSource IP products for FPGA design. Particular focus areas include topics often left out of more mainstream FPGA design courses such as how to debug an FPGA design.
</p>
</div>
</div>
</div>
</footer>
</body>
</html>