CPUの創りかた

フルコンパイルせずに.mifファイルのデータだけを入れ換える方法

参考: Intel:FPGA 内部 RAM を使用してデザイン中にメモリを実装しました。メモリの初期値は、メモリ初期値ファイルで行いました。その後、メモリの初期値ファイルのみを変更したのですが、この場合、再コンパイルが必要でしょうか? - 半導体事業 - マクニ…

クロックジェネレーター、ROM、CPUを配線して仕上げる

全体を配線して、これで完成である。 library ieee; use ieee.std_logic_1164.all; entity top_level_entity is generic( F_CLK : natural := 48_000_000; FREQ_LO: natural := 1; FREQ_HI: natural := 10 ); port( aclr_n : in std_logic; inp : in std_log…

CPU部をVHDLで記述する

内部信号を適当に設けて内部モジュール同士、および内外の配線をする。 library ieee; use ieee.std_logic_1164.all; entity td4 is generic( NUM_BITS: natural := 4 ); port( clk : in std_logic; aclr_n: in std_logic; inp : in std_logic_vector(NUM_BI…

マルチプレクサを作る

テキストは74153を2個組み合わせて実現しているが、ここでは最初から4ビット×3本のうち1本を選ぶマルチプレクサを作る。練習なのでストローブ端子も設けたが使わない。 -- Define a type of an array comprised of std_logic_vectors. -- This type is only …

A、B、OUTの各レジスタとPCとをVHDLで記述する

前回作った74161のようなものを使ってA、B、OUTの各レジスタとPCとを作る。4つとも1つにまとめる。 library ieee; use ieee.std_logic_1164.all; entity registers is generic( NUM_BITS: natural := 4 ); port( clk : in std_logic; aclr_n : in std_logic;…

同期カウンター74161のようなものをVHDLで記述する

74161は4ビット同期カウンター(!非同期リセット、!同期ロード、カウントイネーブル、リプルキャリーアウト)である。ビット数はパラメタライズするのでリプルキャリーはいらないが練習なので実装する。 library ieee; use ieee.std_logic_1164.all; use ieee.…

命令デコーダーをVHDLで書き換える

今度は命令デコーダーをVHDLで書き換える。p.242の真理値表をそのまま記述する。 library ieee; use ieee.std_logic_1164.all; entity instruction_decoder is port( c_flag_n: in std_logic; op_code : in std_logic_vector(3 downto 0); -- "00"のときA_RE…

4ビット加算器74283のようなものをVHDLで記述する

TD4本体の中身についても練習としてVHDLで書き換えてみる。まず74283のようなものを作る。4ビット加算器(キャリーイン、キャリーアウト)である。ただしビット数はパラメタライズする。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all…

全部FPGAでTD4を実装する

全体を組み合わせる。あとはメモリーブロックに直接プログラムが書き込めればいいのだが今のところ方法が分からず、プログラムメモリーの初期化ファイルを書き換えるたびに毎回全体をコンパイルしている。 TD4は、クロックを受けた時点でROMから命令を受け取…

自動クロックと手動クロックとを組み合わせてクロックジェネレーターを作る

前回、前々回の回路を組み合わせてクロックジェネレーターを作る。 library ieee; use ieee.std_logic_1164.all; entity clk_gen is generic( F_CLK: natural := 48_000_000; FREQ_LO: natural := 1; FREQ_HI: natural := 10; BOUNCE_msec: natural := 15; I…

手動クロックのためのディバウンサーもFPGAで作る

これまではATmega328Pでソフトウェア的に処理していたディバウンスを今度はFPGAに作り込む。このときFPGAで作ったディバウンサーはテキストどおりカウンターをunsignedにしたが今度はわかりやすさを優先してnaturalにした。 library ieee; use ieee.std_logi…

マイコンで生成していた1 Hzクロック、10 HzクロックをFPGAで生成する

前回まで1 Hzクロック、10 HzクロックはATmega328Pで生成していたが今度はFPGAで生成する。デバイスもMAX VからMAX10へ移行した。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity auto_clk is generic( F_CLK : natural := 4…

CPU部の回路図を入力する

[Assignments]、[Device...]の順に選択して[Device]ウィンドウを開く。その中の[Device and Pin Options...]をクリックして[Device and Pin Options - プロジェクト名]ウィンドウを開く。その中の[Unused Pins]を選択し、[Reserve all unused pins:]を[As in…

外部回路まとめ

これまでに作ったプログラムをひとつにまとめる。リセット信号はATmega328Pと共用することにした。 #include "TD4_external.h" /* ニモニック(のようなもの)一覧: MOV_A(Im) : AレジスタにImを転送 MOV_B(Im) : BレジスタにImを転送 MOV_AB : AレジスタにBレ…

ROMを作る、の修正

ROMを作る -の修正 前はクロックの立ち上がりで割り込みをかけてデータを更新していたが、今度はアドレスの変化で割り込んでデータを更新することにする。 これでTD4の外部回路は全部出来たことになる。 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #defin</avr/interrupt.h></avr/io.h>…

リセット信号を作る

リセット信号もATmega328Pで生成することにする。 #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> int main(){ DDRD |= (1 << PD3); // PD3から!リセット信号を出力することにする。 PORTD &= ~(1 << PD3); // 最初に!リセット信号をLにしておいて、 _delay_m</util/delay.h></avr/io.h>…

マニュアルクロックを作る

マニュアルクロックもATmega328Pで生成することにする。 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile uint8_t switch_changed = 0; ISR(INT0_vect){ switch_changed = 1; } int main(){ DDRD |= (1 << PD5); // PD5からマニュアルクロ</util/delay.h></avr/interrupt.h></avr/io.h>…

1 Hz、10 Hzのクロックを作る

クロックはATmega328Pで生成することにする。 /* PD7から10Hzを、PD6から1Hzを出力する。 */ #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #define PRESCALE_FOR_1HZ 10 volatile int8_t counter = PRESCALE_FOR_1HZ; ISR(TIMER1_COMPA_vect){ // 20Hzの頻</avr/interrupt.h></avr/io.h>…

ROMを作る

pp.121ff.、pp.240ff. とてもテキストのような真似はできないのでマイコンで代用することにする。ついでにアセンブルもする。CPUと組み合わせたときにこれでうまくゆくかどうかはわからない。 #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #define MOV_A(Im</avr/interrupt.h></avr/io.h>…

クロックジェネレーター

pp.102-108 まずはテキストどおりに1 Hz、10 Hzの発振回路を試す。ただし電源電圧は3.3 Vにした。