差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
steptrainingboardddsacode [2020/03/24 14:07]
gongyu
steptrainingboardddsacode [2021/02/02 12:38] (当前版本)
gongyusu
行 1: 行 1:
-##​用于小脚丫FPGA综合技能训练板的DDS培训代码+##​用于小脚丫FPGA综合技能训练板的DDS代码
  
 ### DDS主程序 ### DDS主程序
行 12: 行 12:
 output pwm_out; ​              // 用以产生PWM波形,进而可以产生直流或任意波形,取决于外接的低通滤波器的参数 output pwm_out; ​              // 用以产生PWM波形,进而可以产生直流或任意波形,取决于外接的低通滤波器的参数
  
-reg [23:0] cnt;               // 自由运行的计数器,共计24位,最低频率为cnt[23]的12MHz/​2^24= 0.75Hz +reg [23:0] cnt;               // 自由运行的计数器,共计24位,最低频率为cnt[23]的12MHz/​2^24= 0.7Hz 
-always@(posedge clk_in) ​ cnt <= cnt +1'b1;+always@(posedge clk_in) ​ cnt <= cnt + 1'b1;
 assign led= cnt[22]; ​         //​12MHz/​2^23 ~ 1.5Hz, 接近心跳频率 assign led= cnt[22]; ​         //​12MHz/​2^23 ~ 1.5Hz, 接近心跳频率
  
行 23: 行 23:
 //assign dac_data = cnt[9:​0]; ​ //​锯齿波,​ 频率 = Fclk/2^10 //assign dac_data = cnt[9:​0]; ​ //​锯齿波,​ 频率 = Fclk/2^10
 //assign dac_data = cnt[10] ? ~cnt[9:0] : cnt[9:​0]; ​ // 三角波形,频率 = Fclk/2^11 //assign dac_data = cnt[10] ? ~cnt[9:0] : cnt[9:​0]; ​ // 三角波形,频率 = Fclk/2^11
- 
- 
-//wire clk_internal; ​                              // 内部高倍时钟的名字96MHz 
-//CLK_96M u5(.CLKI(clk_in),​ .CLKOP(clk_internal));​ // 以Lattice的IPCore为例产生高速内部时钟 
-                                              // 从12MHz产生96MHz,用以内部的逻辑以及DAC转换 
  
 reg [23:0] phase_acc; reg [23:0] phase_acc;
-always @(posedge clk_in) phase_acc <= phase_acc + 24'​d27962;​+always @(posedge clk_in) phase_acc <= phase_acc + 24'​d27962; ​ //​主时钟为12MHz,产生20KHz的正弦波信号
 lookup_tables u_lookup_tables(.phase(phase_acc[23:​16]),​ .sine_data(dac_data));​ lookup_tables u_lookup_tables(.phase(phase_acc[23:​16]),​ .sine_data(dac_data));​
  
行 39: 行 34:
 reg [10:0] PWM_DDS_accumulator;​ reg [10:0] PWM_DDS_accumulator;​
  
-always @(posedge ​clk_internal) PWM_DDS_accumulator <= PWM_DDS_accumulator[9:​0] + PWM_in;+always @(posedge ​clk_in) PWM_DDS_accumulator <= PWM_DDS_accumulator[9:​0] + PWM_in;
  
 assign pwm_out = PWM_DDS_accumulator[10];​ assign pwm_out = PWM_DDS_accumulator[10];​
 +
 +// 可以通过内部PLL产生更高频率的时钟信号,比如120MHz,如下面的例子,只需要将上述代码中的clk_in都改为PLL产生的时钟,比如clk_120m就可以了
 +//wire clk_120m; ​                              // 内部高倍时钟的名字
 +//CLK_PLL u5(.CLKI(clk_in),​ .CLKOP(clk_120m));​ // 以Lattice的IPCore为例产生高速内部时钟
 +                                               // 从12MHz产生120MHz,用以内部的逻辑以及DAC转换
  
  
行 176: 行 176:
 ### 10位地址、12位分辨率的正弦波表数据参考 ### 10位地址、12位分辨率的正弦波表数据参考
   * [[sine_tables|10位地址、12位分辨率的正弦波表Verilog代码]]   * [[sine_tables|10位地址、12位分辨率的正弦波表Verilog代码]]
-  * {{:​sinetable.xlsx|10位地址、12位分辨率/​10位地址、10位分辨率/​8位地址、10位分辨率的正弦波表xls格式的文件}}+  * {{:​sinetable.xlsx|10位地址、14位分辨率/​10位地址、12位分辨率/​10位地址、10位分辨率/​8位地址、10位分辨率的正弦波表xls格式的文件}}