Xilinx-IP核 DDS

一、功能介绍

DDS IP核通过数字方式生成高精度、可编程频率信号,具备频率合成相位控制多波形输出调制功能、实时控制、低功耗、高集成度和高稳定性等特点

二、 设置界面

(栅格化后模数选择:最大输出频率/预期输出频率)

  1. 仿真(找了B站一个博主FPGA干货分享的tb代码操作下):
`timescale 1ns/100ps

module tb_dds_fix_normal;


    reg                                 aclk                      ='d0;
    reg                                 aresetn                   ='d0;
    wire                                m_axis_data_tvalid          ;
    wire               [  31: 0]        m_axis_data_tdata           ;
    wire                                m_axis_phase_tvalid         ;
    wire               [  31: 0]        m_axis_phase_tdata          ;

    always #1 aclk = ~aclk;

    initial 
      begin
          #100;
          aresetn = 1'b1;
      end


dds_compiler_0 dds_compiler_0 (
    .aclk                               (aclk                      ),// input wire aclk
    .aresetn                            (aresetn                   ),// input wire aresetn
    .m_axis_data_tvalid                 (m_axis_data_tvalid        ),// output wire m_axis_data_tvalid
    .m_axis_data_tdata                  (m_axis_data_tdata         ),// output wire [31 : 0] m_axis_data_tdata
    .m_axis_phase_tvalid                (m_axis_phase_tvalid       ),// output wire m_axis_phase_tvalid
    .m_axis_phase_tdata                 (m_axis_phase_tdata        ) // output wire [31 : 0] m_axis_phase_tdata
);


    reg                                 S_ch0_valid                 ;
    reg                [  15: 0]        S_ch0_cos                   ;
    reg                [  15: 0]        S_ch0_sin                   ;
    reg                [  31: 0]        S_ch0_pha                   ;
    reg                [  15: 0]        S_ch1_cos                   ;
    reg                [  15: 0]        S_ch1_sin                   ;
    reg                [  31: 0]        S_ch1_pha                   ;

always @(posedge aclk ) 
  if (!aresetn) begin
    S_ch0_valid <= 1'b1;
  end else begin
    S_ch0_valid <= ~S_ch0_valid;
  end

always @(posedge aclk ) 
  if (S_ch0_valid) begin
    S_ch0_cos <= m_axis_data_tdata[15:0];
    S_ch0_sin <= m_axis_data_tdata[31:16];
    S_ch0_pha <= m_axis_phase_tdata;
    S_ch1_cos <= S_ch1_cos;
    S_ch1_sin <= S_ch1_sin;
    S_ch1_pha <= S_ch1_pha;
  end else begin
    S_ch0_cos <= S_ch0_cos;
    S_ch0_sin <= S_ch0_sin;
    S_ch0_pha <= S_ch0_pha;
    S_ch1_cos <= m_axis_data_tdata[15:0];
    S_ch1_sin <= m_axis_data_tdata[31:16];
    S_ch1_pha <= m_axis_phase_tdata;
  end


endmodule

`timescale 1ns / 1ps


