FPGA活用回路&サンプル記述集(1) ―― アナログ信号入出力回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年2月23日
● NCOの記述
リスト3-1が今回のNCOのVerilog HDL記述です.NCOの本質は累加算器ですから,
div <= div + di ;
の1行です.この累加算器の上位8ビットをcase文で作成したROMテーブルで正弦波に変換しています.もちろんメモリ・コアを使用したROMブロックを使っても構いません.
module nco(di, wave, clk, nreset) ;
input [11:0]di ;←※12↓
input clk ;
input nreset ;
output [7:0]wave ; ※12↑
reg [15:0]div ; ←※13
reg [15:0]dii ;
reg [7:0]wave ;
always @( posedge clk or negedge nreset )
begin
if( nreset<= 0 ) begin←※14↓
div <= 0 ;
dii <= 0 ;
end
else begin
div <= div + di ; ↑※14
case (div[15:8]) ←※15
0:wave <= 8'h00 ; 1:wave <= 8'h00 ;
2:wave <= 8'h00 ; 3:wave <= 8'h00 ;
4:wave <= 8'h00 ; 5:wave <= 8'h00 ;
6:wave <= 8'h01 ; 7:wave <= 8'h01 ;
8:wave <= 8'h02 ; 9:wave <= 8'h03 ;
10:wave <= 8'h03 ; 11:wave <= 8'h04 ;
12:wave <= 8'h05 ; 13:wave <= 8'h06 ;
14:wave <= 8'h07 ; 15:wave <= 8'h08 ;
16:wave <= 8'h09 ; 17:wave <= 8'h0A ;
18:wave <= 8'h0C ; 19:wave <= 8'h0D ;
20:wave <= 8'h0F ; 21:wave <= 8'h10 ;
22:wave <= 8'h12 ; 23:wave <= 8'h13 ;
24:wave <= 8'h15 ; 25:wave <= 8'h17 ;
26:wave <= 8'h19 ; 27:wave <= 8'h1B ;
28:wave <= 8'h1D ; 29:wave <= 8'h1F ;
30:wave <= 8'h21 ; 31:wave <= 8'h23 ;
32:wave <= 8'h25 ; 33:wave <= 8'h27 ;
34:wave <= 8'h2A ; 35:wave <= 8'h2C ;
36:wave <= 8'h2E ; 37:wave <= 8'h31 ;
38:wave <= 8'h33 ; 39:wave <= 8'h36 ;
40:wave <= 8'h38 ; 41:wave <= 8'h3B ;
42:wave <= 8'h3E ; 43:wave <= 8'h40 ;
44:wave <= 8'h43 ; 45:wave <= 8'h46 ;
46:wave <= 8'h49 ; 47:wave <= 8'h4C ;
48:wave <= 8'h4F ; 49:wave <= 8'h51 ;
50:wave <= 8'h54 ; 51:wave <= 8'h57 ;
52:wave <= 8'h5A ; 53:wave <= 8'h5D ;
54:wave <= 8'h60 ; 55:wave <= 8'h63 ;
~中略~
252:wave <= 8'h00 ; 253:wave <= 8'h00 ;
254:wave <= 8'h00 ; 255:wave <= 8'h00 ;
endcase
end
end
endmodule
リスト3-1 数値制御型発振器のVerilog HDL記述
注;入出力の宣言.内部で分周された最低周波数のdi倍の周波数の正弦波がwaveから出力される
注;内部で216分周する従って,最低周波数はclkの65,536分の1になる
注;NCOの本体となる累加算器
注;このcase文で正弦波に変換する
最後に,このブロックを米国Mentor Graphics社の論理シミュレータModelSimでシミュレーションした例を図3-4に示します.
図3-4 NCOブロックの動作シミュレーション結果
tag: FPGA