基于FPGA的SOPC技术 - 图文

更新时间:2023-11-23 12:08:01 阅读量: 教育文库 文档下载

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

基于FPGA的数字时钟设计

摘要:EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL和C语言在FPGA实验板上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为23时59分59秒、。总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数模块、处理器及外设模块,并且使用QuartusII运用VHDL语言对分频和计数两个模块进行硬件电路设计和电路波形仿真,运用sopc技术嵌入内核并创建了系统所需的外部设备FLASH和SRAM软件通过使用NiosII运用C语言进行编程然后下载到硬件电路中,并在FPGA实验板上进行调试和验证。该设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和VHDL语言输入—各模块程序设计)实现数字钟的设计、下载和调试。

关键词:数字钟;FPGA;VHDL语言;C语言;SOPC技术;

1、选题背景和研究内容

近年来,随着数字集成电路技术的发展,用以前传统的方法进行芯片或系统设计已不能满足要求, 迫切需要提高设计效率。能大大降低设计难度的VHDL设计方法正在被越来越广泛的采用。VHDL 即超高速集成电路硬件描述语言,诞生于1982 年。1987年底, VHDL被IEEE和美国国防部确认为标准硬件描述语言。此后VHDL 在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年IEEE对VHDL 进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL 的内容,公布了新版本的VHDL,即IEEE标准的1076--1993 版本。现在, VHDL作为IEEE的工业标准硬件描述语言,已成为通用硬件描述语言。

现在电子钟产品可谓百家争鸣,市场上到处可见一些功能齐全的设备,可能基于单片机的比较多,用FPGA设计电子钟可能比较少。因为两个都可以实现同样的功能,而FPGA芯片的价格远比单片机高。出于利润,当然会选择开发成本少的产品。本次设计的目的是为了检验所学的知识(VHDL语言与SOPC技术)同时结合实践巩固知识,由于初涉该领域,相关的知识可能不够全面,实践的经验不够,所以本设计旨在能够实现数字钟的功能,对于各模块设计的优化和性能等方面没有多加考虑。 2、SOPC技术概述

SOPC(System On Programmable Chip)即可编程的片上系统,或者说是基于大规模FPGA的单片系统。SOPC的设计技术是现代计算机辅助设计技术、EDA技术和大规模集成电路技术高度发展的产物。SOPC技术的目标就是试图将尽可能大而完整的电子系统,包括嵌入式处理器系统、接口系统、硬件协处理器或加速系统、DSP系统、数字通信系统、存储电路以及普通数字系统等,在单一FPGA中实现,使得所设计的电路系统在其规模、可靠性、体积、功耗、功能、性能指标、上市周期、开发成本、产品维护及其硬件升级等多方面实现最优化。SOPC技术是一门全新的综合性电子设计技术,涉及面广,SOPC在电子设计技术上给出了一种以人的基本能力为依据的软硬件综合解决优化方案。 3、数字钟系统总体设计方案 3.1 数字钟的构成

该数字钟系统构成主要包括分频程序模块、时分秒计数模块、处理器及外设模块三个模块,其总体结构框图如图1所示

50Hz 1Hz 分频 数 字 钟 中断 时(十位) 时(个位) 分(十位) 分(个位) 秒(十位) 秒(个位) NIOS LED 显示

图1总体结构框图

3.2 数字钟的工作原理

数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的50MHz信号通过分频得到。当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号,每一秒钟发出一个中断给CPU,CPU采用NIOS,它响应中断,并读出小时、分、秒等信息。CPU对读出的数据译码,使之动态显示在数码管上。

4、单元模块电路设计 4.1分频模块电路设计与实现

分频器是数字系统设计中的基本电路,根据不同设计的需要,我们会遇到偶数分频、奇数分频、半整数分频等。通常由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频,实现较为简单。本文设计的分频器是利用VHDL硬件描述语言,通过QuartusⅡ开发平台,使用Altera公司的FPGA,设计了用50MHZ的时钟信号输入进行50000000分频得到1HZ的时钟信号,作为秒计数器的个位提供时钟信号。其原理图如图2所示。

