实验原理:
四个拨码开关的状态控制四种不同的波形数据,输入信号有频率为50MHz的时钟信号、复位信号以及SW1~SW4四个拨码开关构成;输出信号有dac_data一个模拟信号。本次实验的系统框图以及对应的电路图如图1所示。波形发生器实例工程模块层次如图2所示

实验步骤:

1.  打开Vivado 2018.3,创建名为TEST的新工程(图4);

2.  点击,搜索添加CORDIC IP核(图6);

图6 选择CORDIC IP核

3、

双击,进行参数配置(图7);

Functional Selection选择Sin and Cos,

Phase Format选择Scaled Radians,

其余参数选择默认参数;

点击OK,生成IP核。

 图7 CORDIC IP核配置页面

再搜索添加ILA IP核(图8);

图8 搜索选择ILA IP核

双击进入参数配置界面,进行ILA IP核的参数配置(图9),点击OK,生成IP核。

  图9 ILA IP核参数配置界面

3.  创建源文件,创建sin_controller.v  wave_controller.v 和 at7.v 三个design sources(图10)。

图10 创建源文件

4.   开始Verilog代码的撰写工作。

(1)编写产生1hz正弦波的sin_controller.v模块,例化CORDIC IP核。

`timescale 1ns / 1nsmodule sin_controller(input clk,                                              //时钟信号input rst_n,                                           //复位信号,低电平有效output[11:0] sin_out                           //sin输出值:11符号位,10、9有符号整数部分,8-0小数部分
);//`define SIM`ifdef SIM                                                 //仿真情况下parameter CNT_MAX=15'd24;               //1us`else                                                        //实际板级情况下parameter CNT_MAX=15'd24_999;      //1ms`endif//---------------------------------------------------
//定时计数reg[14:0] cnt;                                           //1ms计数器always@(posedge clk or negedge rst_n)if(!rst_n) cnt<=15'd0;else if(cnt<CNT_MAX) cnt<=cnt+1'b1;else cnt<=15'd0;//--------------------------------------------------------
//DAC转换数据递增
//位15~13为有符号整数部分
//位12~0为小数部分,取值范围为-1~1reg[15:0] phase_in;always@(posedge clk or negedge rst_n)if(!rst_n) phase_in<=16'he000;else if(cnt == CNT_MAX)beginif(phase_in == 16'h2000) phase_in<=16'he000;else phase_in<=phase_in+16'h10;end//----------------------------------------------------------------------------wire[31:0] m_axis_dout_tdata;cordic_0           uut_cordic_0(.aclk(clk),.s_axis_phase_tvalid(1'b1),.s_axis_phase_tdata(phase_in),.m_axis_dout_tvalid(),.m_axis_dout_tdata(m_axis_dout_tdata));//INST_TAG_END-------------------------------------------------------------assign sin_out = m_axis_dout_tdata[15:4];endmodule

(2) 编写wave_controller.v模块,该模块对四个拨码开关核所实现的四种不同波形输出做控制。

SW开关状态

输出波形

SW1

SW2

SW3

SW4

OFF

OFF

OFF

OFF

0V电压

ON

X

X

X

1Hz正弦波

OFF

ON

X

X

1Hz三角波

OFF

OFF

ON

X

1Hz方波

OFF

OFF

OFF

ON

3.3V电压

