dds.v.txt
上传用户:saul_905
上传日期:2013-11-27
资源大小:184k
文件大小:2k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Visual C++

  1. //
  2. //
  3. // This is just a little demo of DDS.  It doesn't have any cool features
  4. // or anything..
  5. //
  6. module dds (
  7.    clk,
  8.    reset,
  9.    
  10.    din,
  11.    
  12.    dout
  13. );
  14. parameter W = 12;
  15. input clk; // Primary clock.
  16. input reset; // Synchronous reset.
  17. input [W-1:0] din; // The "phase step".
  18. output [W-1:0] dout; // Output of the phase accumulator register.
  19. reg [W-1:0] dout;
  20. reg [W-1:0] accum; // Phas Accumulator
  21. // Just output the accumulator...
  22. always @(accum)
  23.    dout <= accum;
  24. // Specify the accumulator..   
  25. always @(posedge clk) begin
  26.    if (reset) accum <= 0;
  27.    else begin
  28.       accum <= accum + din;
  29.    end
  30. end
  31. endmodule
  32. // synopsys translate_off
  33. module ddstest;
  34. reg clk;
  35. reg reset;
  36. reg [11:0] din;
  37. wire [11:0] dout;
  38. reg [7:0] cosout;
  39. // Instantiate the DDS with 12-bits.
  40. //
  41. dds #(12) dds1 (.clk(clk),  .reset(reset),  .din(din),  .dout(dout));
  42. // Here's our Cosine lookup table.
  43. //
  44. reg [7:0] costable[0:4095];  // 4KBytes.
  45. // DDS Phase Accumulator output simply indexes into the Cos lookup table.
  46. //
  47. always @(dout)
  48.    cosout <= costable[dout];
  49. // Main test thread.
  50. //   
  51. initial begin
  52.    $readmemh ("cos.hex", costable); // See the PERL program 'generate_cos_table.pl'
  53.    din = 12'h020; // Start at 16
  54.    #500000;
  55.    
  56.    din = 12'h0D0; // A little faster.. 
  57.    #500000;
  58.    
  59.    din = 12'h200; // Fairly fast.
  60.    #500000;
  61.    
  62.    $finish;
  63. end
  64. // Let's clock it at 1 MHz
  65. initial begin
  66.    clk = 0;
  67.    forever begin
  68.       #500 clk = 1;
  69.       #500 clk = 0;
  70.    end
  71. end
  72. // Reset
  73. initial begin
  74.    reset = 1;
  75.    #3500 reset = 0;
  76. end
  77. // Generate VCD file for viewing.
  78. initial begin
  79.    $dumpfile ("dds.vcd");
  80.    $dumpvars (0,ddstest);   
  81. end
  82. endmodule
  83. //***  Here's the Perl program for your reference...
  84. `ifdef WHEN_PERL_IS_A_SUBSET_OF_VERILOG
  85.       #!/tools2/perl/bin/perl
  86.       #
  87.       #  Generate a file of cos data for use by a DDS simulation.
  88.       #
  89.       $n      = 4096; # Number of data points
  90.       $minval = 0; # Smallest cos value.
  91.       $maxval = 255; # Largest cos value.
  92.       $pi = 3.1415927;
  93.       $t = 0;
  94.       for ($i = 1; $i < $n; $i = $i + 1) {
  95.          $value = ($maxval - $minval)/2 + (($maxval - $minval)/2)*cos($t);
  96.          $value = int($value);
  97.          printf "%xn", $value;
  98.          $t = $t + 2*$pi / $n;
  99.       }
  100. `endif