FP50HzRstINPUTVCCINPUTVCCCLKRSTFNOUTPUT1Hzinst

图2 分频模块原理图

4.2计数模块设计与实现

秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的50MHz信号通过分频得到。当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。其原理图如图3所示。

SSZRst1HzINPUTVCCINPUTVCCRSTCLKMIAO1[3..0]MIAO2[3..0]FEN1[3..0]FEN2[3..0]SHI1[3..0]SHI2[3..0]OUTPUTOUTPUTOUTPUTOUTPUTsecond1[3..0]second2[3..0]minute1[3..0]minute2[3..0]hour1[3..0]hour2[3..0]OUTPUTOUTPUTinst

图3 计数模块原理图

4.3处理器及外设模块设计和实现

该模块CPU采用NIOSII处理器,程序存储采用4M的Flash,数据存储采用外部的512k的SRAM,使用Flash来保存NIOSII中运行的程序代码和FPGA的配置数据,处理器在复位后从Flash开始执行程序,使用IDE Flash Programmer进行编程,将程序下载到Flash中,一个1位的I/O口接受中断信号,六个4位I/O口作为数据输入端口,六个8位I/O口作为数据输出端口,外接六个8位led数码管,通过分频后的时钟信号每一秒钟给CPU一个中断信号,CPU响应中断,并通过4位I/O口读出小时、分、秒等信息,对读出的数据进行译码,并通过8位I/O口使之动态显示在数码管上。原理图如图4所示。

cnzclk reset_n in_port_to_the_INTURRPT in_port_to_the_PIO_IN1[3..0] in_port_to_the_PIO_IN2[3..0] in_port_to_the_PIO_IN3[3..0] in_port_to_the_PIO_IN4[3..0] in_port_to_the_PIO_IN5[3..0] in_port_to_the_PIO_IN6[3..0] out_port_from_the_PIO_OUT1[7..0] out_port_from_the_PIO_OUT2[7..0] out_port_from_the_PIO_OUT3[7..0] out_port_from_the_PIO_OUT4[7..0] out_port_from_the_PIO_OUT5[7..0] out_port_from_the_PIO_OUT6[7..0] SRAM_ADDR_from_the_SRAM_16Bit_512K_inst[17..0] SRAM_CE_N_from_the_SRAM_16Bit_512K_inst SRAM_DQ_to_and_from_the_SRAM_16Bit_512K_inst[15..0] SRAM_LB_N_from_the_SRAM_16Bit_512K_inst SRAM_OE_N_from_the_SRAM_16Bit_512K_inst SRAM_UB_N_from_the_SRAM_16Bit_512K_inst SRAM_WE_N_from_the_SRAM_16Bit_512K_inst address_to_the_flash[21..0] data_to_and_from_the_flash[7..0] read_n_to_the_flash select_n_to_the_flash write_n_to_the_flash inst 图4 处理器及外设模块原理图

系统总的原理图如图5所示

