CPU1738 (トラ技2020年5月号)

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

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

VHDL版CPU1738の動作確認 / 9 ÷ 2 = 4余り1を計算する

アセンブラのようなものも『CPUの創りかた』のときと同じくPythonで作った。 def generate_mif(file_name, width, depth, rom): f = open(file_name, "w") f.write("WIDTH=%d;\n" % width) f.write("DEPTH=%d;\n" % depth) f.write("ADDRESS_RADIX=UNS;\n") …

CPU、ROM、クロックジェネレーターをまとめてCPU1738を完成させる

ROM、クロックジェネレーターは、『CPUの創りかた』のときに作ったVHDLをそのまま使った。 これで一往完成である。 library ieee; use ieee.std_logic_1164.all; entity cpu1738 is port( source_clk : in std_logic; manual_clk_in: in std_logic; sel : in…

CPUにまとめる

これまで作ったモジュール同士を配線してCPUにする。ROMを除いておおむね図34 CPUの全体接続図(p.126)のような形になる。 library ieee; use ieee.std_logic_1164.all; entity cpu is port( aclr_n : in std_logic; inp : in std_logic_vector(3 downto 0); …

A、B、OUTの各レジスタとPCとをVHDLで書き換える

今度はA、B、OUTの各レジスタとPC (pp.115-118)。『CPUの創りかた』のときと同じく、まず共通のカウンター兼レジスターを作っておく(このとき作った74161のようなものからリプルキャリーアウト機能を省いたもの)。それを4つまとめて実体化する。 共通のカウ…

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

今度は命令デコーダー(pp.123-125)。 表10、11の真理値表をそのまま書き写した。 library ieee; use ieee.std_logic_1164.all; entity instruction_decoder is port( data: in std_logic_vector(7 downto 4); zero: in std_logic; cout: in std_logic; ld_en…

ステートマシンをVHDLで書き換える

今度はステートマシン(pp.120-123)。テキストはhalt命令用の回路も同じブロックに分けてあるので、ここでもそれに倣った。 図29 (p.122)の回路をそのままVHDLで表現した。 library ieee; use ieee.std_logic_1164.all; entity state_machine is port( halt_n…

ALUをVHDLで書き換える

『CPUの創りかた』のときと同じくCPU1738も全部VHDLで書き換えてみる。また、トライステートバッファーで実現していたバス選択はマルチプレクサに置き換える。 まずはALU (pp.118-120)から。基本的には加減算器。0出力、Aスルー、Bスルー、-Bスルーの各機能…

ブラシDCモーターを動かす

relay 名詞は/リーれイ/ 動詞は/リーれイ/または/リれイ/ トランジスタ技術 2020年 5月号, pp.128-130 テキストはリレーとトランジスタとでモータードライバーを組み立てているが、ここではモータードライバーIC「BD6211F」(のブレークアウトボード)を使って…

割り算

今度は割り算を試す。前回と同じくOUTポートをINポートに直結しておく。A、Bレジスタの状態についても動作確認用基板のLEDで見られるようにしておくべきであった。 // テキストのプログラム例(4) // 9/2=4(0100)余り1を計算する。 // 0111(9-2=7)、0101(9-2-…

掛け算

今度は掛け算を試す。前回と同じくOUTポートをINポートに直結しておく。 youtu.be // テキストのプログラム例(3) // 4*3=12 (0b1100)を計算する。 // 0100(4*1=4)、1000(4*2=8)、1100(4*3=12)の順に出力される。 _[0] = LD_A(0); // 総数の初期値 _[1] = LD_…

ループを利用した足し算

今度はループを利用した足し算を試す。テキストのプログラム例(2)(pp.126-127)である。OUTレジスタの出力をCPUで参照する手段としてOUTレジスタの出力をINポートにジャンパしておく。このとき、INポートに接続してあるスイッチはオープンにしておかなければ…

あらためて動作確認

MAX V側のピンアサインを動作確認用基板に合わせて変えてから、あらためて1+2+3+4+5=15を計算してみる。上列の黄色いLED (OUT[3:0])が0001 (1)、0011 (3)、0110 (6)、1010 (10)、1111 (15)の順に変化する。 _[0] = LD_A(1); _[1] = OUT_A; _[2] = ADD_A(2);…

CPU1738動作確認用基板

2020年11月3日(火曜日)午前、Fusionへガーバーを送信、2020年11月16日(月曜日)午前、基板受領。 40ピンコネクターのピンアサイン:

動作確認

出来上がったので動作確認をする。ATmega328Pによる制御回路、制御コードの中身は、だいぶ整理したが『CPUの創りかた』のときとまったく同じである。 #include "CPU1738_external.h" /* ニモニック(のようなもの)一覧: ※ ジャンプ命令は1クロック、それ以外…