Takumi Nakagawara / Mseq
Committer:
Takkun
Date:
Sun Mar 31 06:19:04 2019 +0000
Revision:
1:47c03f50ad79
Parent:
0:3e4357746fe2
Expand the effective number of bits

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Takkun 0:3e4357746fe2 1 #include "Mseq.h"
Takkun 0:3e4357746fe2 2
Takkun 0:3e4357746fe2 3 /**
Takkun 0:3e4357746fe2 4 * @brief コンストラクタ
Takkun 0:3e4357746fe2 5 * @param uint8_t n M系列信号を発生させるレジスタの個数
Takkun 0:3e4357746fe2 6 */
Takkun 0:3e4357746fe2 7 Mseq::Mseq(uint8_t _n)
Takkun 0:3e4357746fe2 8 {
Takkun 0:3e4357746fe2 9 reset(_n);
Takkun 0:3e4357746fe2 10 }
Takkun 0:3e4357746fe2 11
Takkun 0:3e4357746fe2 12 /**
Takkun 0:3e4357746fe2 13 * @brief レジスタの個数を変更しつつ初期化する
Takkun 0:3e4357746fe2 14 * @param uint8_t n M系列信号を発生させるレジスタの個数
Takkun 0:3e4357746fe2 15 * @details n bitシフトレジスタから生成されるM系列の一周期の長さは2^n-1
Takkun 0:3e4357746fe2 16 レジスタ(reg)の初期化と、nに応じたフィードバック係数を設定する
Takkun 0:3e4357746fe2 17 */
Takkun 0:3e4357746fe2 18 void Mseq::reset(uint8_t _n)
Takkun 0:3e4357746fe2 19 {
Takkun 0:3e4357746fe2 20 n = _n;
Takkun 0:3e4357746fe2 21
Takkun 0:3e4357746fe2 22 // フィードバック係数を更新
Takkun 0:3e4357746fe2 23 // フィードバック係数は以下の資料から引用
Takkun 0:3e4357746fe2 24 // https://www.xilinx.com/support/documentation/application_notes/xapp052.pdf
Takkun 0:3e4357746fe2 25 switch(n)
Takkun 0:3e4357746fe2 26 {
Takkun 0:3e4357746fe2 27 case 3:
Takkun 0:3e4357746fe2 28 coef = 5;
Takkun 0:3e4357746fe2 29 break;
Takkun 1:47c03f50ad79 30 case 4:
Takkun 1:47c03f50ad79 31 coef = 9;
Takkun 1:47c03f50ad79 32 break;
Takkun 1:47c03f50ad79 33 case 5:
Takkun 1:47c03f50ad79 34 coef = 9;
Takkun 1:47c03f50ad79 35 break;
Takkun 1:47c03f50ad79 36 case 6:
Takkun 1:47c03f50ad79 37 coef = 33;
Takkun 1:47c03f50ad79 38 break;
Takkun 1:47c03f50ad79 39 case 7:
Takkun 1:47c03f50ad79 40 coef = 65;
Takkun 1:47c03f50ad79 41 break;
Takkun 1:47c03f50ad79 42 case 8:
Takkun 1:47c03f50ad79 43 coef = 113;
Takkun 1:47c03f50ad79 44 break;
Takkun 1:47c03f50ad79 45 case 9:
Takkun 1:47c03f50ad79 46 coef = 33;
Takkun 1:47c03f50ad79 47 break;
Takkun 1:47c03f50ad79 48 case 10:
Takkun 1:47c03f50ad79 49 coef = 129;
Takkun 1:47c03f50ad79 50 break;
Takkun 1:47c03f50ad79 51 case 11:
Takkun 1:47c03f50ad79 52 coef = 513;
Takkun 1:47c03f50ad79 53 break;
Takkun 1:47c03f50ad79 54 case 12:
Takkun 1:47c03f50ad79 55 coef = 83;
Takkun 1:47c03f50ad79 56 break;
Takkun 1:47c03f50ad79 57 case 13:
Takkun 1:47c03f50ad79 58 coef = 27;
Takkun 1:47c03f50ad79 59 break;
Takkun 1:47c03f50ad79 60 case 14:
Takkun 1:47c03f50ad79 61 coef = 43;
Takkun 1:47c03f50ad79 62 break;
Takkun 1:47c03f50ad79 63 case 15:
Takkun 1:47c03f50ad79 64 coef = 16385;
Takkun 1:47c03f50ad79 65 break;
Takkun 1:47c03f50ad79 66 case 16:
Takkun 1:47c03f50ad79 67 coef = 40977;
Takkun 1:47c03f50ad79 68 break;
Takkun 0:3e4357746fe2 69
Takkun 0:3e4357746fe2 70 }
Takkun 0:3e4357746fe2 71 reset();
Takkun 0:3e4357746fe2 72 }
Takkun 0:3e4357746fe2 73
Takkun 0:3e4357746fe2 74
Takkun 0:3e4357746fe2 75 /**
Takkun 0:3e4357746fe2 76 * @brief レジスタのみを初期化する
Takkun 0:3e4357746fe2 77 * @param なし
Takkun 0:3e4357746fe2 78 * @details 常にレジスタの出力に近い側を1に初期化する
Takkun 0:3e4357746fe2 79 */
Takkun 0:3e4357746fe2 80 void Mseq::reset()
Takkun 0:3e4357746fe2 81 {
Takkun 0:3e4357746fe2 82 srand((unsigned int)time(NULL));
Takkun 1:47c03f50ad79 83 reg = (rand() % (n-1)) + 1;
Takkun 0:3e4357746fe2 84 }
Takkun 0:3e4357746fe2 85
Takkun 0:3e4357746fe2 86
Takkun 0:3e4357746fe2 87 /**
Takkun 0:3e4357746fe2 88 * @brief M系列信号を1step更新し、出力を得る
Takkun 0:3e4357746fe2 89 * @param なし
Takkun 0:3e4357746fe2 90 * @details
Takkun 0:3e4357746fe2 91 * p1, p2, ... pk \in aの時、regは以下の2ステップで更新される
Takkun 0:3e4357746fe2 92 * step1 : reg[j] = reg[j+1] \forall j \in {0,2,...n-1}
Takkun 0:3e4357746fe2 93 * step2 : reg[n] = reg[p1] xor reg[p2] xor .... reg[pk]
Takkun 0:3e4357746fe2 94 */
Takkun 0:3e4357746fe2 95 uint8_t Mseq::update()
Takkun 0:3e4357746fe2 96 {
Takkun 0:3e4357746fe2 97 uint32_t feedback = 0;
Takkun 0:3e4357746fe2 98 uint32_t t = reg & coef;
Takkun 0:3e4357746fe2 99 for(int i = 0; i < n; i++)
Takkun 0:3e4357746fe2 100 {
Takkun 0:3e4357746fe2 101 feedback ^= t & 1;
Takkun 0:3e4357746fe2 102 t >>= 1;
Takkun 0:3e4357746fe2 103 }
Takkun 0:3e4357746fe2 104 feedback &= 1;
Takkun 0:3e4357746fe2 105 reg = reg >> 1;
Takkun 0:3e4357746fe2 106 reg = ((~(0xffffffff << (n-1))) & reg) | (feedback << (n -1));
Takkun 0:3e4357746fe2 107 return getOutput();
Takkun 0:3e4357746fe2 108 }
Takkun 0:3e4357746fe2 109
Takkun 0:3e4357746fe2 110 /**
Takkun 0:3e4357746fe2 111 * @brief 出力を得る
Takkun 0:3e4357746fe2 112 * @param なし
Takkun 0:3e4357746fe2 113 * @details 出力 (0 or 1)
Takkun 0:3e4357746fe2 114 */
Takkun 0:3e4357746fe2 115 uint8_t Mseq::getOutput() const
Takkun 0:3e4357746fe2 116 {
Takkun 0:3e4357746fe2 117 return reg & 1;
Takkun 0:3e4357746fe2 118 }
Takkun 0:3e4357746fe2 119
Takkun 0:3e4357746fe2 120 /**
Takkun 0:3e4357746fe2 121 * @brief シフトレレジスタ全体の状態を得る
Takkun 0:3e4357746fe2 122 * @param なし
Takkun 0:3e4357746fe2 123 * @details シフトレジスタの生データ
Takkun 0:3e4357746fe2 124 */
Takkun 0:3e4357746fe2 125 uint32_t Mseq::getRegister() const
Takkun 0:3e4357746fe2 126 {
Takkun 0:3e4357746fe2 127 return reg;
Takkun 0:3e4357746fe2 128 }