# コンフィギュラブルロジックブロックによる疑似乱数生成器

**URL:** <https://forum.digikey.com/t/topic/52955>\
**Category:** 技術的なヒント\
**Tags:** microchip-technology\
**Created:** [March 24, 2025, 4:26am UTC](https://forum.digikey.com/t/topic/52955 "2025-03-24T04:26:31Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tsuneharu\_Fuji](https://avatars.discourse-cdn.com/v4/letter/t/54ee81/32.png) [@Tsuneharu\_Fuji](https://forum.digikey.com/u/Tsuneharu_Fuji)\
**Post date:** [March 24, 2025, 4:26am UTC](https://forum.digikey.com/t/topic/52955/1 "2025-03-24T04:26:31Z")

</div>

ランダム性は、暗号セキュリティからゲームやシミュレーションまで、多くの組み込みアプリケーションで重要な役割を果たしています。  
しかし、コンフィギュラブルロジックブロック（CLB）を使用して、ハードウェアベースの疑似乱数生成器（PRNG）を8ビットマイクロコントローラ上に直接実装できることをご存知でしょうか。  
この記事では、CLBとSPIペリフェラルを活用したPRNGの作成方法を探ります。このハードウェア主導のアプローチにより、最小限のCPUオーバーヘッドで効率的かつ連続的な乱数生成が実現します。

## PRNGとは何ですか？

疑似乱数生成器（PRNG）は、決定論的アルゴリズムによって生成される、真のランダム性を疑似した数値のシーケンスを生成します。これらのシーケンスは再現性があるため、効率的かつ制御されたランダム性が設計に不可欠な、リソースに制約のある環境に最適です。  
最初の図は、PRNGの全体的な動作に必要なロジックを示しています。2番目の図は、擬似乱数シーケンスを生成する重要なコンポーネントである8ビットリニアフィードバックシフトレジスタに必要なロジックをハイライトしています。

 ![image](https://global.discourse-cdn.com/digikey/original/3X/3/9/397807423022c99ecc925ead6442ad6ba7830909.jpeg)

_図1：LFSR、CLB、およびSPIにより構成されるPRNG実装の概念図_

 ![image](https://global.discourse-cdn.com/digikey/original/3X/b/5/b5fd01d5f1f103849f1daf0018ea936823e121a4.jpeg)

_図2：PRNG生成のためのLFSRコンフィギュレーションブロック図_

## 動作の仕組み

PRNGは、以下を用いて実装しています。

1. **リニアフィードバックシフトレジスタ（LFSR）：** 特定のタップによって決定されるフィードバック関数に基づいて擬似乱数シーケンスを生成します。
2. **SPI：** シフトレジスタとして機能し、出力を効率的に処理します。

PRNGはオールゼロ以外のシード値で初期化され、連続した動作を確保し、実行中のロックアップを防止します。

## 実装の概要

### ハードウェア要件

- [マイクロコントローラPIC16F13145、CLBおよびSPIペリフェラル付き](https://www.digikey.jp/ja/products/base-product/microchip-technology/150/PIC16F13145/733403)
- [Curiosity Nano開発ボード](https://www.digikey.jp/ja/products/detail/microchip-technology/EV06M52A/22248488)
- その他、CLBとSPIペリフェラル付きPIC16Fマイクロコントローラ

### コンフィギュレーション用の MPLAB® Code Configurator （MCC）

コンフィギュレーション手順

1. CLBを構成：PRNGと8ビットLFSRサブモジュールに必要なロジックを実装するようにCLBを構成します。上記の図を参照してください。SPIをモード1で使用して、疑似ランダム出力をシフトし、観測します。
2. ペリフェラルを駆動するために安定したクロック源（例えばHFINTOSC）を割り当てます。

 ![image](https://global.discourse-cdn.com/digikey/original/3X/b/5/b5fd01d5f1f103849f1daf0018ea936823e121a4.jpeg)

## コードの例

PRNGは、MCC SPI APIを使用してオンボードスイッチでトリガされ、SPI（SS、SDI、SCK）およびUARTを介して、確認済みの疑似乱数を出力します。

```auto
int main(void) {
  SYSTEM_Initialize();
  SPI_Open(CLIENT_CONFIG);
  __delay_ms(100);
  while (1) {
    if (SWITCH_GetValue() == 0) {
      if (SPI1_IsRXReady()) printf("\n\rRead byte: %x", SPI1_ByteRead());
    }
  }
}

```

## テストおよび結果

UARTまたはオシロスコープでSPIピンの出力を観測してPRNGを確認して下さい。生成されたシーケンスは、以下のように安定した擬似ランダム動作を示します。

 ![image](https://global.discourse-cdn.com/digikey/original/3X/3/c/3c031b411b3b778b7ebc8e834070870e3d24549b.jpeg)

_図3：テスト中にキャプチャされたPRNGの出力例_

## CLBベースPRNGのアプリケーション

- 暗号機能
- データスクランブリング
- ゲームアルゴリズム
- シミュレーションとモデリング

このアプローチは、ハードウェアベースのロジックを活用することで、CPUの負荷を軽減し、システム設計を簡素化します。

* * *

## 詳細はこちら

PRNGの実装やその他のコンフィギュラブルロジックブロックの例については、こちらをご覧ください。

- [Pseudo-Random Number Generator CLB File](https://mchp.us/3CVKSA7)
- [Configurable Logic Block Peripheral Overview](https://mchp.us/3COSQv0)
- [Configurable Logic Block (CLB) Tips and Tricks - Developer Help](https://mchp.us/40KL1zK)

[オリジナル・ソース（English）](https://forum.digikey.com/t/pseudo-random-number-generator-with-the-configurable-logic-block/48383)