`timescale 1ns / 1nsmodule wave_controller(input clk,             //时钟信号25MHzinput rst_n,          //复位信号,低电平有效//波形设置信号,低电平有效//位3-----输出高电平波形,位2--方波,位1--三角波,位0--正弦波(*mark_debug="true"*)input[3:0] wave_set,(*mark_debug="true"*)output reg[7:0] dac_data         );//---------------------------------------------------------------------
//1HZ正弦波生成wire[11:0] sin_out;reg[11:0] sin_tmp;wire[7:0] sin_wave;sin_controller   uut_sin_controller(.clk(clk),.rst_n(rst_n),.sin_out(sin_out));always@(posedge clk or negedge rst_n)if(!rst_n) sin_tmp<=12'd0;else if((sin_out>=12'hc00)||(sin_out<12'h400)) sin_tmp<=sin_out+12'h400;assign sin_wave = {sin_tmp[10:3]-{2'b00,sin_tmp[10:5]}} ; //将sin波形缩小位3/4
//----------------------------------------------------------------------------------------------
//1Hz三角波的产生reg[15:0] tcnt;reg[8:0] triangle_tmp;reg[7:0] triangle_wave;//1s定时always@(posedge clk or negedge rst_n)if(!rst_n) tcnt<=9'd0;else if(tcnt < 16'd48827) tcnt<=tcnt+1'b1;else tcnt<=16'd0;//512个点计数always@(posedge clk or negedge rst_n)if(!rst_n) triangle_tmp<=9'd0;else if(tcnt == 16'd48827) triangle_tmp<=triangle_tmp+1'b1;//三角波数据的产生always@(posedge clk or negedge rst_n)if(!rst_n) triangle_wave<=8'd0;else if(triangle_tmp<9'd256) triangle_wave<=triangle_tmp[7:0];else triangle_wave<=~triangle_tmp[7:0];//1Hz方波的产生reg[24:0] scnt;reg[7:0] square_wave;//1s定时always@(posedge clk or negedge rst_n)if(!rst_n) scnt<=25'd0;else if(scnt<25'd24_999_999) scnt<=scnt+1'b1;else scnt<=25'd0;//1000个点波形的产生always@(posedge clk or negedge rst_n)if(!rst_n) square_wave<=8'h00;else if(scnt<25'd12_500_000) square_wave<=8'h00;else square_wave<=8'hff;//-----------------------------------------------------------------------
//输出波形选择always@(posedge clk or negedge rst_n)if(!rst_n) dac_data<=8'd0;else if(!wave_set[3]) dac_data<=8'hff;else if(!wave_set[2]) dac_data<=square_wave;else if(!wave_set[1]) dac_data<=triangle_wave;else if(!wave_set[0]) dac_data<=sin_wave;else  dac_data<=8'd0;endmodule

(3)编写顶层模块at7.v,实现对子模块wave_controller.v和ILA IP核的例化。

`timescale 1ns / 1ns
//
// Company:
// Engineer:
//
// Create Date: 2021/11/20 21:49:35
// Design Name:
// Module Name: at7
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module at7(input sys_clk_i,//外部输入50hz时钟input ext_rst_n,//外部输入复位信号,低电平有效input[3:0] wave_set     );//--------------------------------------------
// //PLC例化
//      wire clk_12m5;
//      wire clk_25m;
//      wire clk_50m;
//      wire clk_100m;
//      wire sys_rst_n;//  clk_wiz_0 u1_clk_wiz_0
//   (
//    // Clock out ports
//    .clk_out1(clk_12m5),     // output clk_out1
//    .clk_out2(clk_25m),     // output clk_out2
//    .clk_out3(clk_50m),     // output clk_out3
//    .clk_out4(clk_100m),     // output clk_out4
//    // Status and control signals
//    .reset(!ext_rst_n), // input reset
//    .locked(sys_rst_n),       // output locked
//   // Clock in ports
//    .clk_in1(sys_clk_i));      // input clk_in1  //--------------------------------------------------------wire [7:0] dac_data;wave_controller uut_wave_controller(.clk(sys_clk_i),.rst_n(ext_rst_n),.wave_set(wave_set),.dac_data(dac_data));//-------------------------------------------------ila_0    t_ila_0 (.clk(sys_clk_i), // input wire clk.probe0(dac_data),.probe1(wave_set));endmodule

5. 编写testbench,进行仿真,仿真结果如图所示。

6.  点击Vivado界面左侧的RTL_ANLYSIS>Open Elaborated Design>>以进行后续的管脚分配工作,弹出的对话窗口中选择ok以继续。

打开elaborated design窗口后选择上方的Layout>I/O Planning进行管脚分配工作,在下方出现的I/O Ports窗口中进行管脚分配,都选择3.3v电平以及Package Pin选择对应的管脚。

7、双击Sources>Constraints>constrs_1中的管脚约束文件,可以查看到各个输入输出端的管脚设置情况,关闭Elaborated Design窗口,在弹出的对话框中选择OK以继续并保存约束配置。

8、点击Vivado窗口左侧的Program and debug>Generate bitstream选项,生成比特流,弹出的对话框中选择yes以继续,之后弹出的Launch Runs窗口中单击ok以继续

9、接入开发板并点亮电源,待比特流生成完毕后进行下一步操作,在弹出的生成完成窗口中选择打开硬件管理器(Open Hardware Manager)项并单击OK以继续。

选择硬件管理器窗口上方出现的Open Target选项并选择其中的Auto Connect项以自动连接开发板;

选择Hardware窗口中的xc7z020_1,单击右键选择Program Device选项进行软件的适配工作,弹出的对话框中单击Program项。

10、此时程序应该在开发板上得以成功运行。

运行结果展示:

vivado 基于cordic IP核的波形发生器相关推荐

  1. vivado中Cordic IP核使用——计算正余弦(sin/cos)

    目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...

  2. cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切

    赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化,三角函数的操作.我介绍下它进行反正切求解的使用: 新建个简单 ...

  3. vivado CORDIC ip核计算arctan记录

    文章目录 前言 一.CORDIC ip核配置 二.CORDIC ip核接口 三.仿真波形 四.工程文件 前言 本文主要记录自己使用vivado CORDIC ip 核计算arctan的过程. 一.CO ...

  4. cordic ip核 vivado_vivado中Cordic IP核使用——计算正余弦(sin/cos)

    目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...

  5. FPGA--简易DDS信号发生器 (内涵DDS与CORDIC IP核详解)附源码

    学习内容 简易DDS信号发生器的设计与验证,产生所需的正弦波.方波锯齿波,并进行verilog验证. 实现功能 可以通过按键控制来输出不同的波形. 开发环境 xilinx spartan6开发板.IS ...

  6. 11,基于JESD204 IP核的设计实现方法

    本篇博主参考了xilinx官方JESD204 IP核的数据手册PG066,具体介绍基于该IP核的JESD204B数据传输实现方法~ 第一次设计 在vivado开发软件中例化JESD204 IP核时,x ...

  7. xilinx cordic ip核的使用

    http://blog.163.com/fantasy_sunny/blog/static/1959182122013113152237210/ 本文介绍如何使用xilinx的CORDIC 核生产一个 ...

  8. XILINX CORDIC IP核使用记录

    问题简述 基于FPGA实现Sobel算法,计算出像素水平和铅直方向的微分dx,dy后,需要计算向量{dx,dy}的模与其夹角,即实现(dx)2+(dy)2\sqrt{(dx)^2 + (dy)^2} ...

  9. Vivado定制DDR3 IP核注意事项

    1.1 Vivado定制DDR3 IP核注意事项 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado定制DDR3 IP核注意事项: 5)结束语. 1.1.2 本 ...

