| 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" ;