FGPA串口通信作业.docx
《FGPA串口通信作业.docx》由会员分享,可在线阅读,更多相关《FGPA串口通信作业.docx(20页珍藏版)》请在冰豆网上搜索。
FGPA串口通信作业
河北科技大学硕士学位研究生
2015——2016学年第二学期
《FPGA器件原理及应用》结课论文
学院:
信息科学与工程学院
专业:
测试计量技术及仪器
姓名:
赵久强
学号:
2201514006
FPGA实验基于FPGA的串口通信实验
1、实验目的
1.熟悉quartus的VHDL文本设计流程全过程,学习电路的设计、多层次电路设计、仿真和硬件测试。
2.学习IP核生成的过程,以及testbench文件的编写。
3.了解FPGA内部丰富的存储单元,对fifo核有一个深刻理解。
4.熟悉基于FPGA的串口通信的相关知识,实现串口通信的仿真验证。
2、实验内容
串行接口的应用非常广泛,为了实现串口通信功能一般使用专用串行接口芯片。
对一个设备的处理器来说,要接收和发送串行通信的数据,需要一个器件将串行的数据转换成并行的数据以便于处理器进行处理,这种器件就是UART通用异步收发器。
用VHDL语言设计逻辑电路,将各个模块的电路封装成器件,在顶层设计中通过连线,完成整个系统的设计。
串行通信即串行数据传输,实现FPGA与PC的串行通信。
在实际中,特别是在FPGA的调试中有着很重要的应用。
调试过程一般是先进行软件编程仿真,然后将程序下载到芯片中验证设计的正确性,目前还没有更好的工具可以在下载后实时地对FPGA的工作情况和数据进行分析。
通过串行通信,可以向FPGA发控制命令让其执行相应的操作,同时把需要的数据通过串口发到PC上进行相应的数据处理和分析,以此来判断FPGA是否按设计要求工作。
这样给FPGA的调试带来了很大方便,在不需要DSP等其他额外的硬件条件下,只通过串口就可以完成对FPGA的调试。
本文是基于FPGA的串口通信实验,设计实现了与PC的串行通信的仿真。
调用了一个FIFO核。
总体框图如图1所示。
图1总体框图
3、实验步骤
(1)首先我们建立一个FIFO核,然后在调试主程序中调用这个我们建立的这个核,从而进行串口通信的仿真。
打开quartus12.0软件,如图2所示。
图2软件示意图
(2)打开tools,找到MegaWizardPlug-InManager,如图3所示
图3软件示意图
(3)接下来,我们可以看到如下界面,看到IP核的设置界面。
我们选择第一项建立一个新核。
图4软件示意图
(4)接下来有如下界面,我们在左边的搜索框的里面搜索FIFO,然后出现了fifo,我们双击它,然后我们这里选择VHDL,然后在编辑fifo核的名字,例如rx_tx_buffer.如图5所示
图5软件示意图
(5)然后弹出如下界面,在这里我们选择CycloneIII,8位和256字,在下面选择读时钟和写时钟分开。
图6软件示意图
(6)我们按照要求选择第一个,一个时钟沿触发。
图7软件示意图
(7)按照我们的要求,在下面的设置界面勾选我们的所需要的控制信号,读空写满信号。
如下图8所示
图8软件示意图
(8)接下来我们选择fifo的模式,按照下面的设置。
图9软件示意图
(10)最后按照我们需要,选择生成的文件。
如下图10所示。
图10软件示意图
(11)我们的fifo核已经创建完成,接下来我们要在quartus12.0创建工程.第一步打开quartus。
图11软件示意图
(12)接下来我们创建工程,将串口程序加入,创建一个工程,如图11,12所示。
图12软件示意图
图13软件示意图
(13)我们将tb文件和主程序文件添加进去。
图14软件示意图
(14)我们选择芯片型号,设置语言VHDL还有仿真设置。
如图所示。
图15软件示意图
(15)接下来我们创建好的工程添加fifo核。
如图所示
图16软件示意图
(16)最后我们进行仿真,观察实验结果。
图17软件示意图
(17)仿真如图所示。
图18软件示意图
四、实验结论
本实验主要利用quartus12.0生成fifo核。
然后经过quartus创建工程,编写串口程序,调用fifo核,实现串口通信的功能,通过编写tb文件,实验所要达到的结果。
五、附录
testbench文件:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
useieee.std_logic_arith.all;
useieee.std_logic_signed.all;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--USEieee.numeric_std.ALL;
ENTITYtb_UART_AnIS
ENDtb_UART_An;
ARCHITECTUREbehaviorOFtb_UART_AnIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTUART_An
PORT(
reset:
INstd_logic;
mclk:
INstd_logic;
mode:
INstd_logic_vector(1downto0);
serial_in:
INstd_logic;
serial_out:
OUTstd_logic;
fcw:
INstd_logic_vector(31downto0);
send_clk:
INstd_logic;
send_requst:
INstd_logic;
send_data:
INstd_logic_vector(7downto0);
tx_fifo_full:
OUTstd_logic;
rd_clk:
INstd_logic;
rd_data:
OUTstd_logic_vector(7downto0);
rd_requst:
INstd_logic;
rd_fifo_empty:
OUTstd_logic
);
ENDCOMPONENT;
--Inputs
signalreset:
std_logic:
='0';
signalmclk:
std_logic:
='0';
signalmode:
std_logic_vector(1downto0):
=(others=>'0');
signalserial_in:
std_logic:
='0';
signalfcw:
std_logic_vector(31downto0):
=(others=>'0');
signalsend_clk:
std_logic:
='0';
signalsend_requst:
std_logic:
='0';
signalsend_data:
std_logic_vector(7downto0):
=(others=>'0');
signalrd_clk:
std_logic:
='0';
signalrd_requst:
std_logic:
='0';
--Outputs
signalserial_out:
std_logic;
signaltx_fifo_full:
std_logic;
signalrd_data:
std_logic_vector(7downto0);
signalrd_fifo_empty:
std_logic;
signalcnt:
integer;
--Clockperioddefinitions
constantmclk_period:
time:
=10ns;
constantsend_clk_period:
time:
=50ns;
constantrd_clk_period:
time:
=50ns;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
UART_AnPORTMAP(
reset=>reset,
mclk=>mclk,
mode=>mode,
serial_in=>serial_in,
serial_out=>serial_out,
fcw=>fcw,
send_clk=>send_clk,
send_requst=>send_requst,
send_data=>send_data,
tx_fifo_full=>tx_fifo_full,
rd_clk=>rd_clk,
rd_data=>rd_data,
rd_requst=>rd_requst,
rd_fifo_empty=>rd_fifo_empty
);
--Clockprocessdefinitions
mclk_process:
process
begin
mclk<='0';
waitformclk_period/2;
mclk<='1';
waitformclk_period/2;
endprocess;
send_clk_process:
process
begin
send_clk<='0';
waitforsend_clk_period/2;
send_clk<='1';
waitforsend_clk_period/2;
endprocess;
rd_clk_process:
process
begin
rd_clk<='0';
waitforrd_clk_period/2;
rd_clk<='1';
waitforrd_clk_period/2;
endprocess;
SYS_RST_P:
process
begin
--holdresetstatefor100ns.
reset<='1';
waitfor100ns;
reset<='0';
wait;
endprocess;
--自环模式
serial_in<=serial_out;
--设定波特率
fcw<=X"1FFFFFFF";--conv_std_logic_vector(100000,32);
rd_requst<='1';
--Stimulusprocess
stim_proc:
process(send_clk)
begin
--MAC0stimulus
ifreset='1'then
mode<="10";
cnt<=0;
elsifsend_clk'eventandsend_clk='1'then
cnt<=cnt+1;
casecntis
when140=>--打入配置端口命令
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when141=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when142=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when143=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when144=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when145=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when146=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when147=>
send_requst<='1';
send_data<=conv_std_logic_vector(cnt,8);
when148=>--去除DATAFIFO空
send_requst<='0';
send_data<=conv_std_logic_vector(0,8);
whenothers=>
send_requst<='0';
send_data<=conv_std_logic_vector(0,8);
endcase;
endif;
endprocess;
END;