memo.log

技術情報の雑なメモ

OpenAI(Chat GPT)でAPIを利用するまでのメモ

APIではAPI用にアカウントを準備しなくてはいけないらしい。

まずここでAPIキーを発行する。

https://platform.openai.com/api-keys

しかし、支払いを事前にある程度しないと使えないらしい。 ここで事前チャージした。

https://platform.openai.com/settings/organization/billing/overview

オートチャージするか選べるので、一旦無しとした。

ラッチIC(Dフリップフロップ)の動作を確認する

はじめに

kure.hatenablog.jp

こちらの記事ではZ80の動きをLEDで可視化してみましたが、IO信号をLEDで光らすのは難しそうだったので、アドレスバスを可視化したのでした。IO信号を可視化するには、PIOと呼ばれるデバイスやラッチICと呼ばれるデバイスで信号をラッチ(瞬間のデータを取得し、記憶)する必要があるようだったので、まずはラッチIC単体で動作を確認してみることとしました。

使ったデバイス

使ったのは、こちらのデバイス。Dフリップフロップと言われるものです。クロックを立ち上げたタイミングの、入力(D)を出力(Q)で保持し続けるというもののようです。

TC74HC273AP | 東芝デバイス&ストレージ株式会社 | 日本

回路

実際の回路図は以下のように組みました。クロックはタクトスイッチで代用しました。出力はLEDで可視化します。入力を電源と接続するか、GNDと接続するかで保持する値を出し分けします。

CLEARはGNDにすると、ラッチの値を開放するようです。色々動作確認してみると、常にHIGHにしていないと正常にラッチできませんでしたので、常にHIGHにしています。

動かしたところ

実際に動かしたところが以下です。最初はHIGHをラッチしており、入力をGNDにしてからタクトスイッチを押下すると、LOWをラッチし続けていることが分かります。

おわりに

ラッチICの動作を簡単に確認できました。 調べてみるとラッチやフリップフロップ回路にも色々種類があるようで、仕組みや使い分けの違いも今後深堀りしていきたいところです。

参考

xtech.nikkei.com

Dラッチ(D-LATCH)とDフリップフロップ(D-FF) https://ie.u-ryukyu.ac.jp/~wada/digcir11/DigcirHandout8.pdf

GoのインストールからTerraform Provider for AWS で make tools するまで

Amazon Linux 2023(x86)でのメモ

# リポジトリのクローン
git clone git@github.com:hashicorp/terraform-provider-aws.git

# Go のインストール
## リポジトリの .go-version をみると 1.24.5 なので 1.24.5 をインストール
## 公式ドキュメントを参照するのが一番確実
## https://go.dev/doc/manage-install
wget https://go.dev/dl/go1.24.5.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz
. ~/.zshrc
go version # 確認

## make tools すると version 付きの Go のバイナリ go1.24.5 が必要なので、上記Goのドキュメントにしたがってインストールする
go install golang.org/dl/go1.24.5@latest
go1.24.5 download  # これで実行できればよいが、私の環境だとパスが通っていなかったのでパスを通す

go env GOPATH # => /home/ec2-user/go, この中の bin/go1.24.5 があるのでここにパスを通す
vim ~/.zshrc # => export PATH="$HOME/go/bin:$PATH" を追加
. ~/.zshrc

go1.24.5 download 
go1.24.5 version

# make tools
make tools

# OK!

# 続き: build
make build

# 以下にバイナリができる
# /home/ec2-user/go/bin/terraform-provider-aws

ROMとZ80でLチカして、CPUの動作を理解する【命令サイクル注釈動画付き】

概要

Z80とROMでLチカしてみました。

基本的にLEDはZ80のアドレスバスに接続し、アドレスバスの出力を可視化します。加えて、動作の理解のため、M1のピンと、リフレッシュのピンにも接続します(役割は後述します)。

まず、動作させた動画を掲載します。クロックは1Hzとしているので、命令サイクルごとの動きがよく分かると思います。本記事では、これらの回路の設計、プログラム、CPUの動作原理をまとめて紹介します。

使用した部品一覧

回路図

実物の回路は以下です。LEDはアドレスバスとM1ピンとリフレッシュピンに接続しています。LEDは下の方から下位のビットに接続してます。(例:一番下だけ点灯したら1)

回路図は以下の通りです。Z80とROMだけを接続したシンプルな回路です。ROMを使っていますが、CPU的にはメモリの役割として使っています。