module dds_cfg_tb();

    reg                                 aclk                      ='d0 ;
    reg                                 aresetn                   ='d0 ;
    reg                                 s_axis_config_tvalid      ='d0 ;
    reg                [  31: 0]        s_axis_config_tdata       ={{16'd1310},{16'd1310}} ;
	//16'd1310 对应频率:1310*aclk频率/2^16;本例大概10MHz
	//对应相位:1310*2π/2^16 * 180/π ,大概2.29
    reg                                 s_axis_config_tlast       ='d0 ;

    wire                                m_axis_data_tvalid          ;
    wire               [  31: 0]        m_axis_data_tdata           ;
    wire                                m_axis_phase_tvalid         ;
    wire               [  31: 0]        m_axis_phase_tdata          ;

	always #1 aclk = ~aclk;

	initial begin
		#100;
		aresetn = 1'b1;
	end

	reg [10:0] S_clk_cnt;

	always @(posedge aclk)
		if (~aresetn)
			S_clk_cnt <= 'd2;  //初始值设置大于1的数,等待tdata等信号配置完成,设置0输出波形会为直线 / 设为1,s_axis_config_tdata会在初始状态就开始自加
		else
			S_clk_cnt <= S_clk_cnt+'d1;

	always @(posedge aclk)
		s_axis_config_tvalid <= ((S_clk_cnt == 0)||(S_clk_cnt == 1)); 

	always @(posedge aclk)
		s_axis_config_tlast <= (S_clk_cnt == 1);
		
	always @(posedge aclk)
		if(s_axis_config_tvalid && S_clk_cnt == 1)
			s_axis_config_tdata <= s_axis_config_tdata + s_axis_config_tdata;  //前期自加相位偏移,后期自加频率增加




	dds_compiler_0 dds_compiler_0 (
	.aclk(aclk),                                                        // input wire aclk
	.aresetn(aresetn),                                                  // input wire aresetn
	.s_axis_config_tvalid(s_axis_config_tvalid),                        // 数据有效信号,该信号拉高时,会同步一次tdata的数据,从而改变波形
	.s_axis_config_tdata(s_axis_config_tdata),                          // 配置数据总线,位 [31:16]:频率控制字,位 [15:0]:相位偏移
	.s_axis_config_tlast(s_axis_config_tlast),                          // 该信号拉高代表当前数据包传输完成

	.m_axis_data_tvalid(m_axis_data_tvalid),                            // output wire m_axis_data_tvalid
	.m_axis_data_tdata(m_axis_data_tdata),                              // output wire [31 : 0] m_axis_data_tdata
	.m_axis_phase_tvalid(m_axis_phase_tvalid),                          // output wire m_axis_phase_tvalid
	.m_axis_phase_tdata(m_axis_phase_tdata),                            // output wire [15 : 0] m_axis_phase_tdata
	.event_s_config_tlast_missing(event_s_config_tlast_missing),        // output wire event_s_config_tlast_missing
	.event_s_config_tlast_unexpected(event_s_config_tlast_unexpected)  // output wire event_s_config_tlast_unexpected
	);
	
	reg                                 S_ch0_valid                 ;  //将通道1和通道2采样时间分开
    reg                [  15: 0]        S_ch0_cos                   ;
    reg                [  15: 0]        S_ch0_sin                   ;
    reg                [  15: 0]        S_ch0_pha                   ;
    
    reg                [  15: 0]        S_ch1_cos                   ;
    reg                [  15: 0]        S_ch1_sin                   ;
    reg                [  15: 0]        S_ch1_pha                   ;

	always @(posedge aclk ) 
	  if (!aresetn) begin
		S_ch0_valid <= 1'b1;
	  end else begin
		S_ch0_valid <= ~S_ch0_valid;
	  end
	always @(posedge aclk ) 
	  if (S_ch0_valid) begin
		S_ch0_cos <= m_axis_data_tdata[15:0];
		S_ch0_sin <= m_axis_data_tdata[31:16];
		S_ch0_pha <= m_axis_phase_tdata;
		S_ch1_cos <= S_ch1_cos;
		S_ch1_sin <= S_ch1_sin;
		S_ch1_pha <= S_ch1_pha;
	  end else begin
		S_ch0_cos <= S_ch0_cos;
		S_ch0_sin <= S_ch0_sin;
		S_ch0_pha <= S_ch0_pha;
		S_ch1_cos <= m_axis_data_tdata[15:0];
		S_ch1_sin <= m_axis_data_tdata[31:16];
		S_ch1_pha <= m_axis_phase_tdata;
	  end
endmodule

全部评论

相关推荐

05-07 20:52
吉林大学 Java
点赞 评论 收藏
分享
HaxyBT:那我提前下班总可以了吧
点赞 评论 收藏
分享
03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务