cnzclkreset_nINPUTVCCINPUTVCCclk reset_n in_port_to_the_INTURRPT FPCLK3pin_nameINPUTVCCINPUTVCCSSZCLKRSTFNRSTCLKMIAO1[3..0]MIAO2[3..0]FEN1[3..0]in_port_to_the_PIO_IN1[3..0] in_port_to_the_PIO_IN2[3..0] in_port_to_the_PIO_IN3[3..0] in_port_to_the_PIO_IN4[3..0] instFEN2[3..0]SHI1[3..0]SHI2[3..0]inst1in_port_to_the_PIO_IN5[3..0] in_port_to_the_PIO_IN6[3..0] out_port_from_the_PIO_OUT1[7..0] out_port_from_the_PIO_OUT2[7..0] out_port_from_the_PIO_OUT3[7..0] out_port_from_the_PIO_OUT4[7..0] out_port_from_the_PIO_OUT5[7..0] out_port_from_the_PIO_OUT6[7..0] SRAM_ADDR_from_the_SRAM_16Bit_512K_inst[17..0] SRAM_CE_N_from_the_SRAM_16Bit_512K_inst SRAM_DQ_to_and_from_the_SRAM_16Bit_512K_inst[15..0] SRAM_LB_N_from_the_SRAM_16Bit_512K_inst SRAM_OE_N_from_the_SRAM_16Bit_512K_inst SRAM_UB_N_from_the_SRAM_16Bit_512K_inst SRAM_WE_N_from_the_SRAM_16Bit_512K_inst address_to_the_flash[21..0] data_to_and_from_the_flash[7..0] read_n_to_the_flash select_n_to_the_flash write_n_to_the_flash inst2OUTPUTout_port_from_the_PIO_OUT1[7..0]OUTPUTout_port_from_the_PIO_OUT2[7..0]out_port_from_the_PIO_OUT3[7..0]out_port_from_the_PIO_OUT4[7..0]out_port_from_the_PIO_OUT5[7..0]OUTPUTOUTPUTOUTPUTOUTPUTout_port_from_the_PIO_OUT6[7..0]OUTPUTSRAM_CE_N_from_the_SRAM_16Bit_512K_instSRAM_LB_N_from_the_SRAM_16Bit_512K_instSRAM_OE_N_from_the_SRAM_16Bit_512K_instOUTPUTOUTPUTOUTPUTOUTPUTSRAM_UB_N_from_the_SRAM_16Bit_512K_instSRAM_WE_N_from_the_SRAM_16Bit_512K_instaddress_to_the_flash[21..0]data_to_and_from_the_flash[7..0]read_n_to_the_flashselect_n_to_the_flashwrite_n_to_the_flashOUTPUTBIDIRVCCOUTPUTOUTPUTOUTPUT 图5 系统总原理图

5、系统软件设计

中断译码程序流程图如图6所示

开始 开始 开始 初始化I/O口 关中断 读I/O口数据 开中断 清中断寄存器 清中断寄存器 译 码 调译码子程序 写I/O口数据 中断注册 开中断 调中断子程序 主程序

中断子程序 译码子程序

图6 中断译码程序流程图

6、系统调试和测试

分频模块的调试与测试,分频模块采用的VHDL语言编写,对该模块进行功能和时序仿真,由于进行50000000分频的仿真比较困难,所以在此对2分频进行仿真.,图7为仿真输入波形图,采用输入时钟CLK周期为10ns,图8为仿真输出波形图,输出FN时钟周期为20ns。

图7 分频模块仿真输入波形图

图8仿真输出波形图

计数模块的调试与测试,计数模块采用的VHDL语言编写,对该模块进行功能和时序仿真,仿真输入的时钟信号周期为10ns,输出应为六位的时钟信号,仿真的波形图如图9所示。

图9 计数模块仿真输出波形图

处理器与外设模块的调试与测试,该模块采用SOPC技术生成,运用C语言编程在该模块中实现数据的传输译码,经过反复的在线调试,最终将时钟显示在FPGA实验板上。 7、结论

本文设计了一个数字钟,输入时钟为50MHz,输出的小时、分、秒显示在数码管上,1秒钟改变一下显示。数字钟的计数用VHDL语言设计实现,每一秒钟发出一个中断给CPU,CPU采用NIOS,它响应中断,并读出小时、分、秒等信息。CPU对读出的数据译码,使之能在数码管上显示。通过本次的数字钟系统设计,系统的复习整个基于FPGA的SOPC技术的知识,并且了解了CPLD可编程芯片的

结构和引脚,能够熟练的运用Quartus II这个软件,能够采用VHDL语言实现基本的分频,计数器等硬件电路的设计和波形仿真,能够熟练的运用NIOSII结合C语言进行软件编程,并将软件下载到硬件电路进行调试。数字钟的实物图如图10所示。