Z80とROMが接続されているのは、以下です。メモリとして使っているため、MREQとRDをROMに接続します。

  • アドレスバス
  • データバス
  • MREQ(メモリリクエスト) ⇔ CE(チップセレクト)
  • RD(リード) ⇔ OE(アウトプットイネーブル

Z80の動作原理

実際に回路を動かす前にZ80の動作原理を確認します。下部に掲載の図はトランジスタ技術 SPECIAL No.49から抜粋です。サンプルはLD A (1234h) 命令の様子です。(メモリの1234h番地からAレジスタに値を読み込む)

  • 前提として、メモリの0番地~2番地にLD A (1234h) 命令が格納されており、メモリの1234hに読み取らせたいデータが格納されているということです。つまり
    • メモリ0番地: LD
    • メモリ1番地: 34h
    • メモリ2番地: 12h
  • まず電源を入れてZ80をリセットすると、プログラムカウンタが0になり、0番地から命令を読み込んでいきます。
    • 0なので、アドレスバスはすべてLOW
    • 命令(オペコード)を読み込みます(例: LD
    • オペコード分、プログラムカウンタを進めます( LD の場合は1Byte)
  • プログラムカウンタが1になり、1番地からオペランドを読み込んでいきます。LDの場合は、オペランドが1Byte * 2 の2Byteなので、1Byteを2回読み取っていきます。
    • 1なので、アドレスバスの最下位のピンをHIGHにします
    • オペランドの下位バイト(アドレス1)の値をデータピン経由で読み取ります(34h)
  • プログラムカウンタが2になり、2番地からオペランドを読み取ります
  • 命令 LD A (1234h) が読み取れたので、命令を実行します。命令はアドレス 1234h からAレジスタに読み込むということなので、アドレスバスに 1234h を出力します。
  • 無事に命令を実行できました。次の命令に移るため、プログラムカウンタを1増やして、アドレスバスに3を出力して命令(オペコード)をフェッチします。
    • オペコードフェッチ時はM1サイクルと呼ばれるので、M1ピンがLOWになります
  • オペコード読み取り後は通常「リフレッシュアドレス」というものを出力するようです。これはDRAMの際に、必要な処理らしいのですが、今回は関係ないので深堀りしていません。
    • この際、リフレッシュピンがLOWになります

以上がZ80が命令を読み込んで、実行するまでのサイクルになります。これをプログラムカウンタを増やしながら順次進めていきます。

かいつまむと、

オペコードをフェッチする→オペランドをフェッチする→実行する

をプログラムカウンタを増やしながら繰り返す、ということです。

その他メモ

  • Z80のアドレスピンは16個=2Byte分あります
    • 2Byteということは、10進数で65536通りの値を表現できます
    • データピンは8個=1Byteです。ということは、1Byte * 65536 = 64KB までのメモリを扱えるということです。すなわち、アドレス空間が64KB。

ROMプログラムの準備

さて、大体の動作原理がわかったところで、いよいよプログラムを動かしていきます。

最初にROMにプログラムを書き込みます。 ※ROMの使い方は以前、この記事で紹介していますので、省略します。

今回は、CPUの動作原理を確認するのが目的なので、意味のないプログラムですが、以下のように先程の動作原理の解説でも用いた命令 LD A, (0x01) を連続で実行していきます。

START:
    LD A, (0x01)
    LD A, (0x01)
    LD A, (0x01)
    LD A, (0x01)
    LD A, (0x01)
    JP START

Z80を動作させる

それでは、Z80に電源を入れて、リセットします。リセットすることで、PCが0から、Z80がメモリから命令を順番に読み込んで行きます。リセットは、リセットピンをLOW→HIGHにすることで可能です。

最初の動画を再掲します。いかがでしょうか。動作原理に解説したとおり、アドレスバスに想定どおりの出力がされながら、実行が進んでいく様子が分かるのではないでしょうか。

おわりに

雑誌片手にZ80の動作原理を学習しつつ、Lチカさせることで、実際の動作を確認していきました。 理屈と動作が辻褄があっているので、おそらく記載した内容も間違っていないとは思うのですが、不正確な部分等あればご指摘いただけますと幸いです。

次は、IOデバイスも加えて、もう少しコンピューターらしくしていきたいと思います。

その他参考記事

sanuki-tech.net

データシート

https://suzushoweb.com/pdf_file/533506202c31a.pdf

1Hzのクロックを作る(NE555P)

Z80の動作を一つ一つ確認していくために、1Hzのクロックを作ってみました。

回路は以下の記事と同じものを組みました。

nobita-rx7.hatenablog.com

使用物品

ROMチップを使ってLEDを光らせる【SST39SF040-70-4C-PHE】

コンピュータはなぜ動くのか』を参考にZ80をプリミティブな形(ブレッドボードとか使って)で動作させようとしていたのだが、まずRAMにプログラムを打ち込んで保存するところがハードルが高い。 そこで、プログラムはROMチップに書き込んでZ80からはそのROMから読み込むようにすればまだ簡単かと考えた。まずは、ROMチップの扱いに慣れることや仕様の理解のため、ROMチップだけを用いて動作確認することとした。

やること

ROMチップにプログラムを書き込み、あるアドレスのデータを出力し、LEDでその出力が正しく動作しているかを確認する。

使った道具

主な道具は以下の通り。

ROMチップ「SST39SF040-70-4C-PHE」 www.marutsu.co.jp

ROMライター「XGecu T48」 Amazon.co.jp: V12.63 オリジナル XGecu T48 [TL866-3G] プログラマサポート 34000+ ICS EPROM/MCU/SPI/Nor/NAND フラッシュ/EMMC/IC テスター/ TL866CS TL866II Plus交換用。 : パソコン・周辺機器

配線には、ブレッドボード、LED、抵抗(330Ω)、ジャンパワイヤ。

まずROMチップの仕様の確認

今回のROMチップのピン配置からそれぞれのピンの役割を確認していく。 Lowイネーブルのため、ONにするピンはLOWとする。 以下は読み込むときの配線の考え方。

  • A0 ~ A18: アドレスピン → 読み込むアドレスを指定する。全部 GND にしたら 0 を指定する。
  • DQ0 ~ DQ7: データピン → 今回はデータの出力を確認するため、すべてLEDに接続する。抵抗をはさむこと。
  • VDD: 電源 → 5V
  • VSS: GND
  • WE: ライトイネーブル → 読み込みをするので、今回はDisableにするためHighにする。(電源につなぐ)
  • OE: アウトプットイネーブル → 読み込みをするため、EnableにするためLowにする。
  • CE: チップイネーブル → 有効にするため Low にする。

頭の整理のためにアドレスピンと、データピンのデータ空間について整理すると、 アドレスピンは 19 個あるため、 19bit => 524288 => 512KB 。つまり、アドレス空間は 512 KB。 データは 8bit であるため、255 まで表現可能。

データシートから、ピン配置の画像。

実験

書き込み準備

Windows 11で、Xgpro というソフトをダウンロードし、デバイスを接続することで、ROMライターを使うことができる。

XGecu_Software/Xgpro/12/xgproV1288_setup.rar at master · Kreeblah/XGecu_Software · GitHub

ROMライターにROMチップをはめ込んで、USBで接続する。

起動すると、以下のような画面が表示される。「Select IC」に今回のICチップを選択し、16進数が表示されているところを編集し、書き込みできる。 見方としては、例えば一番上の行では、一行で 00 のアドレスから 0F までのデータが格納される。1つのアドレスで表現されるデータが1列に相当する。

データピンが8つあるため、1つのアドレスで 8bit -> 16進数の2桁が表現される。

例えば、以下の画像では00アドレスでは 3E のデータが格納されている。 01 アドレスでは FF が格納されている。

書き込み

今回分かりやすく、アドレス0指定で、01のピンだけを光らせてみたいと思う。したがって、アドレス 0 に 01 を書き込む。以下のように入力し、 Device -> Program と入力する。

読み込み

書き込み後に読み込みの配線を組む。アドレスが0の値を読み込むようにする。すなわち、アドレスピンをすべてGNDにつなぐ。データピンはすべてLEDにつないで、どのピンが出力されたかを分かるようにする。

そして、電源をつなぐと、、以下のようにDQ0 のピンだけ光る!すなわち、アドレス0の値は1であることが分かる。

参考リンク

petit-noise.net

Rails(System Spec)で「"error":"session not created","message":"session not created: probably user data directory is already in use, please specify a unique value for --user-data-dir」

ドライバをChromeからヘッドレスChromeに変更したら動いた…。よくわからん。