基于FPGA数字频率计的SOPC实现.docx_第1页
基于FPGA数字频率计的SOPC实现.docx_第2页
基于FPGA数字频率计的SOPC实现.docx_第3页
基于FPGA数字频率计的SOPC实现.docx_第4页
基于FPGA数字频率计的SOPC实现.docx_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于fpga数字频率计的sopc实现课程名称:现代电子技术综合实验姓名:指导老师: 学号:摘要本文介绍了一种数字频率计的sopc实现方法。该设计采用mc8051软核作为sopc系统的控制核心,使用硬件描述语言vhdl在开发平台ise上搭建mc8051的外围电路,共同构建sopc系统。在进行综合、布局布线、生成bit文件、配置实验电路板上的目标器件后,联合使用keil c51进行软件部分的设计与在线仿真,最后在fpga实验电路板上成功验证了设计的功能。经测量数据与真实数据比较,在10-5误差范围内,该频率计能测量频率在0.5hz以上的信号。关键词:mc8051,sopc,fpga,数字频率计一、数字频率计的实现方式及其误差1.1概述在电子技术领域,频率是一个最基本的参数,频率与其它许多参量的测量方案、测量结果都有十分密切的关系。因此,频率的测量非常重要。 在电子实验室中,测量频率的仪器是最重要的仪器之一。目前,绝大多数实验室使用计数式数字频率计测量频率。利用计数式数字频率计测量频率具有精度高、使用方便、测量迅速等一系列突出优点,故已成为近代频率测量的重要手段。目前频率测量主要有3种实现方法:(1)测频法。测频法是指在时基信号的几个周期内计算被测信号的个数,最后得出被测信号的频率。该测量在低频段的相对测量误差较大。(2)测周法。测周法是指在被测信号的几个周期内计算时基信号的个数,最后得出被测信号的频率。这种方法在高频段相对误差较大,增大基准信号频率可以提高测量精度。(3)等精度法。等精度法是指在与被测信号同步的闸门时间内,分别计算被测信号和时基信号的个数,最后通过被测信号与时基信号的个数的相比,再乘以时基信号的频率算出被测信号频率。该方法可以在整个工作频段可以得到相同的相对精度,且测量范围更大、更精确。1.2 三种频率测量方法误差的简要分析 (1)测频法:测频法的公式为:f=n/tn为1次闸门时间内计数器计得被测信号的脉冲数,t为闸门时间的长度。由于n存在1误差,那么测频法的相对误差:1/n绝对误差:1/t即对于测频法,被测信号频率越高或者闸门时间越长,n值就越大,误差就越小。闸门时间固定时,绝对误差固定。(2)测周法:测周法的公式为:f=f/nf为基准时钟的频率,n为被测信号单周期内计得基准时钟的脉冲数。由于n存在1的误差,测周法的相对误差:( -1/ (n+1), 1/ (n-1) )绝对误差:( -f/n(n+1), f/n(n-1) )即对于测周法,被测信号频率越低,基准时钟频率越高,n值越大,误差越小。(3)等精度法:等精度法的公式为:f=(n1/n2)*fn1 、n2分别为与被测信号同步的闸门时间内测得被测信号脉冲数、时基信号脉冲数,f为时基信号频率。由于闸门信号与被侧信号同步,n1无量化误差。n2存在1误差。相对误差:( -1/ (n2+1), 1/ (n2-1) )绝对误差:( -n1f/n2(n2+1), n1f/n2(n2-1) )即时基信号频率越高,n2越大,那么误差就越小。特别当n1=1时,等精度法变为测周法。二、数字频率计的设计与实现2.1测量方式与实现方式的选择本次设计采用等精度法,由于等精度法设计到乘除运算,如果直接用数字电路搭建乘除电路,十分复杂,但mc8051进行乘除十分方便,而且编程容易。所以考虑采用sopc的实现方式来设计频率计。2.2 硬件系统的设计2.2.1 实验所用开发板简介本次实验所用的电路为eec fpga核心板,板上包含一块tq144封装的xc3s250e fpga芯片,使用50mhz有源晶振作时钟输入,含有4个按键,一个8位拨码开关,8位led,8位数码管,提供外部时钟输入引脚,足够满足本次频率计的设计需要。图1给出了开发板上fpga的引脚分配,可以得到引脚约束信息,以供开发时使用。图1 管脚分配2.2.2 硬件系统的整体框架由等精度测量频率的原理可知,频率测量功能的实现需要时钟管理模块、闸门电路、基准时钟、输入信号、两个计数器以及mc8051。模块之间的互联如图2所示。图2 数字电路框图基于上面给出的数字电路框图,各个模块的功能如下:1)dcm时钟管理模块xilinx公司的fpga中提供了一种特殊的时钟管理模块,可以对时钟进行倍频与分频。所用芯片上单个dcm能提供两路输出,分别用作mc8051的时钟和测频电路的基准时钟。因为对单片机在线调试的需求,单片机的时钟固定为18mhz。由之前的理论分析,基准时钟频率更高时,量化误差导致的频率误差会降低,所以基准时钟使用50mhz,所以该模块的功能是对输入的晶振信号进行分频产生一个18mhz和50mhz的方波信号。2)mc8051软核系统整体的处理、控制核心。通过感应反馈回的闸门信号判断何时进行数据的传输,在正确传输数据后并输出高电平的清零信号(clr)使32位计数器清零,在短暂的延时后,使clr变成低电平,以使32位计数器在下次闸门信号到来时做好计数准备。进行数据的乘除运算,判断频率的单位(hz、khz、mhz)并输出有效的低电平信号使相应的指示灯点亮,分离频率各个位的数字(包括小数点的判断),然后通过先送片选后送段选实现数码管的动态显示。3)分频器通过对时钟管理器送来的50mhz方波信号进行分频得到一个0.25hz的方波信号,并送入d触发器。4)闸门信号同步电路使用d触发器产生与被测信号同步的闸门信号,并分别送到两个32位计数器的使能端和mc8051单片机内部。在闸门高电平期间,计数器能正常计数。单片机能通过对闸门信号感应的做出正确的反馈。5)32位计数器在同步闸门信号的使能下,计算被测信号、时基信号的个数。6)64选8多路选择器通过单片输出的选择信号选择送哪8位数据。2.2.3 引脚分配以及下载将上述元件按照框图用top.vhd文件连接,分配引脚并将无用的管脚拉高后,进行综合、布局布线,生成对fpga进行配置的bit文件,使用ise里的impact工具下载至开发板上的fpga内即可。以上就是数字电路硬件部分的工作。2.3 软件系统的设计软件部分应该包括清零信号的控制、数据的处理、显示控制三部分。图3是本次设计程序部分的流程图。图3 程序流程图一、程序功能说明:1)在启动程序后,进行信号判断。若switchsignal=0&cal_flag=0,单片机输出多路选择器选择信号,将数据接收进来,将cal_flag、clr赋值为1,实现32位计数器的清零。在延时1ms后,将clr赋值为0,让32位计数器做好下次计数准备。然后进行数据的计算,算出被测信号的频率,并且判断频率的单位,使相应的指示灯点亮。在得到频率后分离各个位的数字(同时判断小数点的位数)。最后转到显示程序。若switchsignal=1,将cal_flag赋值为0,直接转到显示程序。2)在显示程序中,先送位选码后送段选码,延时1ms,接着送下位数实现数码管的动态显示。在送完所以数后。回到信号判断处以实现程序的无限循环。二、mc8051 ip核中运行的软件应该实现的功能如下:1)闸门信号的接收与计数器clr信号的管理根据输入的同步闸门信号,处理好接收多路选择器的送数、32位计数器的清零、计数器计数前的再次准备三者的前后时序关系。2)数据计算对采集来的数据进行处理。通过对两位数的乘除运算得到被测信号的频率,判断被测频率的单位并送出相应有效的led指示灯点亮信号,分离各个位的数字,包括小数点位置的确定。3)溢出判断再计算出频率后,当频率大于100mhz时,判断溢出,并送出有效的低电平信号使overflow指示灯点亮。4)结果显示将计算的结果显示出来,分别包括mhz、khz、hz三种单位以及溢出的指示led,以及在数码管上显示数字以及小数点的控制。通过位选码选位后段选码送显示,以动态显示的方法实现。程序编写好之后,通过keil进行编译、生成可执行文件,通过在线仿真验证设计功能。三、数据分析3.1数据分析完成整体频率计的制作之后,使用信号源进行测试,测试结果如表1所示实际频率/hz0.51.052080100300测量频率/hz0.499980.999984.9999819.999880.000099.9999300.000相对误差/10-5-4-2-0.4-10-10实际频率/khz1.138906.2810016.420029.4260153.445712.360900测量频率/khz1.138886.2809416.419429.4252153.440712.340900.000相对误差/10-5-1.75608-0.9955262-3.65408-2.71868-3.2585-2.807570实际频率/mhz1.0234.06.2531016.23025.62429.9999测量频率/mhz1.022903.999986.2527610.000016.229425.623929.9990相对误差/10-5-9.77517-0.5-3.838160-3.6968-0.3902-3.00001表1 频率分析表由表1可知,测量数据的相对误差的量度都在10-5上,所以该设计方案满足要求,且测量精度很高,测量范围很广,具有很大的实用价值。3.2误差来源分析3.2.1石英振荡器带来的误差本次所用的石英振荡器输出的频率虽然是50mhz,但是这震荡频率也会有轻微的波动,在10-6误差范围内,所以也会为我们数据的测量带来一定的误差。3.2.2 浮点型运算的舍入误差keil编译器能编译float型变量,float型变量是以8为指数、23位尾数的形式存储。即其单次计算的相对误差为2-23=1.192*10-8,分析此次使用的c程序,共使用了三次浮点型计算(包含两次强制类型转换与一次除法),带来的相对误差应小于3.576*10-8。四、实验结论及总结从实测误差来看,相对误差大约为0.004%,同时在极低或极高频率上的相对误差规律不同,远超过了理论上由量化误差带来的频率误差和浮点运算的舍入误差的总和,推测主要误差是由石英晶振与测试用信号源频率的相对误差带来。经查阅资料,标定此次频率计使用的信号源的频率准确度为(50ppm+1hz),忽略1hz的绝对误差后,相对误差50ppm,即0.005%,远大于以上两种误差带来的相对误差。信号源输出频率的误差已经与比测试数据误差范围更大,可以得出结论:测试数据符合理论误差的分析。本次实验设计了基于sopc系统的数字频率计,并在实验板上实现。最终完成的频率计拥有0.5hz30mhz的量程,并在整个量程之内都能获得10-5范围的误差。同时,受实验条件的限制,无法对其进行更加准确的标定,如果使用更加准确的仪器进行标定,可以继续使精度提高。通过此次频率计的设计实验,对频率的测量方法有了更深的认识。此外,还学习了vhdl硬件描述语言与51单片机c语言开发的相关知识。通过对于整体sopc系统的设计与对fpga的编程实现,培养了一定的对于数字系统的整体设计的能力与思想。五、参考文献1. 姜立东. vhdl语言程序设计及应用 (第二版). 北京邮电出版社 (中).2. 蒋焕文,孙续. 电子测量(第二版). 中国计量出版社 (中).3. 郭天祥. 51单片机c语言教程. 电子工业出版社(中).4. spartan-3 generation user guide . (美).5.万福君,潘松峰,刘芳.mcs-51单片机原理、系统设计与应用.清华大学出版社(中).附录附录1:c51描述:#include /包含8051的sfr寄存器定义头文件#include /管脚申明/数据选择器的位选控制端口接p00、p01、p02/计数器使能信号端接p03: switchsignal/三个指示单位的led灯:1hz:p04、1khz:p05、1mhz:p06、overflow:p07/数据选择器的输出口接p1/6个数码管的位选线接p20、p21、p22/计数器清零信号端接p27: clr/数码管的段选接p3/全局变量申明 sbit switchsignal = p03;sbit clr=p27;#define n 50000000/共阳极char num = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; / 7-seg codes char dot = 0xff,0x7f; / point /控制数码管的段选和片选char buf =0,0,0,0,0,0;char dpn =0,0,0,0,0,0;char chose =0x1f,0x2f,0x37,0x3b,0x3d,0x3e;/sbit led=p04; /清零信号sbit no_in=p26;int cal_flag=0;/函数申明void disp();void datain();void cal(unsigned long data1,unsigned long data2);void divi(long freq,int mul);void delay(unsigned int t)doth0 = 0xfa;tl0 = 0x24;/设置定时器初值(对应0.001s)tr0 = 1;/启动定时器while ( !tf0 );/等待定时器溢出tr0 = 0;/停止定时器tf0 = 0;/清除溢出标志 while ( -t != 0 );/循环t次void main()tmod &= 0x0f;tmod |= 0x01;/将定时器t0设置为方式1,即16位定时器for (;) datain(); disp();void disp() unsigned char i; for (i=0;i6;i+) p3=numbufi&dotdpni; p2&=0x80; p2|=chose5-i; delay(1); void datain()unsigned long data1,data2;unsigned char i;if(no_in=0) for(i=0;i6;i+) dpni=0; bufi=0;else if(switchsignal=1) cal_flag=0; if(switchsignal=0&cal_flag=0) delay(1);for (i=0;i4;i+) p0&=0xf8; p0|=(0x03-i); data1=8; data1+=p1; for (i=0;i4;i+) p0&=0xf8; p0|=(0x07-i); data2=8; data2+=p1; cal(data1,data2);cal_flag=1;clr=1;delay(1);clr=0; void cal(unsigned long data1,unsigned long data2) float freq; int i; freq=(float)data1/data2; freq=freq*50000000; if(freq=1;i-) bufi=bufi-1;buf0=0;dpn0=1; else if(freq1000) p0&=0x0f;p0|=0xe0;freq=freq*10000000; divi(unsigned long)freq,7); else if(freq1000000) p0&=0x0f;p0|=0xd0; freq=freq*1000; divi( unsigned long)freq,6); else if(freq=100000000) p0&=0x0f;p0|=0xb0; divi(unsigned long)freq,6); else p0&=0x0f;p0|=0x70; void divi(unsigned long freq,int mul)int i=0;int temp20;int j;unsigned long lfreq=freq; for (j=0;j6;j+)dpnj=0;while(lfreq!=0) tempi=lfreq%10; i+; lfreq=lfreq/10;if(i-mul-1=0) dpni-mul-1=1; for (j=0;j 0);beginprocess(clk,clr) beginif clr=1 thencounter 0);else if en=1 thenif rising_edge(clk)thencounter=counter+1;end if;end if;end if;end process;counter_out=counter;end behavioral;附录3:分频器vhdl描述library ieee;use ieee.std_logic_1164.all;entity frediv isport(clk:in std_logic; -50mhz时基信号输入 clkout1:out std_logic);-产生2个信号输出周期4s、50mhzend frediv;architecture behavioral of frediv issignal tmp: integer range 1 to 100000000:=1;signal a_var:std_logic:=0;beginprocess (clk)begin-分频器产生周期为3s的信号if rising_edge(clk) thenif tmp = 100000000 thena_var= not a_var;tmp = 1;elsetmp = tmp + 1;end if;end if;end process;clkout1=a_var;-clkout2=clk;end behavioral;附录4:d触发器vhdl描述library ieee;use ieee.std_logic_1164.all;entity d_trigger is port ( d : in std_logic; clk : in std_logic; q : out std_logic; no_in1:out std_logic);end d_trigger;architecture behavioral of d_trigger issignal biaoshi: std_logic;begin process(clk) begin if rising_edge(clk)then q=d;biaoshi=1;end if;end process;no_in1y_outy_outy_outy_outy_outy_outy_outy_outnull;end case;end process;end behavioral;附录6:mc8051vhdl描述library ieee;use ieee.std_logic_1164.all;entity mc8051 is port ( clk : in std_logic; reset : in std_logic; addr_out_user : out std_logic_vector (13 downto 0); data_in_user : in std_logic_vector (7 downto 0); wr_user : out std_logic; int0_i : in std_logic; int1_i : in std_logic; all_t0_i : in std_logic; all_t1_i : in std_logic; all_rxd_i : in std_logic_vector (0 downto 0); p0_i : in std_logic_vector (7 downto 0); p1_i : in std_logic_vector (7 downto 0); p2_i : in std_logic_vector (7 downto 0); p3_i : in std_logic_vector (7 downto 0); p0_o : out std_logic_vector (7 downto 0); p1_o : out std_logic_vector (7 downto 0); p2_o : out std_logic_vector (7 downto 0); p3_o : out std_logic_vector (7 downto 0); all_txd_o : out std_logic_vector (0 downto 0); le : out std_logic_vector (1 downto 0); wr_rs : out std_logic_vector (1 downto 0); ramx_data_o : out std_logic_vector (7 downto 0); end mc8051;architecture behavioral of mc8051 iscomponent mc8051_core_onchip port ( clk : in std_logic; reset : in std_logic; addr_out_user : out std_logic_vector (13 downto 0); data_in_user : in std_logic_vector (7 downto 0); wr_user : out std_logic; int0_i : in std_logic; int1_i : in std_logic; all_t0_i : in std_logic; all_t1_i : in std_logic; all_rxd_i : in std_logic_vector (0 downto 0); p0_i : in std_logic_vector (7 downto 0); p1_i : in std_logic_vector (7 downto 0); p2_i : in std_logic_vector (7 downto 0); p3_i : in std_logic_vector (7 downto 0); p0_o : out std_logic_vector (7 downto 0); p1_o : out std_logic_vector (7 downto 0); p2_o : out std_logic_vector (7 downto 0); p3_o : out std_logic_vector (7 downto 0); all_txd_o : out std_logic_vector (0 downto 0); le : out std_logic_vector (1 downto 0); wr_rs : out std_logic_vector (1 downto 0); ramx_data_o : out std_logic_vector (7 downto 0); end component;beginuu1 : mc8051_core_onchip port map ( clk =clk, reset=reset, addr_out_user= addr_out_user, data_in_user= data_in_user, wr_user= wr_user, int0_i =int0_i, int1_i =int1_i, all_t0_i =all_t0_i, all_t1_i =all_t1_i, all_rxd_i(0) =all_rxd_i(0), p0_i(7 downto 0)=p0_i, p1_i(7 downto 0)=p1_i, p2_i(7 downto 0)=p2_i, p3_i(7 downto 0)=p3_i, p0_o(7 downto 0)=p0_o, p1_o(7 downto 0)=p1_o, p2_o(7 downto 0)=p2_o, p3_o(7 downto 0)=p3_o, all_txd_o(0) =all_txd_o(0), le =le, wr_rs =wr_rs, ramx_data_o= ramx_data_o); end behavioral;附录7:topvhdl描述library ieee;use ieee.std_logic_1164.all;entity top isport (reset:in std_logic;clkbasic: in std_logic;clkbeen: in std_logic;segchose:out std_logic_vector(7 downto 0);bitchose:out std_logic_vector(5 downto 0);led1hz:out std_logic;led1khz:out std_logic;led1mhz:out std_logic;ledoverflow:out std_logic;gate:out std_logic;all_rxd_i : in std_logic_vector (0 downto 0); all_txd_o : out std_logic_vector (0 downto 0) -clr:out std_logic;-int0_i: in std_logic; -int1_i: in std_logic;-wr_rs_o: out std_logic_vector (1 downto 0); end top;architecture behavioral of top issignal addr_user_r : std_logic_vector (13 downto 0);signal data_userin_r : std_logic_vector (7 downto 0);signal data_userout_r : std_logic_vector (7 downto 0);signal wr_user_r : std_logic_vector (0 downto 0);signal xlxn_1: std_logic_vector (31 downto 0); -muxsignal xlxn_2: std_logic_vector (31 downto 0); -muxsignal xlxn_3: std_logic_vector (7 downto 0); -p0_isignal xlxn_4: std_logic_vector (7 downto 0); -p1_isignal xlxn_5: std_logic_vector (7 downto 0); -p2_isignal xlxn_6: std_logic_vector (7 downto 0); -p3_isignal xlxn_7: std_logic_vector (7 downto 0); -p0_osignal xlxn_8: std_logic_vector (7 downto 0); -p1_osignal xlxn_9: std_logic_vector (7 downto 0); -p2_osignal xlxn_10: std_logic_vector (7 downto 0); -p3_osignal xlxn_11: std_logic; -计数器使能信号signal xlxn_12: std_logic; -3s周期信号-signal xlxn_13: std_logic;signal xlxn_14: std_logic; -18mhzsignal xlxn_15: std_logic; -50mhzsignal reset_r: std_logic; -resetcomponent mc8051port ( clk : in std_logic; reset : in std_logic; addr_out_user : out std_logic_vector (13 downto 0); data_in_user : in std_logic_vector (7 downto 0); wr_user : out std_logic; int0_i : in std_logic; int1_i : in std_logic; all_t0_i : in std_logic; all_t1_i : in std_logic; all_rxd_i : in std_logic_vector (0 downto 0); p0_i : in std_logic_vector (7 downto 0); p1_i : in std_logic_vector (7 downto 0); p2_i : in std_logic_vector (7 downto 0); p3_i : in std_logic_vector (7 downto 0); p0_o : out std_logic_vector (7 downto 0); p1_o : out std_logic_vector (7 downto 0); p2_o : out std_logic_vector (7 downto 0); p3_o : out std_logic_vector (7 downto 0); all_txd_o : out std_logic_vector (0 downto 0); le : out std_logic_vector (1 downto 0); wr_rs : out std_logic_vector (1 downto 0); ramx_data_o : out std_logic_vector (7 downto 0); end component; component mc8051_ram port ( addra : in std_logic_vector (6 downto 0); dina : in std_logic_vector (7 downto 0); ena : in std_logic; wea : in std_logic_vector (0 downto 0); clka : in std_logic; douta : out std_logic_vector (7 downto 0); end component; component mc8051_ramx_mon51port (clka: in std_logic;wea: in std_logic_vector(0 downto 0);addra: in std_logic_vector(12 downto 0);dina: in std_logic_vector(7 downto 0);douta: out std_logic_vector

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论