FPGA实验一:简单分频器的设计 - 图文

更新时间:2024-02-26 23:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

专业:__电子信息工程__ 姓名:_____陈华杰_____ 实验报告

学号:______ 日期:___星期五上午___ 地点:应电楼303桌号2组 课程名称:_____FPGA实验______指导老师:__竺红卫/陈宏__成绩:__________________ 实验名称:___实验一:简单分频器的设计____实验类型:_FPGA实验_同组学生姓名:__

一、实验目的和要求(必填)

1. 熟悉 Xilinx ISE 软件,学会设计、仿真、综合和下载; 2. 熟悉实验板电路设定频率的方法。

二、实验内容和原理(必填) 实验内容:

根据实验板上晶振的输入频率 50MHz,如果直接用这么高的时钟频率来驱动 LED 的闪烁,人眼将无法分辨。因此本实验着重介绍如何通过分频计数器的方式将 50MHz 的输入频率降低为人眼可分辨的频率(10Hz 以下),并在实验板的 LED0~LED7上显示出来。

LED照片如下图:

实验原理:

实验板在滑动开关的上面有8 个独立的贴片LED。 LED 一端接地,另一端通过390 欧的限流电阻接到Spartan-3E 上。要点亮一个LED,向相应的控制位置输出高电位。

三、主要仪器设备(必填) 1. 电脑一台;

2. 实验板一块,XilinxSpartan-3E; 3. 实验板电源一只;

4. 实验板连接电脑的下载线一根。

四、实验步骤和现象

1.新建Project和Verilog Module

打开电脑桌面上的 Xilinx ISE14.1 软件,选择 project→new project 建立新项目,输入 project name。

第1页,共17页

核对选择 Spartan3E 和 XC3S500E 和 FG320 的封装形式。

跳出下面的选择框。

第2页,共17页

选择 New Source,并在下面的选择框中选 Verilog Module,填写刚才的 new project name。

跳出下面的选择框。点击 NEXT。

第3页,共17页

输入文件名,跳出下面的选择框。点击 NEXT。

跳出下面的选择框。点击 FINISH。

第4页,共17页

2.建立约束文件

选中 Source for Project 窗口中的 test1.v 文件,在 Processes 进程窗口中双击 Create New Source。

进入 New Source 对话框,选择 Implementation Constraints File, 并键入 File Name“test1”和 Location(路径), Next.

第5页,共17页

5.接入实验板,下载程序

连接实验板并打开电源。双击Configue Programming File,创建PROM配置文件.mcs文件,选择OK。

跳出界面,双击BOUNDARY SCAN

在右边空白处,鼠标右键,选择Initialize Chain.

第11页,共17页

跳出界面。

选择bit文件,选择OPEN。出现下面的界面,选择NO。

出现下面的界面,选择BYPASS。

第12页,共17页

出现下面的界面,选择BYPASS。

出现下面的界面,选择OK。

点击Xilinx FPGA右键,选择PROGRAM。

第13页,共17页

出现下面的界面即可。

其中,RESET是右下角的SW0。 6.例程实验现象

初始时刻右边7个LED亮,左边第一个LED灭。以约6秒为周期,LED灭灯的位置依次从左向右循环移动。

五、思考题

1.若要LED实现周期为2秒的闪烁,分频计数器应该如何改写。默认LED状态为灭,灯亮的位置移动。 答:LED移动频率为0.5Hz。50MHz÷0.5Hz=108,10810=5F5E1001?6,二进制位位数为27。再考虑到走马灯的状态与例程相反。将例程作如下改动: ?

1) cnt的位宽改为27;

2) cnt转折周期改为27’h5F5E100;

