0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コンピューティング】RAMの仕組みを再現する①

Last updated at Posted at 2024-12-25

こんにちは、インフラエンジニアです。

最近低レイヤー系技術の動画をよく眺めているのですが、先日以下のような動画をYouTubeで見つけました。
『コンピュータメモリー(RAM)の仕組み』
https://www.youtube.com/watch?v=SSjeGjhwBo0
※興味のある方は見てみて下さい。

この動画での解説の通り、RAMの入出力はNAND演算を用いた論理回路であるNANDゲートによって、電気的な信号を解釈し、データのbitを定義しています。
つまり、この処理が物理と論理の境界になります。

動画の中ではNANDゲートの入出力がかなり分かりやすく図解されています。

そこでふと、自身でビットを入力するような形でRAMのNANDゲートを体感できるようなものができたら面白そうだと思ったので、C言語で再現してみようと思います。

とりあえず今回はNAND演算する処理を作るとこまで。

関数

定義した関数は以下の通り

入力したbitを受け取る関数

入力したbitを受け取る+入力値に誤りがないかのチェック

int get_bit(const char* prompt)
{
	int bit;

	while (1)
	{
		printf("%s: ", prompt);


		if (scanf_s("%d", &bit) != 1)
		{


			if (getchar() == '\n')
			{
				printf("ERROR\n");
			}
			else
			{
				while (getchar() != '\n');

			}

			continue;
		}

		if (bit == 0 || bit == 1)
		{
			return bit;
		}

		else
		{
			printf("ERROR\n");
			while (getchar() != '\n');

		}
	}
}
NAND演算を行う関数

条件処理でNAND演算を行う

int get_NAND(int a, int b)
{
	if (a == 0 && b == 0)
	{
		return 1;
	}

	if (a == 1 && b == 0)
	{
		return 1;
	}

	if (a == 0 && b == 1)
	{
		return 1;
	}

	if (a == 1 && b == 1)
	{
		return 0;
	}

	else
	{
		printf("ERROR");
		return -1;
	}
}

※本当は↓のように書けるかなと思ったけど、何故かうまくいかなかった。

int get_NAND(int a, int b)
{
    return !(a && b); //こちらの方が簡潔
}

コード全様

先述のユーザー定義関数の戻り値を使って、NAND演算の結果を出力してくれます。

#include<stdio.h>

int get_bit(const char* prompt)
{
	int bit;

	while (1)
	{
		printf("%s: ", prompt);


		if (scanf_s("%d", &bit) != 1)
		{


			if (getchar() == '\n')
			{
				printf("ERROR\n");
			}
			else
			{
				while (getchar() != '\n');

			}

			continue;
		}

		if (bit == 0 || bit == 1)
		{
			return bit;
		}

		else
		{
			printf("ERROR\n");
			while (getchar() != '\n');

		}
	}
}

int get_NAND(int a, int b)
{
	if (a == 0 && b == 0)
	{
		return 1;
	}

	if (a == 1 && b == 0)
	{
		return 1;
	}

	if (a == 0 && b == 1)
	{
		return 1;
	}

	if (a == 1 && b == 1)
	{
		return 0;
	}

	else
	{
		printf("ERROR");
		return -1;
	}
}
int main()
{
	int bit_00 = get_bit("ビットを入力 bit_00");
	int bit_01 = get_bit("ビットを入力 bit_01");
		printf("bit_00 = %d \n", bit_00);
		printf("bit_01 = %d \n", bit_01);

		int NAND_00 = get_NAND(bit_00, bit_01);
		printf("NAND(%d, %d) = %d\n", bit_00, bit_01, NAND_00);
		return 0;
}

動作確認

正常に動けばこんな感じ
スクリーンショット 2025-01-11 093559.png

入力値が正しくないとき
スクリーンショット 2025-01-11 093717.png

今回は入力値に対して1ビット分のNAND演算の結果を出力するところまでコード化しました。
次回はこれらの処理を組み合わせて、RAMのNANDゲートで行われている処理を再現したいと思います。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?