論理回路デザイン |
|
/* **************************** MODULE PREAMBLE ******************************** Copyright (c) 2012, ArchiTek This document constitutes confidential and proprietary information of ArchiTek. All rights reserved. */ `timescale 1ps / 1ps // ***************************** MODULE HEADER ********************************* module test; // ************************ PARAMETER DECLARATIONS ***************************** parameter DCLK = 5000; parameter DCLK2 = DCLK/2; // タップ数=3 微分器遅延数=1 デシメーション=1/4 // TAP_NUM = 3 DELAY_NUM = 1 RE_SAMP = 4 // BIT_W = Data bit + TAP_NUM * log2(RE_SAMP * DELAY_NUM) // = 8 + 3 * log2(4 * 1) // = 8 + 3 * 2 = 8 + 6 = 14 parameter TAP_NUM = 3; parameter DELAY_NUM = 1; parameter BIT_W = 14; // 入力するデータの数 parameter DATA_SIZE = 1000; // ************************** LOCAL DECLARATIONS ******************************* reg reset_n; reg reset; reg [1:0] rst; reg clk; // 積分器のクロック reg oClk; // 微分器のクロック wire [BIT_W-1:0] outData; integer cnt; reg [BIT_W-1:0] testData[0:DATA_SIZE-1]; // 入力データ reg [BIT_W-1:0] noise[0:DATA_SIZE-1]; // 入力データに付加するノイズ // ****************************** MODULE BODY ********************************** // ----------------------------------------------------------------------------- // ---------- Create Clock ------------ // 積分器のクロックを生成 initial begin clk=1'b0; forever begin #(DCLK2) clk=~clk; end end // 積分器のクロックを生成 initial begin oClk = #(DCLK2)1'b0; forever begin #(DCLK*2) oClk=~oClk; end end // ---------- Create Reset and Test Time ------------ // リセットの生成とテスト時間の設定 initial begin reset_n=1'b0; #(DCLK*2) reset_n=1'b1; #(DCLK*500) $finish; end // ---------- Create TestData ------------ // 入力用のデータとそこに追加するノイズの生成 initial begin integer init_cnt; // init_cntに乗算する値で周波数を調整 // $sinは-1〜1なので+1してノイズを加算したときの値が8ビットに収まるようにしている for(init_cnt=0 ; init_cnt < DATA_SIZE ; init_cnt=init_cnt+1) testData[init_cnt] = ($sin(((init_cnt*10)%360)*3.1415 / 180)+1)*63; for(init_cnt=0 ; init_cnt < DATA_SIZE ; init_cnt=init_cnt+1) noise[init_cnt] = ($sin(((init_cnt*100)%360)*3.1415 / 180)+1)*63; end // 入力データの配列をカウントアップするカウンタ always @(posedge clk or negedge reset_n) if (!reset_n) cnt = 0; else cnt = cnt+1; // リセット信号よりモジュールに渡す同期リセット信号を生成 always @(posedge clk or negedge reset_n) if (!reset_n) rst <= #1 2'b11; else rst <= #1 {rst[0], 1'b0}; always @(posedge clk or negedge reset_n) if (!reset_n) reset <= #1 1'b1; else reset <= #1 rst[1]; // ----------------------------------------------------------------------------- // ---------- Target Module ------------ // 指定のパラメータ生成したトップモジュールにデータを入力 comCIC #(TAP_NUM, DELAY_NUM, BIT_W) cic( .iData (testData[cnt]+noise[cnt]), .oData (outData), .reset (reset), .clk (clk), .oClk (oClk) ); // ************************** FUNCTIONS and TASKS ****************************** endmodule // *****************************************************************************
回路デザイン > 設計例 [CICフィルタ] > テスト このページのTOP ▲