3) 最后的assign语句中,寄存器变量led在赋值前不取反。 修改后的程序如下: `timescale 1ns/1ns

module race(rst_n, clk, led_d0, led_d1, led_d2, led_d3, led_d4, led_d5, led_d6, led_d7);

第14页,共17页

inputrst_n;

input clk;output led_d0; // VX-SP3e 开发板上位号为D0 的LED output led_d1; // VX-SP3e 开发板上位号为D1 的LED output led_d2; // VX-SP3e 开发板上位号为D2 的LED output led_d3; // VX-SP3e 开发板上位号为D3 的LED output led_d4; // VX-SP3e 开发板上位号为D4 的LED output led_d5; // VX-SP3e 开发板上位号为D5 的LED output led_d6; // VX-SP3e 开发板上位号为D6 的LED output led_d7; // VX-SP3e 开发板上位号为D7 的LED

// --------------------------------------------------------------------------- // clk使用的是输入频率为50MHz 的时钟,cnt各位的频率将如 // cnt[23] = 2.98Hz;cnt[24] = 1.49Hz;cnt[25] = 0.745Hz。 // 如果希望走马灯使用其他频率闪烁,修改cnt的位宽即可 // --------------------------------------------------------------------------- reg [26:0] cnt;

always @ ( posedgeclk ) if ( rst_n ) cnt<= 27'd0; elsecnt<= cnt + 1'b1; reg [7:0] led;

always @ ( posedgeclk ) if ( rst_n )

led <= 8'b00000001; //按键复位

else if ((cnt == 27’h5F5E100) && (led == 8'b10000000)) led <= 8'b00000001; //循环一周后开始下一周的循环 else if (cnt ==27’h5F5E100)

led <= led << 1; //左移一位,右端补零

// ---------------------------------------------------------------------------

// 四个LED 都使用了上拉,默认为1,所以走马灯可以使用取反来实现。 // --------------------------------------------------------------------------- assign led_d2 = led[2]; assign led_d4 = led[4]; assign led_d3 = led[3]; assign led_d5 = led[5]; assign led_d0 = led[0]; assign led_d1 = led[1]; assign led_d6 = led[6]; assign led_d7 = led[7]; endmodule

2.设计4个灯同时走的走马灯实验,变化周期是10秒。默认LED状态为灭,灯亮的位置移动。 答:LED移动频率为0.1Hz。50MHz÷0.1Hz=5×108,5×10810=1DCD6500?16,二进制位位数为29。再考虑到走马灯的状态与例程相反。将例程作如下改动: ?

1) cnt的位宽改为29;

第15页,共17页

2) cnt转折周期改为29’h1DCD6500;

3) 将LED的点亮状态改成4个同时亮,并且在循环一周后逐步开始下一周的循环时,使用枚举的方

式编程;

4) 最后的assign语句中,寄存器变量led在赋值前不取反。 修改后的程序如下: `timescale 1ns/1ns

module race(rst_n, clk, led_d0, led_d1, led_d2, led_d3, led_d4, led_d5, led_d6, led_d7); inputrst_n;

input clk;output led_d0; // VX-SP3e 开发板上位号为D0 的LED output led_d1; // VX-SP3e 开发板上位号为D1 的LED output led_d2; // VX-SP3e 开发板上位号为D2 的LED output led_d3; // VX-SP3e 开发板上位号为D3 的LED output led_d4; // VX-SP3e 开发板上位号为D4 的LED output led_d5; // VX-SP3e 开发板上位号为D5 的LED output led_d6; // VX-SP3e 开发板上位号为D6 的LED output led_d7; // VX-SP3e 开发板上位号为D7 的LED

// --------------------------------------------------------------------------- // clk使用的是输入频率为50MHz 的时钟,cnt各位的频率将如 // cnt[23] = 2.98Hz;cnt[24] = 1.49Hz;cnt[25] = 0.745Hz。 // 如果希望走马灯使用其他频率闪烁,修改cnt的位宽即可 // --------------------------------------------------------------------------- reg [28:0] cnt;

always @ ( posedgeclk ) if ( rst_n ) cnt<= 29'd0; elsecnt<= cnt + 1'b1; reg [7:0] led;

always @ ( posedgeclk ) if ( rst_n )

led <= 8'b00001111; //按键复位

else if ((cnt == 29’h1DCD6500) && (led == 8'b11110000)) led<= 8'b11100001;

else if ((cnt == 29’h1DCD6500) && (led == 8'b11100001)) led<= 8'b11000011;

else if ((cnt == 29’h1DCD6500) && (led == 8'b11000011)) led<= 8'b10000111;

else if ((cnt == 29’h1DCD6500) && (led == 8'b10000111)) led<= 8'b00001111;

else if (cnt ==29’h1DCD6500)

led <= led << 1; //左移一位,右端补零

// ---------------------------------------------------------------------------

// 四个LED 都使用了上拉,默认为1,所以走马灯可以使用取反来实现。 // --------------------------------------------------------------------------- assign led_d2 = led[2]; assign led_d4 = led[4];

第16页,共17页

assign led_d3 = led[3]; assign led_d5 = led[5]; assign led_d0 = led[0]; assign led_d1 = led[1]; assign led_d6 = led[6]; assign led_d7 = led[7]; endmodule

六、最后的困惑

在例程以及思考题里改编的程序中,当寄存器变量cnt计满一个周期时,并没有相应的清零动作,然而cnt仍然能自动复位,并且在实验中,走马灯仍然能按照预期运行。这是为什么呢?

第17页,共17页

本文来源:https://www.bwwdw.com/article/guna.html

Top