10年前の Verilog ソース(FPGA で PSK31 (DE0 Nano 編 送信 その5))
無線用 PC で、10年前の Verilog ソースを見つけました。
トランジスタ技術の断捨離で付録の DVD をパソコンに取り込んでいる時に見つけました。
その実行結果が「FPGA で PSK31 (DE0 Nano 編 送信 その5)」です。
おそらく、その時の Verilog ソースがこれです。
/*************************************************************************
* Address 8bit word 1bit ROM
PSK TX data "vvv de jr1kda"
Select sine wabe phase by TX data
The counter will wrap at a rate of F*S/M (F is the system clock frequency,
S is the step input, and M is the modulo).
fout = (50MHz/50000000)*Step
*************************************************************************/
`default_nettype none // 暗黙の変数宣言を使用しない
`define IN_PHASE 1'b1; // Phase flag
`define REV_PHASE 1'b0; // Phase flag
module PSK_data_send ( clk_50, clk_send, Rst, TX_wave ) ;
//定数の宣言
parameter MOD = 50000000; // 50MHz
parameter STEP = 1024000; // 1.024MHz
parameter W_SINE = 10; // sine data is 10bit fixed point two's complemet
/* 入力ポートの宣言 */
input wire clk_50; // sine wave generator clock
input wire clk_send; // TX data send clock 31.25Hz
input wire Rst;
/* 出力ポートの宣言 */
output wire [W_SINE-1:0] TX_wave;
/* 内部レジスタの宣言 */
wire [7:0] Addr; // TX ROM data address
wire TXdata; // TX ROM data
wire [W_SINE-1:0] sine_pos ; //
wire [W_SINE-1:0] sine_neg ; //
reg phase_flag; // Hold sine phase information
reg [W_SINE-1:0] TX_out; // Hold TX out data
two_phase_sine_out two_phase_sine_out1 ( // two phase sine wave generator
.clk(clk_50), // clock input (50MHz)
.reset(Rst), // reset signal(change from negative to positive logic)
.mod(MOD), //
.step(STEP), //
.sine_pos(sine_pos), // Output 0 degree
.sine_neg(sine_neg) // Output 180 degree
);
PSK_TX_data PSK_TX_data1 ( // ROM data read
.Clk(clk_send),
.Rst(Rst),
.Addr(Addr),
.data_out(TXdata)
);
TX_Addr_gen TX_Addr_gen1 ( // ROM address generate
.AdClk(clk_send),
.AdRst(Rst),
.ROMaddr(Addr)
);
always @( posedge clk_send or posedge Rst ) begin
if ( Rst )
phase_flag <= 1'b1; // initialize to Sine phase flag is in phase
else begin
if ( ~TXdata ) // phase is inversion
phase_flag <= ~phase_flag; // reverse phase flag
else
phase_flag <= phase_flag; // not change phase flag
end
end
always @( posedge clk_50 ) begin
if ( phase_flag == 1'b1 ) // phase equal in phase
TX_out <= sine_pos ;
else
TX_out <= sine_neg ;
end
assign TX_wave = TX_out;
endmodule
もう完全に忘却の彼方です。
そのテストベンチがこちらです。
/*************************************************************************
* Address 8bit word 1bit ROM
PSK TX data "vvv de jr1kda"
*************************************************************************/
`timescale 1ns/1ps // シミュレーション時の単位時間と精度を設定(単位時間1ns,精度1ps)
`default_nettype none // 暗黙の変数宣言を使用しない
module PSK_data_send_sim; // テスト・ベンチなので入出力はない
//定数の宣言
parameter W_SINE = 10; // sine data is 10bit fixed point two's complemet
parameter STEP1 = 20; // 20 * 1 nSec = 20 nSec / 50MHz
parameter STEP2 = 4000000; // 4,000,000 * 1 nSec = 4,000,000 nSec / 250Hz
//テスト用変数の宣言
reg clk_50; // sine wave generator clock
reg clk_send; // TX data send clock 1kHz = 32 * 31.25Hz
reg Rst;
// 出力ポートの宣言
wire [W_SINE-1:0] TX_wave;
/*
* テスト用インスタンスの生成
*/
PSK_data_send PSK_data_send1 ( clk_50, clk_send, Rst, TX_wave ) ;
// Let's clock it at about 50 MHz
initial begin
clk_50 = 0;
forever begin
#( STEP1 / 2 ) clk_50 = ~clk_50;
end
end
// Let's clock it at about 5kHz
initial begin
clk_send = 0;
forever begin
#( STEP2 / 2 ) clk_send = ~clk_send;
end
end
initial begin
Rst = 0;
#STEP2;
Rst = 1;
#STEP2;
Rst = 0;
end
endmodule
う~ん、これを自分で書いていたのが信じられません。
その時は FPGA の勉強のために書いていました。
FPGA の学習用ボードに実装する手前で挫折しています。
たしかピンの定義をツールで設定するのが分からずに終わってしまったような....
トランジスタ技術の断捨離で付録の DVD をパソコンに取り込んでいる時に見つけました。
その実行結果が「FPGA で PSK31 (DE0 Nano 編 送信 その5)」です。
おそらく、その時の Verilog ソースがこれです。
/*************************************************************************
* Address 8bit word 1bit ROM
PSK TX data "vvv de jr1kda"
Select sine wabe phase by TX data
The counter will wrap at a rate of F*S/M (F is the system clock frequency,
S is the step input, and M is the modulo).
fout = (50MHz/50000000)*Step
*************************************************************************/
`default_nettype none // 暗黙の変数宣言を使用しない
`define IN_PHASE 1'b1; // Phase flag
`define REV_PHASE 1'b0; // Phase flag
module PSK_data_send ( clk_50, clk_send, Rst, TX_wave ) ;
//定数の宣言
parameter MOD = 50000000; // 50MHz
parameter STEP = 1024000; // 1.024MHz
parameter W_SINE = 10; // sine data is 10bit fixed point two's complemet
/* 入力ポートの宣言 */
input wire clk_50; // sine wave generator clock
input wire clk_send; // TX data send clock 31.25Hz
input wire Rst;
/* 出力ポートの宣言 */
output wire [W_SINE-1:0] TX_wave;
/* 内部レジスタの宣言 */
wire [7:0] Addr; // TX ROM data address
wire TXdata; // TX ROM data
wire [W_SINE-1:0] sine_pos ; //
wire [W_SINE-1:0] sine_neg ; //
reg phase_flag; // Hold sine phase information
reg [W_SINE-1:0] TX_out; // Hold TX out data
two_phase_sine_out two_phase_sine_out1 ( // two phase sine wave generator
.clk(clk_50), // clock input (50MHz)
.reset(Rst), // reset signal(change from negative to positive logic)
.mod(MOD), //
.step(STEP), //
.sine_pos(sine_pos), // Output 0 degree
.sine_neg(sine_neg) // Output 180 degree
);
PSK_TX_data PSK_TX_data1 ( // ROM data read
.Clk(clk_send),
.Rst(Rst),
.Addr(Addr),
.data_out(TXdata)
);
TX_Addr_gen TX_Addr_gen1 ( // ROM address generate
.AdClk(clk_send),
.AdRst(Rst),
.ROMaddr(Addr)
);
always @( posedge clk_send or posedge Rst ) begin
if ( Rst )
phase_flag <= 1'b1; // initialize to Sine phase flag is in phase
else begin
if ( ~TXdata ) // phase is inversion
phase_flag <= ~phase_flag; // reverse phase flag
else
phase_flag <= phase_flag; // not change phase flag
end
end
always @( posedge clk_50 ) begin
if ( phase_flag == 1'b1 ) // phase equal in phase
TX_out <= sine_pos ;
else
TX_out <= sine_neg ;
end
assign TX_wave = TX_out;
endmodule
もう完全に忘却の彼方です。
そのテストベンチがこちらです。
/*************************************************************************
* Address 8bit word 1bit ROM
PSK TX data "vvv de jr1kda"
*************************************************************************/
`timescale 1ns/1ps // シミュレーション時の単位時間と精度を設定(単位時間1ns,精度1ps)
`default_nettype none // 暗黙の変数宣言を使用しない
module PSK_data_send_sim; // テスト・ベンチなので入出力はない
//定数の宣言
parameter W_SINE = 10; // sine data is 10bit fixed point two's complemet
parameter STEP1 = 20; // 20 * 1 nSec = 20 nSec / 50MHz
parameter STEP2 = 4000000; // 4,000,000 * 1 nSec = 4,000,000 nSec / 250Hz
//テスト用変数の宣言
reg clk_50; // sine wave generator clock
reg clk_send; // TX data send clock 1kHz = 32 * 31.25Hz
reg Rst;
// 出力ポートの宣言
wire [W_SINE-1:0] TX_wave;
/*
* テスト用インスタンスの生成
*/
PSK_data_send PSK_data_send1 ( clk_50, clk_send, Rst, TX_wave ) ;
// Let's clock it at about 50 MHz
initial begin
clk_50 = 0;
forever begin
#( STEP1 / 2 ) clk_50 = ~clk_50;
end
end
// Let's clock it at about 5kHz
initial begin
clk_send = 0;
forever begin
#( STEP2 / 2 ) clk_send = ~clk_send;
end
end
initial begin
Rst = 0;
#STEP2;
Rst = 1;
#STEP2;
Rst = 0;
end
endmodule
う~ん、これを自分で書いていたのが信じられません。
その時は FPGA の勉強のために書いていました。
FPGA の学習用ボードに実装する手前で挫折しています。
たしかピンの定義をツールで設定するのが分からずに終わってしまったような....
この記事へのコメント