FPGA CW Keyer (10)

wave33

メッセージを受信してテキストに応じたキー出力を生成するためには、モールス符号のテーブルをFPGAの中に持つ必要があります。

おっと!符号「G」が、抜けていますね。

クリックの無いCWサイドトーン (2)

wave28

波形成形フィルタには色んな種類がありますが、私たちはサイドトーン(その目的はパドルを操作しているオペレータにフィードバックを与えることにあります)を扱っているので、フィルタの形は、そして結果として得られる音は、各自の美的感覚によってのみ決められるべきです。

ある意味では、このことは問題を非常に難しくします。なぜなら、『ベスト』を決める方法が存在しないからです。

wave27

1つの候補は、レイズド・コサイン形状です。この形状は、周波数領域で用いられ、ディジタル通信の世界では非常に人気があります。何故ならば、それは符号間干渉(ISI)を導入すること無く、信号の帯域を制限することができるからです。

wave29

この包絡線は、レイズド・コサインに見えるでしょうか?

クリックの無いCWサイドトーン

wave20

FPGAを用いて、包絡線の制御された正弦波状のサイドトーンが生成されています。パラメータとしては、もし包絡線が直線的に変化するのであればライズタイムとフォールタイムが、また、他の窓関数であれば別のものが考えられます。

wave21

FPGA CW Keyer (9)

wave25

モールス符号のテーブルを持とうとしています。

    always @ (send_char) begin
        case(send_char)
            5'b00000: begin morse_code <= 16'b1011_1000_0000_0110; end
            5'b00001: begin morse_code <= 16'b1110_1010_1000_1010; end
            5'b00010: begin morse_code <= 16'b1110_1011_1010_1100; end
            5'b00011: begin morse_code <= 16'b1110_1010_0000_1000; end
            5'b00100: begin morse_code <= 16'b1000_0000_0000_1100; end
//

LSBの4ビットは、符号長を表すのに用いられています。私は、可変ウェイト、可変短長点比といった特徴にはあまり必要性を感じないので、このような単純なフォーマットで十分です。

FPGA CW Keyer (8)

wave22

内部に記憶したメッセージを送出しています。

    always @ (message_state) begin
        case(message_state)
            5'b00000: begin message_text <= 16'b1110_1011_1010_0011; end
            5'b00001: begin message_text <= 16'b1011_1010_1110_0000; end
//
        endcase
    end

キー出力のパターンが、直接16ビットのワードにエンコードされています。

4エレでサイドトーン

sidetone5

4エレメントのD/A変換器で、サイドトーンを作りました。黄色のトレースはキー出力で、短点を1個送出しているところです。正弦波の位相がキー出力と揃っていることに注意して下さい。

4-bit

I wrote a short C program to obtain a sine table.

正弦波テーブルを作るために、短いCプログラムを書きました。

int main(){
	int n=64;
	char buf[16], buf2[16];
	for(int i=0;i<n;i++) {
		int ival = (sin((double)i/(double)n*360.0/360.0*2.0*3.14159265)+1.0)/2.0*15.0+0.5;
		itoa(i,buf,2,6);
		itoa(ival,buf2,2,4);
		printf("6'b%6s: begin WAVE <= 4'b%4s; end // %2d: %2d \n", buf, buf2, i, ival);
	}
	return 0;
}

出力行はこのような感じで、verilogソースファイルに取り込むことができます。

6'b000000: begin WAVE <= 4'b1000; end //  0:  8 
6'b000001: begin WAVE <= 4'b1000; end //  1:  8 
6'b000010: begin WAVE <= 4'b1001; end //  2:  9 
6'b000011: begin WAVE <= 4'b1010; end //  3: 10
//
6'b111111: begin WAVE <= 4'b0111; end // 63:  7 

区間[0度, 360度]は64個に分割されて、4ビット変換器の出力レベルが全て用いられるようになっています。

sidetone3

サイドトーンをアナログキャプチャして、FFTで分析しました。

sidetone4

Arduinoをパルス・パターン・ジェネレータとして

fpgaArduino

もし、あなたがトランシーバを1台しか持っていないとすれば、実験をするのには不便でしょう。セパレートの送信機と受信機とがあれば、随分ましになります。

なので、これが私のセパレートシステムです。 Arduinoボードが、パルス・パターン・ジェネレータとなり、FPGAボードをデバッグするのに役立ちます。

FPGA CW Keyer (7)

cwkeyer

完璧ではありませんが、まあ使えます。どうやって、速度を変えるか?簡単です。ソースコードを編集して、コンパイルし直すだけです。

parameter DOT_PERIOD = 5000000;

sidetone

サイドトーン発信器も含まれています。

assign OUT_SOUND = ( OUT_KEY && (sound > SOUND_PERIOD/2) )? 1'b1 : 1'b0;

FPGA CW Keyer (6)

dotdash

長点と短点のキーイングをしています。

pullup

入力ピンIN_DASHIN_DOTは、内部でプルアップされています。