2008/08/09〜28 | |
K.I | |
基板端子番号 | FPGA端子 | 結線 |
---|---|---|
CN3-A06 | +3.3V | |
CN3-A11 | GND | |
CN2-A01 | P38 | 24MHz オシレータへ |
P47 | DWM基板上のLED_Green | |
P49 | DWM基板上のLED_Red | |
P50 | DWM基板上のタクトスイッチ | |
CN3-A03 | P55 | R(ステレオジャック中央) |
CN3-A04 | P60 | L(ステレオジャック先端) |
CN3-A08 | P67 | sine[0] |
CN3-A09 | P71 | sine[1] |
CN3-A10 | P74 | sine[2] |
CN3-A12 | P79 | sine[3] |
CN3-A13 | P81 | sine[4] |
CN3-A14 | P86 | sine[5] |
CN3-A15 | P92 | sine[6] |
CN3-A16 | P96 | sine[7] |
The output frequency is not within the valid range. Please enter a new value for the output frequency.
dcm_block instance_name ( .CLKIN_IN(CLKIN_IN), .RST_IN(RST_IN), .CLKFX_OUT(CLKFX_OUT), .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), .CLK0_OUT(CLK0_OUT) );
module dds_clock( input clk0, input rst, output clk ); reg[1:0] clkreg; // 分周用レジスタ wire clkfx; // DCM→4分周回路への配線 ip_dcm instance_name ( // Coreジェネレータで作ったDCMモジュール .CLKIN_IN(clk0), // 入力の24MHz .RST_IN(rst), // リセット .CLKFX_OUT(clkfx), // 出力の20MHz .CLKIN_IBUFG_OUT(), // たぶん入力をバッファしたもの .CLK0_OUT() // たぶん入力と同相のクロック ); // 4分周回路 // clkfx(20MHz)/4 = clk(5MHz) always @(posedge clkfx or posedge rst) begin if (rst == 1) clkreg <= 2'b00; // 非同期リセット else clkreg <= {clkreg[0],~clkreg[1]}; // ジョンソンカウンタ end assign clk = clkreg[1]; // 分周用レジスタの上位ビットを出力へ endmodule
Output Selection Sine Channels 1 DDS Clock Rate 5 Spurious Free Dynamic Range 45 Frequency Resolution 0.1
Channel1 0.2 Phase Increment Programable
Channel1 0 Phase Offset None
Noise Shaping None Memory type AUTO Clear Options SCLR Pin
dds_core YourInstanceName ( .a(a), // Bus [4 : 0] .clk(clk), .sclr(sclr), .we(we), .data(data), // Bus [25 : 0] .sine(sine)); // Bus [7 : 0]
`define MSBI 7 // Most significant Bit of DAC input //This is a Delta-Sigma Digital to Analog Converter module xapp154(DACout, DACin, Clk, Reset); output DACout; // This is the average output that feeds low pass filter reg DACout; // for optimum performance, ensure that this ff is in IOB input [`MSBI:0] DACin; // DAC input (excess 2**MSBI) input Clk; input Reset; reg [`MSBI+2:0] DeltaAdder; // Output of Delta adder reg [`MSBI+2:0] SigmaAdder; // Output of Sigma adder reg [`MSBI+2:0] SigmaLatch; // Latches output of Sigma adder reg [`MSBI+2:0] DeltaB; // B input of Delta adder always @(SigmaLatch) DeltaB = {SigmaLatch[`MSBI+2], SigmaLatch[`MSBI+2]} << (`MSBI+1); always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB; always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch; always @(posedge Clk or posedge Reset) begin if(Reset) begin SigmaLatch <= 1'b1 << (`MSBI+1); DACout <= 1'b0; end else begin SigmaLatch <= SigmaAdder; DACout <= SigmaLatch[`MSBI+2]; end end endmodule
`timescale 1ns / 1ps module dds_main( // 外(FPGAの端子)に繋がる入出力定義 input rstn, // リセットスイッチ input clk0, // 24MHzオシレータからのクロック output ledr, // 赤LED output ledg, // 緑LED output out1, // 出力1(ステレオジャック中央) output out2, // 出力2(ステレオジャック先端) output [7:0] sine // サイン波形出力(8ビット) ); reg [27:0] we_coun; // 分周用カウンタ wire [25:0] data; // 周波数設定用の配線 wire rst; // リセット用の配線 dds_clock clock0 ( // 5MHzのクロックを生成する .clk0(clk0), // Coreジェネレータで作ったDCMモジュールを使っている .rst(rst), .clk(clk) ); ip_dds dds0 ( // Coreジェネレータで作ったDDSモジュール .clk(clk), .sclr(rst), .we(we), .data(data), // Bus [25 : 0] →周波数設定 .sine(sine) // Bus [7 : 0] →サイン波形出力 ); xapp154 dac0 ( // アプリケーションノート154のDACモジュール .DACout(out2), // out2にPWM出力する .DACin(sine), // 波形データ(PCM) .Clk(clk), .Reset(rst) ); // 分周回路(単純なカウンタ) always @(posedge clk or posedge rst) begin if (rst == 1) we_coun <= 0; // 非同期リセット else we_coun <= we_coun + 1'b1; end // 周波数設定(data = 00007FF - 0007FFF) (152Hz - 2441Hz) assign data[10:0] = 11'b11111111111; // 下位11ビットは1固定 assign data[14:11] = we_coun[27:24]; // この4ビットだけ変化させる assign data[25:15] = 11'b00000000000; // 上位11ビットは0固定 assign we = we_coun[23]; // 1の時、周波数が設定される assign rst = ~rstn; // タクトスイッチは押した時0なので反転 assign ledr = rst; // LEDは使わないので、とりあえずrstを出力 assign ledg = ~rst; // LEDは使わないので、とりあえずrstの反転を出力 assign out1 = ~out2; // out1はout2の反転を出力する(BTL出力) endmodule
`timescale 1ns / 1ps module dds_test; // Inputs reg rstn; reg clk0; // Outputs wire ledr; wire ledg; wire out1; wire out2; wire [7:0] sine; // Instantiate the Unit Under Test (UUT) dds_main uut ( .rstn(rstn), .clk0(clk0), .ledr(ledr), .ledg(ledg), .out1(out1), .out2(out2), .sine(sine) ); // ここから上は、自動的に作られたもの parameter RATE = 100; // レートを100nsとする always #(RATE/2) clk0 = > clk0; // クロックは、alwaysで繰り返し initial begin clk0 = 0; // クロックとリセットの初期値 rstn = 0; #(RATE) rstn=1; // リセット解除 #(RATE*5000) // 5000クロック分実行して $break; // 止める end initial $monitor ( $stime, // 値を表示する(ModelSimなら無くても良い) " clk0=%b rstn=%b ledr=%b ledg=%b out1=%b out2=%b", clk0, rstn, ledr, ledg, out1, out2 ); endmodule
I/O Name | I/O Direction | Loc | Bank | I/O Std. |
---|---|---|---|---|
clk0 | Input | P38 | BANK4 | |
ledg | Output | P47 | BANK4 | |
ledr | Output | P49 | BANK4 | |
rstn | Input | P50 | BANK4 | |
out1 | Output | P55 | BANK3 | |
out2 | Output | P60 | BANK3 | |
sine[0] | Output | P67 | BANK2 | |
sine[1] | Output | P71 | BANK2 | |
sine[2] | Output | P74 | BANK2 | |
sine[3] | Output | P79 | BANK1 | |
sine[4] | Output | P81 | BANK1 | |
sine[5] | Output | P86 | BANK1 | |
sine[6] | Output | P92 | BANK0 | |
sine[7] | Output | P96 | BANK0 |
NET "clk0" LOC = "P38" ; NET "ledg" LOC = "P47" ; NET "ledr" LOC = "P49" ; NET "out1" LOC = "P55" ; NET "out2" LOC = "P60" ; NET "rstn" LOC = "P50" ; NET "sine[0]" LOC = "P67" ; NET "sine[1]" LOC = "P71" ; NET "sine[2]" LOC = "P74" ; NET "sine[3]" LOC = "P79" ; NET "sine[4]" LOC = "P81" ; NET "sine[5]" LOC = "P86" ; NET "sine[6]" LOC = "P92" ; NET "sine[7]" LOC = "P96" ;