vivado 基于cordic IP核的波形发生器
实验原理:
四个拨码开关的状态控制四种不同的波形数据,输入信号有频率为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核的波形发生器相关推荐
- vivado中Cordic IP核使用——计算正余弦(sin/cos)
目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...
- cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切
赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化,三角函数的操作.我介绍下它进行反正切求解的使用: 新建个简单 ...
- vivado CORDIC ip核计算arctan记录
文章目录 前言 一.CORDIC ip核配置 二.CORDIC ip核接口 三.仿真波形 四.工程文件 前言 本文主要记录自己使用vivado CORDIC ip 核计算arctan的过程. 一.CO ...
- cordic ip核 vivado_vivado中Cordic IP核使用——计算正余弦(sin/cos)
目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...
- FPGA--简易DDS信号发生器 (内涵DDS与CORDIC IP核详解)附源码
学习内容 简易DDS信号发生器的设计与验证,产生所需的正弦波.方波锯齿波,并进行verilog验证. 实现功能 可以通过按键控制来输出不同的波形. 开发环境 xilinx spartan6开发板.IS ...
- 11,基于JESD204 IP核的设计实现方法
本篇博主参考了xilinx官方JESD204 IP核的数据手册PG066,具体介绍基于该IP核的JESD204B数据传输实现方法~ 第一次设计 在vivado开发软件中例化JESD204 IP核时,x ...
- xilinx cordic ip核的使用
http://blog.163.com/fantasy_sunny/blog/static/1959182122013113152237210/ 本文介绍如何使用xilinx的CORDIC 核生产一个 ...
- XILINX CORDIC IP核使用记录
问题简述 基于FPGA实现Sobel算法,计算出像素水平和铅直方向的微分dx,dy后,需要计算向量{dx,dy}的模与其夹角,即实现(dx)2+(dy)2\sqrt{(dx)^2 + (dy)^2} ...
- Vivado定制DDR3 IP核注意事项
1.1 Vivado定制DDR3 IP核注意事项 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado定制DDR3 IP核注意事项: 5)结束语. 1.1.2 本 ...
最新文章
- c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
- 光流 | 基于HS光流算法的稠密光流提取(Matlab源代码)
- rust(54)-字符串
- 大数据平台应用 17 个知识点汇总
- 三层架构---理论篇
- javafx 加载_JavaFX 2:如何加载图像
- Hibernate细节
- 春运返程高峰来了 大数据看返京热力
- sql server management studio 修改计算机名_计算机毕业设计之SpringBoot+ES搜房网
- 部门经常加班,该怎么办
- windows7蓝牙怎么打开_PC版微信v2.7.0曝光:支持电脑上打开小程序
- 业务异常通用类及全局异常处理
- 电脑安装系统安装不上的几个问题(解决)
- elastic-job和xxl-job实践对比
- 程序员表白代码php,火热的程序员表白方式,调皮弹窗表白代码,赶紧拿去试试吧...
- 【预防流感】冬春之交推荐吃香菜
- C语言 数组排序 – 冒泡排序
- [已解决] Could not create connection to database server.
- mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
- 智商测试图片素材软件,智商测试图片 测试你智商的图片[100P]