图10 数字钟实物图

8、附录

分频的VHDL程序代码: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY FP IS

PORT(CLK,RST:IN STD_LOGIC; FN:OUT STD_LOGIC); END FP;

ARCHITECTURE NEO OF FP IS SIGNAL TEMP:STD_LOGIC; BEGIN

PROCESS (CLK,RST)

VARIABLE COUNT:INTEGER RANGE 1 TO 25000000; BEGIN

IF RST='0' THEN TEMP<='0';

ELSIF CLK'EVENT AND CLK='0' THEN

IF COUNT=25000000 THEN COUNT:=1;TEMP<=NOT TEMP; ELSE COUNT:=COUNT+1; END IF; END IF; FN<=TEMP; END PROCESS; END NEO;

计数模块的VHDL程序代码: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SSZ IS

PORT( RST:IN STD_LOGIC; CLK:IN STD_LOGIC;

MIAO1:OUT INTEGER RANGE 9 DOWNTO 0; MIAO2:OUT INTEGER RANGE 9 DOWNTO 0; FEN1:OUT INTEGER RANGE 9 DOWNTO 0; FEN2:OUT INTEGER RANGE 9 DOWNTO 0; SHI1:OUT INTEGER RANGE 9 DOWNTO 0; SHI2:OUT INTEGER RANGE 9 DOWNTO 0); END SSZ;

ARCHITECTURE ONE OF SSZ IS BEGIN

PROCESS(RST,CLK)

VARIABLE M1:INTEGER RANGE 9 DOWNTO 0; VARIABLE M2:INTEGER RANGE 9 DOWNTO 0; VARIABLE F1:INTEGER RANGE 9 DOWNTO 0; VARIABLE F2:INTEGER RANGE 9 DOWNTO 0; VARIABLE S1:INTEGER RANGE 9 DOWNTO 0; VARIABLE S2:INTEGER RANGE 9 DOWNTO 0; BEGIN

IF RST='0' THEN M1:=0; M2:=0; F1:=0; F2:=0;S1:=0; S2:=0; ELSIF CLK'EVENT AND CLK='1' THEN IF M1<9 THEN M1:=M1+1; ELSIF M1=9 THEN M1:=0;

IF M2<5 THEN M2:=M2+1; ELSIF M2=5 THEN M2:=0; IF F1<9 THEN F1:=F1+1; ELSIF F1=9 THEN F1:=0; IF F2<5 THEN F2:=F2+1; ELSIF F2=5 THEN F2:=0; IF S1<4 THEN S1:=S1+1; ELSIF S1=4 THEN S1:=0;

IF S2<2 THEN S2:=S2+1; ELSIF S2=2 THEN S2:=0; END IF; END IF; END IF; END IF; END IF; END IF; END IF; MIAO1<=M1; MIAO2<=M2; FEN1<=F1; FEN2<=F2; SHI1<=S1; SHI2<=S2; END PROCESS; END ONE;

译码C语言程序代码:

#INCLUDE #INCLUDE \

#INCLUDE \ #INCLUDE \ #INCLUDE \

#INCLUDE \

UNSIGNED INT IN_1,IN_2,IN_3,IN_4,IN_5,IN_6;

UNSIGNED CHAR OUT_1,OUT_2,OUT_3,OUT_4,OUT_5,OUT_6; UNSIGNED CHAR DISPLAY(UNSIGNED INT X) {

SWITCH(X)

{CASE 0:X=0XC0;BREAK; CASE 1:X=0XF9;BREAK; CASE 2:X=0XA4;BREAK; CASE 3:X=0XB0;BREAK; CASE 4:X=0X99;BREAK; CASE 5:X=0X92;BREAK; CASE 6:X=0X82;BREAK; CASE 7:X=0XF8;BREAK; CASE 8:X=0X80;BREAK; CASE 9:X=0X90;BREAK; DEFAULT:X=0XC0;BREAK; } RETURN X; }

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

Top