diff options
author | jjsuperpower <jjs29356@gmail.com> | 2022-08-07 10:37:24 -0500 |
---|---|---|
committer | jjsuperpower <jjs29356@gmail.com> | 2022-08-07 10:37:24 -0500 |
commit | 965821b9bcf018173e0a60f49382568724a5b589 (patch) | |
tree | c45af4815e8016ac6d75d4defd2971bad9c1c069 | |
parent | b80ae3d4aa133ee170b06719d970f6c66767a709 (diff) |
basic shift register working
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | .vscode/configurationCache.log | 1 | ||||
-rw-r--r-- | .vscode/dryrun.log | 6 | ||||
-rw-r--r-- | .vscode/launch.json | 16 | ||||
-rw-r--r-- | .vscode/settings.json | 3 | ||||
-rw-r--r-- | .vscode/targets.log | 371 | ||||
-rw-r--r-- | hdl/testing/shift_reg.py | 100 | ||||
-rw-r--r-- | hdl/testing/up_counter.py | 50 | ||||
-rw-r--r-- | hdl/testing/up_counter_tb.py | 30 | ||||
-rw-r--r-- | requirements.txt | 1 |
10 files changed, 585 insertions, 2 deletions
@@ -1,4 +1,9 @@ *.pdf -.vscode/ -env/ +.venv __pycache__/ +*quartus +*.v +*.vcd +*.cc +*.bak +*.pytest_cache
\ No newline at end of file diff --git a/.vscode/configurationCache.log b/.vscode/configurationCache.log new file mode 100644 index 0000000..bab9054 --- /dev/null +++ b/.vscode/configurationCache.log @@ -0,0 +1 @@ +{"buildTargets":[],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}}
\ No newline at end of file diff --git a/.vscode/dryrun.log b/.vscode/dryrun.log new file mode 100644 index 0000000..e3eafb1 --- /dev/null +++ b/.vscode/dryrun.log @@ -0,0 +1,6 @@ +make --dry-run --always-make --keep-going --print-directory +make: Entering directory '/home/jon/github/ASAP32' +make: Leaving directory '/home/jon/github/ASAP32' + +make: *** No targets specified and no makefile found. Stop. + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..306f58e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": true + } + ] +}
\ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..65e1ec0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "makefile.extensionOutputFolder": "./.vscode" +}
\ No newline at end of file diff --git a/.vscode/targets.log b/.vscode/targets.log new file mode 100644 index 0000000..5f84ce2 --- /dev/null +++ b/.vscode/targets.log @@ -0,0 +1,371 @@ +make all --print-data-base --no-builtin-variables --no-builtin-rules --question +# GNU Make 4.3 +# Built for x86_64-suse-linux-gnu +# Copyright (C) 1988-2020 Free Software Foundation, Inc. +# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> +# This is free software: you are free to change and redistribute it. +# There is NO WARRANTY, to the extent permitted by law. + +# Make data base, printed on Thu Aug 4 22:49:23 2022 + +# Variables + +# environment +JAVA_HOME = /usr/lib64/jvm/java +# environment +QEMU_AUDIO_DRV = pa +# environment +GDK_BACKEND = x11 +# environment +LC_ALL = C +# environment +NO_AT_BRIDGE = 1 +# environment +GTK_RC_FILES = /etc/gtk/gtkrc:/home/jon/.gtkrc:/home/jon/.config/gtkrc +# environment +WINDOWMANAGER = /usr/bin/startplasma-x11 +# environment +VSCODE_CWD = /home/jon/github +# environment +GPG_TTY = not a tty +# environment +MACHTYPE = x86_64-suse-linux +# default +MAKE_COMMAND := make +# automatic +@D = $(patsubst %/,%,$(dir $@)) +# environment +PYTHONSTARTUP = /etc/pythonstart +# environment +VSCODE_HANDLES_UNCAUGHT_ERRORS = true +# default +.VARIABLES := +# environment +PWD = /home/jon/github/ASAP32 +# environment +HOST = WarpDrive +# automatic +%D = $(patsubst %/,%,$(dir $%)) +# environment +MORE = -sl +# environment +HOSTNAME = WarpDrive +# environment +MAIL = /var/spool/mail/jon +# environment +XNLSPATH = /usr/share/X11/nls +# environment +XDG_DATA_DIRS = /home/jon/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/share +# automatic +^D = $(patsubst %/,%,$(dir $^)) +# automatic +%F = $(notdir $%) +# environment +QML_XHR_ALLOW_FILE_READ = 1 +# environment +VSCODE_CODE_CACHE_PATH = /home/jon/.config/Code/CachedData/3b889b090b5ad5793f524b5d1d39fda662b96a2a +# environment +XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session0 +# environment +PROFILEREAD = true +# environment +SSH_ASKPASS = /usr/libexec/ssh/ssh-askpass +# environment +LANG = C +# environment +XAUTHORITY = /run/user/1000/xauth_jFUnMm +# environment +MANPATHISSET = yes +# default +.LOADED := +# environment +FROM_HEADER = +# default +.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include +# makefile +MAKEFLAGS = pqrR +# makefile +CURDIR := /home/jon/github/ASAP32 +# environment +APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL = 1 +# environment +LESSOPEN = lessopen.sh %s +# automatic +*D = $(patsubst %/,%,$(dir $*)) +# environment +MFLAGS = -pqrR +# environment +SSH_AUTH_SOCK = /tmp/ssh-XXXXXX6Sy2Am/agent.1730 +# default +.SHELLFLAGS := -c +# environment +HISTSIZE = 1000 +# environment +XDG_CONFIG_DIRS = /home/jon/.config/kdedefaults:/etc/xdg:/usr/etc/xdg +# automatic ++D = $(patsubst %/,%,$(dir $+)) +# environment +XCURSOR_THEME = Qogir-dark +# environment +LESSKEY = /usr/etc/lesskey.bin +# environment +XDG_SESSION_DESKTOP = KDE +# makefile +MAKEFILE_LIST := +# automatic +@F = $(notdir $@) +# environment +VSCODE_PID = 4695 +# environment +XDG_SESSION_TYPE = x11 +# environment +XAUTHLOCALHOSTNAME = WarpDrive +# automatic +?D = $(patsubst %/,%,$(dir $?)) +# environment +INPUT_METHOD = ibus +# environment +SDK_HOME = /usr/lib64/jvm/java +# environment +SESSION_MANAGER = local/WarpDrive:@/tmp/.ICE-unix/2082,unix/WarpDrive:/tmp/.ICE-unix/2082 +# automatic +*F = $(notdir $*) +# environment +MANPATH = /home/jon/.local/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man:/opt/cross/share/man +# environment +CHROME_DESKTOP = code-url-handler.desktop +# environment +DBUS_SESSION_BUS_ADDRESS = unix:abstract=/tmp/dbus-ymHqyeMEWm,guid=17b1d60c93f024c3f95adad862e5d7e3 +# automatic +<D = $(patsubst %/,%,$(dir $<)) +# environment +JAVA_ROOT = /usr/lib64/jvm/java +# environment +LESS_ADVANCED_PREPROCESSOR = no +# environment +JAVA_BINDIR = /usr/lib64/jvm/java/bin +# environment +VSCODE_NLS_CONFIG = {"locale":"en-us","availableLanguages":{},"_languagePackSupport":true} +# default +MAKE_HOST := x86_64-suse-linux-gnu +# environment +WINDOW_MANAGER = /usr/bin/startplasma-x11 +# makefile +SHELL = /bin/sh +# default +MAKECMDGOALS := all +# environment +XMODIFIERS = @im=ibus +# environment +PLATFORMIO_CALLER = vscode +# environment +SHLVL = 0 +# environment +MAKELEVEL := 0 +# default +MAKE = $(MAKE_COMMAND) +# environment +PATH = /home/jon/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/cross/bin +# default +MAKEFILES := +# automatic +^F = $(notdir $^) +# environment +OSTYPE = linux +# environment +QSYS_ROOTDIR = /storage/large_programs/quartus/sopc_builder/bin +# environment +MINICOM = -c on +# environment +CPU = x86_64 +# environment +LESSCLOSE = lessclose.sh %s %s +# automatic +?F = $(notdir $?) +# environment +KDE_APPLICATIONS_AS_SCOPE = 1 +# environment +XDG_SEAT = seat0 +# environment +XSESSION_IS_UP = yes +# environment +GTK_IM_MODULE = ibus +# environment +NO_PROXY = 127.0.0.1 +# environment +XDG_CURRENT_DESKTOP = KDE +# environment +HOSTTYPE = x86_64 +# environment +LS_COLORS = rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.pdf=00;32:*.ps=00;32:*.txt=00;32:*.patch=00;32:*.diff=00;32:*.log=00;32:*.tex=00;32:*.doc=00;32:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: +# automatic ++F = $(notdir $+) +# environment +XDG_SEAT_PATH = /org/freedesktop/DisplayManager/Seat0 +# environment +LESS = -M -I -R +# environment +DESKTOP_SESSION = /usr/share/xsessions/default +# environment +CONFIG_SITE = /usr/share/site/x86_64-pc-linux-gnu +# environment +ORIGINAL_XDG_CURRENT_DESKTOP = KDE +# 'override' directive +GNUMAKEFLAGS := +# environment +LOGNAME = jon +# environment +QT_IM_SWITCHER = imsw-multi +# environment +AUDIODRIVER = pulseaudio +# environment +G_FILENAME_ENCODING = @locale,UTF-8,ISO-8859-15,CP1252 +# environment +PLATFORMIO_PATH = /home/jon/.platformio/python3/bin:/home/jon/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/cross/bin +# environment +XDG_VTNR = 7 +# makefile +.DEFAULT_GOAL := +# environment +DISPLAY = :0 +# environment +GTK_MODULES = canberra-gtk-module:canberra-gtk-module +# environment +USER = jon +# default +MAKE_VERSION := 4.3 +# environment +KDE_SESSION_UID = 1000 +# environment +SSH_AGENT_PID = 1894 +# environment +PAGER = less +# environment +_ = /usr/bin/make +# environment +XDG_RUNTIME_DIR = /run/user/1000 +# environment +G_BROKEN_FILENAMES = 1 +# environment +XDG_SESSION_CLASS = user +# environment +VSCODE_AMD_ENTRYPOINT = vs/workbench/api/node/extensionHostProcess +# environment +PLATFORMIO_IDE = 2.5.1 +# environment +XKEYSYMDB = /usr/X11R6/lib/X11/XKeysymDB +# environment +GTK2_RC_FILES = /etc/gtk-2.0/gtkrc:/home/jon/.gtkrc-2.0:/home/jon/.config/gtkrc-2.0 +# environment +HOME = /home/jon +# environment +QT_IM_MODULE = ibus +# environment +CSHEDIT = emacs +# environment +JDK_HOME = /usr/lib64/jvm/java +# environment +ELECTRON_RUN_AS_NODE = 1 +# environment +VSCODE_IPC_HOOK = /run/user/1000/vscode-74f3b1db-1.69.2-main.sock +# environment +TERM = xterm +# environment +XDG_SESSION_ID = 1 +# environment +XCURSOR_SIZE = 24 +# environment +STARTUP = /usr/bin/startplasma-x11 +# default +.RECIPEPREFIX := +# automatic +<F = $(notdir $<) +# default +SUFFIXES := +# environment +QT_AUTO_SCREEN_SCALE_FACTOR = 0 +# environment +LS_OPTIONS = -N --color=tty -T 0 +# environment +KDE_SESSION_VERSION = 5 +# default +.FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell nocomment grouped-target extra-prereqs archives jobserver output-sync check-symlink load +# environment +QT4_IM_MODULE = xim +# environment +KDE_FULL_SESSION = true +# environment + +make: *** No rule to make target 'all'. Stop. + +JRE_HOME = /usr/lib64/jvm/java +# variable set hash-table stats: +# Load=143/1024=14%, Rehash=0, Collisions=13/170=8% + +# Pattern-specific Variable Values + +# No pattern-specific variable values. + +# Directories + +# . (device 65025, inode 21757987): 10 files, no impossibilities. + +# 10 files, no impossibilities in 1 directories. + +# Implicit Rules + +# No implicit rules. + +# Files + +# Not a target: +Makefile: +# Implicit rule search has been done. +# File does not exist. +# File has been updated. +# Failed to be updated. + +# Not a target: +.DEFAULT: +# Implicit rule search has not been done. +# Modification time never checked. +# File has not been updated. + +# Not a target: +all: +# Command line target. +# Implicit rule search has been done. +# File does not exist. +# File has not been updated. + +# Not a target: +makefile: +# Implicit rule search has been done. +# File does not exist. +# File has been updated. +# Failed to be updated. + +# Not a target: +GNUmakefile: +# Implicit rule search has been done. +# File does not exist. +# File has been updated. +# Failed to be updated. + +# files hash-table stats: +# Load=6/1024=1%, Rehash=0, Collisions=0/15=0% +# VPATH Search Paths + +# No 'vpath' search paths. + +# No general ('VPATH' variable) search path. + +# strcache buffers: 1 (0) / strings = 18 / storage = 147 B / avg = 8 B +# current buf: size = 8162 B / used = 147 B / count = 18 / avg = 8 B + +# strcache performance: lookups = 21 / hit rate = 14% +# hash-table stats: +# Load=18/8192=0%, Rehash=0, Collisions=0/21=0% +# Finished Make data base on Thu Aug 4 22:49:23 2022 + + diff --git a/hdl/testing/shift_reg.py b/hdl/testing/shift_reg.py new file mode 100644 index 0000000..b7c2290 --- /dev/null +++ b/hdl/testing/shift_reg.py @@ -0,0 +1,100 @@ +import sys +from amaranth import * +from amaranth.back import verilog, cxxrtl +from amaranth.cli import main +from amaranth.sim import Simulator, Settle, Delay + +BASENAME = "shift_reg" + +class ShiftReg(Elaboratable): + def __init__(self, width): + self.load_val = Signal(width, reset=0, reset_less=True) + self.load = Signal() + self.reg = Signal(width) + self.en = Signal() + self.right_left = Signal() + + self.ports = [self.load_val, self.en, self.right_left, self.reg] + + def elaborate(self, platform): + m = Module() + + with m.If(self.load): + m.d.sync += self.reg.eq(self.load_val) + with m.Else(): + with m.If(self.en): + with m.If(self.right_left): + m.d.sync += self.reg.eq(self.reg << 1) + with m.Else(): + m.d.sync += self.reg.eq(self.reg >> 1) + + return m + + +def step(): + yield + yield Settle() + +def test_shift_reg(): + dut = ShiftReg(8) + + def proc1(): + val = 0xAB + + yield dut.load_val.eq(val) + yield dut.en.eq(0) + yield dut.load.eq(1) + yield + yield Settle() + yield dut.load.eq(0) + yield dut.en.eq(1) + + for _ in range(9): + reg_val = yield dut.reg + assert reg_val == val, f"Incorrect shift ---EXPECTED: {hex(val)} ---GOT: {hex(reg_val)}" + val = val >> 1 + yield + yield Settle() + + val = 0xBD + yield dut.load_val.eq(val) + yield dut.load.eq(1) + yield dut.right_left.eq(1) + yield + yield Settle() + yield dut.load.eq(0) + + for _ in range(9): + reg_val = yield dut.reg + assert reg_val == val, f"Incorrect shift ---EXPECTED: {hex(val)} ---GOT: {hex(reg_val)}" + val = (val << 1) & 0xff + yield + yield Settle() + + + + sim = Simulator(dut) + sim.add_clock(1e-6) + sim.add_sync_process(proc1) + + with sim.write_vcd(BASENAME + '.vcd'): + sim.run() + + +if __name__ == '__main__': + + if sys.argv[1] == "sim": + test_shift_reg() + exit() + + m = ShiftReg(8) + + if sys.argv[1] == "v": + out = verilog.convert(m, ports=m.ports) + with open(BASENAME + '.v','w') as f: + f.write(out) + + elif sys.argv[1] == "cc": + out = cxxrtl.convert(m, ports=m.ports) + with open(BASENAME + '.cc','w') as f: + f.write(out) diff --git a/hdl/testing/up_counter.py b/hdl/testing/up_counter.py new file mode 100644 index 0000000..050a6b0 --- /dev/null +++ b/hdl/testing/up_counter.py @@ -0,0 +1,50 @@ +from amaranth import * +from amaranth.back import verilog + + +class UpCounter(Elaboratable): + """ + A 16-bit up counter with a fixed limit. + + Parameters + ---------- + limit : int + The value at which the counter overflows. + + Attributes + ---------- + en : Signal, in + The counter is incremented if ``en`` is asserted, and retains + its value otherwise. + ovf : Signal, out + ``ovf`` is asserted when the counter reaches its limit. + """ + + def __init__(self, limit): + self.limit = limit + + # Ports + self.en = Signal() + self.ovf = Signal() + + # State + self.count = Signal(16) + + def elaborate(self, platform): + m = Module() + + m.d.comb += self.ovf.eq(self.count == self.limit) + + with m.If(self.en): + with m.If(self.ovf): + m.d.sync += self.count.eq(0) + with m.Else(): + m.d.sync += self.count.eq(self.count + 1) + + return m + + def to_v(self): + return verilog.convert(self, ports=[self.en, self.ovf]) + +top = UpCounter(25) +print(top.to_v())
\ No newline at end of file diff --git a/hdl/testing/up_counter_tb.py b/hdl/testing/up_counter_tb.py new file mode 100644 index 0000000..7c2e8d2 --- /dev/null +++ b/hdl/testing/up_counter_tb.py @@ -0,0 +1,30 @@ +from amaranth.sim import Simulator +from up_counter import UpCounter + +dut = UpCounter(25) + + +def bench(): + # Disabled counter should not overflow. + yield dut.en.eq(0) + for _ in range(30): + yield + assert not (yield dut.ovf) + + # Once enabled, the counter should overflow in 25 cycles. + yield dut.en.eq(1) + for _ in range(25): + yield + assert not (yield dut.ovf) + yield + assert (yield dut.ovf) + + # The overflow should clear in one cycle. + yield + assert not (yield dut.ovf) + +sim = Simulator(dut) +sim.add_clock(1e-6) # 1 MHz +sim.add_sync_process(bench) +with sim.write_vcd("up_counter.vcd"): + sim.run()
\ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c920901 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +amaranth[builtin-yosys]
\ No newline at end of file |