您的当前位置:首页正文

基于XILINX-FPGA数字系统设计-实验五

2024-10-18 来源:威能网


XILINX第五次 上机报告

班级: 学号: 姓名:

实验内容

1、 VHDL状态机实验 2、 SDK实验 3、 实验作业

 VHDL状态机实验

一、 实验介绍

本实验将完成下图中的状态机CNTR_FSM的RTL描述

二、 实验目标

1) 学习状态机的VHDL语言描述方法

2) 学习状态机的单进程和多进程描述方法

CNTRL_FSM的状态机如图所示:

三、 实验步骤 1. 创建一个新的工程

1) 打开ISE,选择菜单栏中分file→New Project,注意工程路径不能有中

文或空格; 2) 单击next,填入器件参数;

3) 一直Next直到完成工程创建,点击Finish;

2. 创建ALU模块的实体

1) 选择菜单栏中的Project→New Source

2) 选择左侧VHDL Module右侧file Name栏中填入文件名CNTRL_FSM 3) 在define module窗口中输入端口的定义

3. 导入实验三中定义的包集合CALC1_PAK。

1) 由于MEM和FSM有相同的MY_RECORD类型信号的互联,导入CALC1_PAK

可以保持两个模块之间数据的一致性。选择Project→ Add Copy of Source,选中实验三中的CALC1_PACKAGE.vhd,单击open;如果没有实验三中的包文件,也可以选择New Source→VHDL Package 重新编写 2) 在FSM中用use语句声明使用CLAC1_PAK

3) 在关键字architecture和begin之间,定义一个枚举类型STATE_TYPE,

枚举的值为图 6. 21中的状态值。

4) 定义两个STATE_TYPE类型的信号CURR_STATE和NEXT_STATE 5) 添加描述FSM的状态转换代码 4. 语法检查

双击Check Syntax,如果代码出现语法错误,请修正错误后再进行下面的步骤;

5. 创建测试平台文件

创建一个测试平台文件,并验证ALU模块的功能是否正确; 1) 选择菜单栏的 ProjectNew Source;

2) 在 Select Source Type 窗口中,左侧选择VHDL Test Bench,右侧 File

Name栏中填入文件名CNTRL_FSM_TB; 3) 点击Next,软件弹出一个界面,询问测试平台文件与哪个设计文件关联,

选择CNTRL_FSM • 在ISE默认的仿真情况下,仿真平台中使用的下层元件信号是无法在波形窗口中看到的。读者需要手动将下层的信号加入到仿真波形中 • 在Sources窗口中选中CNTRL_FSM_TB,在Processes窗口中双击Simulate Behavioral VHDL Module,在弹出的仿真波形窗口中,可以看到仿真的波形

• 在Sources中选择CNTRL_FSM_TB的下层模CNTRL_FSM,在Processes中即可看到下层模块的内部信号,选中CURRENT_STATE信号,并将其拖动到仿真波形窗口中

实验代码

CALC1_PACKAGE.VHD • ibrary IEEE;

• use IEEE.STD_LOGIC_1164.all; • package CALC1_PAK is •

• type MY_RECORD is record

• A_IN : std_logic_vector ( 3 downto 0 ); • B_IN : std_logic_vector ( 3 downto 0 );

• OP_CODE : std_logic_vector ( 3 downto 0 ); • C_IN : std_logic;

• EXP_OUT : std_logic_vector ( 3 downto 0 ); • end record MY_RECORD; •

• end package CALC1_PAK;

CNTRL_FSM.VHD • library IEEE;

• use IEEE.STD_LOGIC_1164.ALL; • use IEEE.STD_LOGIC_ARITH.ALL;

• use IEEE.STD_LOGIC_UNSIGNED.ALL; • use work.CALC1_PAK.all; • entity CNTRL_FSM is

• Port ( DATA_FRAME : in MY_RECORD; • CLK : in STD_LOGIC; • RESET : in STD_LOGIC;

• A_IN : out STD_LOGIC_VECTOR (3 downto 0); • B_IN : out STD_LOGIC_VECTOR (3 downto 0); • C_IN : out STD_LOGIC;

• OP_CODE : out STD_LOGIC_VECTOR (3 downto 0); • EXP : out STD_LOGIC_VECTOR (3 downto 0); • ADDR : out STD_LOGIC_VECTOR (2 downto 0); • COMP_EN : out STD_LOGIC; • ALU_EN : out STD_LOGIC; • MEM_EN : out STD_LOGIC); end CNTRL_FSM;

• architecture Behavioral of CNTRL_FSM is

• type CNTRL_STATE is ( S0_INIT, S1_FETCH, S2_ALU, S3_COMP, S4_DONE );

• signal CURR_STATE, NEXT_STATE : CNTRL_STATE; • signal ADDR_I, ADDR_Q : std_logic_vector ( 2 downto 0 ); • begin

• ADDR <= ADDR_Q; -- update output port from synchronous internal signal

• SYNC : process ( CLK, RESET ) • begin

• if ( RESET = '1' ) then

• CURR_STATE <= S0_INIT;

• ADDR_Q <= ( others => '0' ); • elsif rising_edge (CLK) then

