Takumi Nakagawara / Mseq
Committer:
Takkun
Date:
Thu Mar 28 07:14:57 2019 +0000
Revision:
0:3e4357746fe2
Child:
1:47c03f50ad79
create Mseq library

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 0:3e4357746fe2 30
Takkun 0:3e4357746fe2 31 }
Takkun 0:3e4357746fe2 32 reset();
Takkun 0:3e4357746fe2 33 }
Takkun 0:3e4357746fe2 34
Takkun 0:3e4357746fe2 35
Takkun 0:3e4357746fe2 36 /**
Takkun 0:3e4357746fe2 37 * @brief レジスタのみを初期化する
Takkun 0:3e4357746fe2 38 * @param なし
Takkun 0:3e4357746fe2 39 * @details 常にレジスタの出力に近い側を1に初期化する
Takkun 0:3e4357746fe2 40 */
Takkun 0:3e4357746fe2 41 void Mseq::reset()
Takkun 0:3e4357746fe2 42 {
Takkun 0:3e4357746fe2 43 srand((unsigned int)time(NULL));
Takkun 0:3e4357746fe2 44 reg = (rand() % (n-1));
Takkun 0:3e4357746fe2 45 }
Takkun 0:3e4357746fe2 46
Takkun 0:3e4357746fe2 47
Takkun 0:3e4357746fe2 48 /**
Takkun 0:3e4357746fe2 49 * @brief M系列信号を1step更新し、出力を得る
Takkun 0:3e4357746fe2 50 * @param なし
Takkun 0:3e4357746fe2 51 * @details
Takkun 0:3e4357746fe2 52 * p1, p2, ... pk \in aの時、regは以下の2ステップで更新される
Takkun 0:3e4357746fe2 53 * step1 : reg[j] = reg[j+1] \forall j \in {0,2,...n-1}
Takkun 0:3e4357746fe2 54 * step2 : reg[n] = reg[p1] xor reg[p2] xor .... reg[pk]
Takkun 0:3e4357746fe2 55 */
Takkun 0:3e4357746fe2 56 uint8_t Mseq::update()
Takkun 0:3e4357746fe2 57 {
Takkun 0:3e4357746fe2 58 uint32_t feedback = 0;
Takkun 0:3e4357746fe2 59 uint32_t t = reg & coef;
Takkun 0:3e4357746fe2 60 for(int i = 0; i < n; i++)
Takkun 0:3e4357746fe2 61 {
Takkun 0:3e4357746fe2 62 feedback ^= t & 1;
Takkun 0:3e4357746fe2 63 t >>= 1;
Takkun 0:3e4357746fe2 64 }
Takkun 0:3e4357746fe2 65 feedback &= 1;
Takkun 0:3e4357746fe2 66 reg = reg >> 1;
Takkun 0:3e4357746fe2 67 reg = ((~(0xffffffff << (n-1))) & reg) | (feedback << (n -1));
Takkun 0:3e4357746fe2 68 return getOutput();
Takkun 0:3e4357746fe2 69 }
Takkun 0:3e4357746fe2 70
Takkun 0:3e4357746fe2 71 /**
Takkun 0:3e4357746fe2 72 * @brief 出力を得る
Takkun 0:3e4357746fe2 73 * @param なし
Takkun 0:3e4357746fe2 74 * @details 出力 (0 or 1)
Takkun 0:3e4357746fe2 75 */
Takkun 0:3e4357746fe2 76 uint8_t Mseq::getOutput() const
Takkun 0:3e4357746fe2 77 {
Takkun 0:3e4357746fe2 78 return reg & 1;
Takkun 0:3e4357746fe2 79 }
Takkun 0:3e4357746fe2 80
Takkun 0:3e4357746fe2 81 /**
Takkun 0:3e4357746fe2 82 * @brief シフトレレジスタ全体の状態を得る
Takkun 0:3e4357746fe2 83 * @param なし
Takkun 0:3e4357746fe2 84 * @details シフトレジスタの生データ
Takkun 0:3e4357746fe2 85 */
Takkun 0:3e4357746fe2 86 uint32_t Mseq::getRegister() const
Takkun 0:3e4357746fe2 87 {
Takkun 0:3e4357746fe2 88 return reg;
Takkun 0:3e4357746fe2 89 }