最新文章

  1. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  2. 光流 | 基于HS光流算法的稠密光流提取(Matlab源代码)
  3. rust(54)-字符串
  4. 大数据平台应用 17 个知识点汇总
  5. 三层架构---理论篇
  6. javafx 加载_JavaFX 2:如何加载图像
  7. Hibernate细节
  8. 春运返程高峰来了 大数据看返京热力
  9. sql server management studio 修改计算机名_计算机毕业设计之SpringBoot+ES搜房网
  10. 部门经常加班,该怎么办
  11. windows7蓝牙怎么打开_PC版微信v2.7.0曝光:支持电脑上打开小程序
  12. 业务异常通用类及全局异常处理
  13. 电脑安装系统安装不上的几个问题(解决)
  14. elastic-job和xxl-job实践对比
  15. 程序员表白代码php,火热的程序员表白方式,调皮弹窗表白代码,赶紧拿去试试吧...
  16. 【预防流感】冬春之交推荐吃香菜
  17. C语言 数组排序 – 冒泡排序
  18. [已解决] Could not create connection to database server.
  19. mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
  20. 智商测试图片素材软件,智商测试图片 测试你智商的图片[100P]

热门文章

  1. 艾伟_转载:简单的自动更新程序实现
  2. 安全L1-AD.3-DNS代理原理及配置
  3. Python -- 反编译pyc文件
  4. XDL-(1)Linux文件操作命令
  5. 电路分析实验 01 - | 受控电流源电路的仿真测试
  6. 高可用 高性能 高并发
  7. html2canvas微信头像后,微信小程序使用canvas在真机上不显示用户头像问题(不显示网络图片)...
  8. Python中Pygal库的简单使用
  9. 山寨王被山寨 腾讯九城恶性竞争害产业
  10. MySQL字段类型及使用