• CURR_STATE <= NEXT_STATE; • ADDR_Q <= ADDR_I; • end if;

• end process SYNC;

 SDK实验

一、 实验介绍

本实验将指导大家向嵌入式系统中添加一个定时器,并利用该定时器编写应用程序。我们将会使用Software Developers Kit (SDK)来编写和调试程序。 二、 实验目标

1.

2. 3. 4. 5.

通过中断控制器来利用定时器 向定时器添加一个中断处理程序 编写中断处理函数 生成比特流

使用SDK来设置断点调试程序,并观察内存中的变量值

三、 实验过程

本实验将会扩展实验四中的硬件设计,添加一个XPS中断控制器和XPS定时器,并编写一个中断处理程序来统计时钟产生的中断个数。

注:本次实验需要用到开发板上的LED,因此在新建工程时,要将LEDs_8Bit设备选中

四、 实验步骤

1) 继续实验三的内容,创建一个lab5文件夹,将lab4中的内容复制到新文

件夹中。

2) 从IP目录下添加以下IP到硬件设计中。

•从DMA and Timer 中添加XPS Timer/Counter

•从Clock, Reset, and Interrupt中添加XPS Interrupt Controller

3) 修改实例名,将timer和interrupt controller作为PLB总线上的从设备。 4) 在Addresses标签中,将中断控制器和定时器的地址空间都设为64K,并

点击Generate Addresses

5) 在Ports标签下,将delay实例的Interrupt端口的net列改名为Timer1 6) 展开microblaze0实例,在Interrupt端口的Net列上选择New Connection。

这将生成一个名为microblaze_0_INTERRUPT的连接 7) 通过以下步骤,将中断控制器和定时器连接起来

将xps_intc_0实例的Irq输出端口连接到microblaze0的microblaze_0_INTERRUPT输入端口;单击xps_intc_0的intr域,打开Interrupt Connection对话框,单击左边的Timer1,点击将其添加到右边的Connected Interrupts域,然后点击OK;将delay实例的CaptureTrig0端口的net列改名为net_gnd

8) 双击delay实例,打开配置对话框,将Only One Timer is Present选中 9) 点击Hardware → Generate Bitstream

 运行SDK,创建一个新的工程

1) 选择Software → Launch Platform Studio SDK 2) 选择Import XPS Application Projects并点击next 3) 选中TestApp_Memory,点击Finish

这将会生成SDK_Projects/TestApp_Memory目录,其中的内容是Base System Builder所创建的软件项目的拷贝 4) 右击lab4.c,选择delete

5) 选择File→ Import,在向导中,双击File System,将lab5.c复制到工程目录下,选择工程所在目录,选中lab5.c,在Into Folder栏内选中TestApp_Memory,选择Finish

6) 双击lab5.c打开编辑器,屏幕下方控制台中将会显示出代码中存在的错误。

7) 双击击第二个错误,将会定位到代码出错的位置

8) 声明一个unsigned int 类型的全局变量,初始化为1,保存文件之后,这个错误将会消失

9) 继续修改其他的错误.增加一个int类型的全局变量,并初始化为0,这样,第二个错误将会消失。

 为XPS定时器创建重点控制器

1) 在lab5.c中,找到中断处理函数timer_int_handler 2) 创建一个局部变量unsigned int csr;

 创建中断处理函数的第一步是检验定时器是否产生了中断。可以通过查看

XPS Timer的控制状态寄存器来确定。打开API文档,查看控制状态寄存器是如何工作的。

 移除TestApp_Memory_linker_script.ld文件,添加lab5_LinkScr.ld文件作为本

工程的连接脚本。

a、 右击TestApp_Memory,选择Properties,打开属性对话框。(也可从菜单栏选择Project → Properties)

b、 在对话框左边选中C/C++ Build,选择Linker Script选项,点击删除按

删除TestApp_Memory_linker_script.ld文件

添加lab5_LinkScr.ld文件

c、 点击添加按钮

 生成比特流并下载至FPGA

a、 连接并启动开发板

b、 选择Device Configuration → Program FPGA c、 选择TestApp_Memory.elf文件 d、 点击Save and Programe

五、 实验结果

本次实验指导大家向系统中添加了一个XPS定时器和中断控制器,并为中断设备添加了一个中断处理函数,然后在硬件上进行了验证。最后,使用了SDK的调试器观察了变量的值和内存中的内容。 实验结果分析

Lab5.c代码分析:

全局变量:

count:中断计数器

timer_count:终端频率 函数:

timer_int_handler:

首先通过cstr=XTmrCtr_mGetControlStatusReg(baseaddr, 0);来获取控制状态寄存器的地址。

然后将csr和XTC_CSR_INT_OCCURED_MASK宏相与来判断控制寄存器的第23为是否被置位。如果中断产生(执行if语句里面的内容),将计数器加一,并设置标志位。

采用LEDs_8Bit来显示出中断产生的次数,并用xil_printf函数将该数值输出 使用这个函数(XTmrCtr_mSetControlStatusReg(baseaddr, 0, csr);)来清除中断。

因篇幅问题不能全部显示,请点此查看更多更全内容