名称:PLL+RAM的IP核配置测试试验设计Verilog代码VIVADO ARTIX-7开发板
软件:VIVADO
语言:Verilog
代码功能:
PLL+RAM的IP核配置测试试验
例化PLL和RAM的IP核,并用在线调试工具查看RAM的写入读出
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:
设计文档:
一、实验简介:
本实验主要是调用xilinx的PLL和RAM,并通过工程的建立,下载,运用xilinx的在线调试工具观察调试信号。
其中PLL的例化过程如下:
首先在菜单中找到IP catalog然后在下图打开的页面中搜索clocking,即时钟IPcore。
双击clocking wizard出现如下对话框,在clocking options界面,由于我们开发板输入的时钟是100Mhz,因此我们在clk_in1输入100Mhz,其他设置如下。
在output clocks界面我们产生一个50Mhz的分频时钟,其他页面采取默认。
整体产生结果如下图示,这样我们就借助于PLL资源产生了一个稳定的50Mhz的时钟。
RAM产生的IP核过程类似,在IP catalog界面我们输入block memory,双击这个IP核。
然后我们选择产生一个single dual port ram。
在接下来的页面我们选择RAM写数据宽度和地址深度,其数据宽度为16bit,深度为1024,即这个ram的地址范围是0-1023。
接下来我们继续设置ram的读地址空间和数据宽度,如下图所示。
这样我们就生成一个例化的ram。
将生成的PLL和RAM例化到实验2代码,同样设置好xdc文件,编译生成该工程的bit文件。
二、实验过程
将目录“... at7_prj_02at7_prjat7_prj.runsimpl_1”文件夹下的 at7_prj.bit 文件下载到开发板上,自动弹出调试界面,我们点击运行,即可观察实际的ram写入和读出过程。
部分代码展示:
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2019/04/13 17:54:08 // Design Name: // Module Name: at7_prj // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module at7_prj( input sys_clk_i,//外部输入100MHz时钟信号 input ext_rst_n ); wire clk_50m; //PLL输出50MHz时钟 wire sys_rst_n; //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作 reg [31:0] clk_cnt; (*mark_debug="TRUE"*)reg ram_wen; (*mark_debug="TRUE"*)reg [15:0] ram_waddr; (*mark_debug="TRUE"*)reg [ 9:0] ram_wdata; (*mark_debug="TRUE"*)reg ram_ren; (*mark_debug="TRUE"*)reg [15:0] ram_raddr; (*mark_debug="TRUE"*)wire [ 9:0] ram_rdata; //PLL例化 clk_wiz_0 u1_clk_wiz_0 ( // Clock in ports .clk_in1(sys_clk_i), // input clk_in1 // Clock out ports .clk_out1(clk_50m), // output clk_out1 // Status and control signals .reset(!ext_rst_n), // input reset .locked(sys_rst_n)); // output locked always @(posedge clk_50m or negedge sys_rst_n) begin if(!sys_rst_n) begin clk_cnt <= 32'h0; end else begin if(clk_cnt > 32'd100000000) begin clk_cnt <= 32'b0; end else begin clk_cnt 32'd1000) begin ram_wen <= 1'b1; end else begin ram_wen <= 1'b0; end end end always @(posedge clk_50m or negedge sys_rst_n) begin if(!sys_rst_n) begin ram_waddr <= 10'b0; end else begin if(ram_wen == 1'b1) begin ram_waddr <= ram_waddr + 10'b1; end else begin ram_waddr <= 10'b0; end end end always @(posedge clk_50m or negedge sys_rst_n) begin if(!sys_rst_n) begin ram_wdata 32'd1002) begin ram_ren <= 1'b1; end else begin ram_ren <= 1'b0; end end end always @(posedge clk_50m or negedge sys_rst_n) begin if(!sys_rst_n) begin ram_raddr <= 10'b0; end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1328
518