FPGA八位十进制数字频率计
8位十进制频率计 FPGA

8位十进制频率计1 实验目的设计8位十进制频率计,学习较复杂的数字系统设计方法;学习verilog HDL编程的使用。
2 实验内容被测信号从freg_input引脚(FPGA的13脚)输入,经过检查后测得的频率值用数码管1~8显示。
3 实验原理根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1S的输入信号脉冲计数允许的信号;1S计数结束后,计数值锁入锁存器,并将下一测频计数周期作准备的计数器清零。
计数器在这里是由8个十进制计数器级联组成。
4 实验程序顶层文件:module freqtest(clk,freq_input,dig,seg,test);input clk,freq_input;output[7:0]dig,seg;output[9:0]test;reg[25:0]counter;reg[31:0]freq_result;wire[31:0]pre_freq;reg rst;wire divide_c lk; //1HZ闸门信号wire clk_scan;wire cout1,cout2,cout3,cout4,cout5,cout6,cout7;assign clk_scan=counter[15];assign test=counter[9:0];always @(posedge clk)beginif(divide_clk)counter<=26'd0;elsecounter<=counter+1'b1;endassign divide_clk=(counter>=26'd4*******);always @(posedge clk)beginif(divide_clk)freq_result<=pre_freq;endalways @(posedge clk)beginif(divide_clk)rst<=1'b1;elserst<=1'b0;endcnt101 u1(freq_input,rst,1'b1,cout1,pre_freq[3:0]);cnt102 u2(freq_input,rst,cout1,cout2,pre_freq[7:4]);cnt102 u3(freq_input,rst,cout2,cout3,pre_freq[11:8]);cnt102 u4(freq_input,rst,cout3,cout4,pre_freq[15:12]);cnt102 u5(freq_input,rst,cout4,cout5,pre_freq[19:16]);cnt102 u6(freq_input,rst,cout5,cout6,pre_freq[23:20]);cnt102 u7(freq_input,rst,cout6,cout7,pre_freq[27:24]);cnt102 u8(.clk(freq_input),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28]));scan_led u9(clk_scan,freq_result,dig,seg);endmodule10进制计数模块:module cnt101(clk,rst,cin,cout,dout);input clk,cin,rst;output cout;output [3:0]dout;reg[3:0]sum;reg cout;always @(posedge clk or negedge rst)if(!rst)begincout=1'b0;sum=4'd0;endelseif(sum==4'd9)begincout=~cout;sum=4'd0;endelsesum=sum+1'b1;assign dout=sum;endmodulemodule cnt102(clk,rst,cin,cout,dout);input clk,cin,rst;output cout;output [3:0]dout;reg[3:0]sum;reg cout;always @(cin)beginif(!rst)beginsum=4'd0;endelseif(sum==4'd9)begincout=~cout;sum=4'd0;endelsesum=sum+1'b1;endassign dout=sum;endmodule数码管扫描显示模块:module scan_led(clk_1k,d,dig,seg); input clk_1k;input[31:0]d;output[7:0]dig,seg;reg[7:0]seg_r,dig_r;reg[3:0]disp_dat;reg[2:0]count;assign dig=dig_r;assign seg=seg_r;always @(posedge clk_1k)begincount<=count+1'b1;endalways @(posedge clk_1k)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];case(count)3'd0:dig_r=8'b01111111;3'd1:dig_r=8'b10111111;3'd2:dig_r=8'b11011111;3'd3:dig_r=8'b11101111;3'd4:dig_r=8'b11110111;3'd5:dig_r=8'b11111011;3'd6:dig_r=8'b11111101;3'd7:dig_r=8'b11111110;endcaseendalways @(disp_dat)begincase(disp_dat)4'h0:seg_r = 8'hc0; //显示0 4'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule。
基于FPGA的8位十进制数字频率计设计

宝鸡文理学院学报(自然科学版),第33卷,第1期,第-页,2013年3月J o u r n a l o f B a o j iU n i v e r s i t y o fA r t s a n dS c i e n c e s (N a t u r a l S c i e n c e ),V o l .33,N o .1,p p .-,M a r .2013D O I :C N K I :61-1290/N.h t t p ://w w w.c n k i .n e t /k c m s /d e t a i l /61.1290.N.基于F P G A 的8位十进制数字频率计设计*1韩芝侠(宝鸡文理学院电子电气工程系,陕西宝鸡721016)摘 要:目的 研究复杂数字电路在E D A 开发系统上的实现方法。
方法 在介绍E D A 特征及设计方法基础上,针对具体的C P L D /F P G A 开发系统,在Q u a r t u s 环境下设计了一款8位十进制数字频率计。
结果 下载/配置到实验板的目标器件上,经实际电路测试验证,达到了预期的设计要求。
结论与传统设计方法相比,该方案具有外围电路简单,程序修改灵活和调试容易等特点;设计的数字频率计测量范围大,精度高,读数直观清晰,可用于频率测量、机械转速测量等领域。
关键词:E D A ;C P L D /F P G A ;Q u a r t u s;数字频率计;复杂数字系统;仿真中图分类号:T P 391.9 文献标志码:A 文章编号:1007-1261(2013)01-0000-04D e s i g no f 8-b i t d e c i m a l s y s t e md i gi t a l f r e q u e n c y me t e rb a s e do nF P G A HA NZ h i -x i a(D e p t .E l e c t r o n i c s&E l e c t .E n g n .,B a o j iU n i v .A r t s&S c i .,B a o ji 721016,S h a a n x i ,C h i n a )A b s t r a c t :A i m T os t u d i e dt h em e t h o dt or e a l i z ead i g i t a l c i r c u i t i nE D A d e v e l o p m e n t s ys t e m.M e t h o d s B a s e do ni n t r o d u c i n g t h ec h a r a c t e r i s t i c sa n dd e s i g n m e t h o d so fE D A ,t oa i m a ts pe c if i c C P L D /F P G Ad e v e l o p m e n t s y s t e m ,A8-b i t d e c i m a l s y s t e md ig i t a l f r e q u e n c y m e t e r i s d e s i gn e d i nQ u -a r t u s e n v i r o n m e n t .R e s u l t s I t i sd o w n l o a d /c o n f i g u r a t i o nt o t h e t a r g e td e v i c eo f e x pe r i m e n t a l p l a t e ,af t e r a c t u a l c i r c u i t t e s t i ng a n dv e r i f y i n g,t h ee x p e c t e dd e s i g nr e q u i r e m e n t i sa c h i e v e d .C o n c l u s i o n C o m p a r i n g w i t h t r a d i t i o n a l d e s i g nm e t h o d ,t h i s d e s i g nh a s c h a r a c t e r i s t i c s o f s i m p l e p e r i ph e r a l c i r c u i t ,f l e x i b l e p r o g r a m m o d i f i c a t i o nw a y a n d e a s y d e b u g m o d e ;T h i s f r e q u e n c y m e t e r a l s oh a s c h a r a c t e r i s t i c s o fw i d em e a s u r e m e n t r a n g e ,h i g ha c c u r a c y,c l e a r a n d i n t u i t i v e r e a d i n g ,a n d c a nb e u s e d f o r f r e q u e n c y m e a s u r e m e n t ,m e c h a n i c a l s p e e dm e a s u r e m e n t ,e t c .K e y wo r d s :E D A ;C P L D /F P G A ;Q u a r t u s ;d i g i t a l f r e q u e n c y m e t e r ;c o m p l e xd i g i t a l c i r c u i t ;s i m -u l a t i o n1 E D A 技术应用随着计算机技术和集成电路技术的快速发展,电子技术设计面临着复杂度不断提高而设计周期不断缩短的矛盾。
8位数字频率计

一、题目:基于FPGA的直接测频法设计8位数字频率计二、设计目的和要求:(一)设计目的:采用直接测频法实现8位数字频率计。
(二)设计要求:1.采用FPGA直接测频/测周法实现2.掌握四种整合方式3.用VHDL语言在Maxplux2上实现三、设计原理和相关知识(一) 设计原理:把频率信号经脉冲形成电路后加到闸门相对一个输入端,只有在闸门开通的T(以秒计)内,计数脉冲被送到计数器进行计数。
计数值为N,有频率定义可以计算得到被测信号频率为:F=N/T(二) 测频法原理图:数字频率计系统组成框图四、设计方案和设计内容(一)数字频率计底层模块设计1.频率计测频控制器模块模块分析:闸门信号上升沿,打开计数器开始计数,直到产生下降沿。
在闸门信号下降沿处产生一个上升沿作为控制时钟信号,将输入端计数结果锁存到输出端。
在闸门信号低电平期间输出一个清零信号是计数器清零,准备下一次计数。
testen使能控制端口高电平期间控制计数器进行计数clr_cnt计数器清零控制信号为1时进行清零load 锁存控制信号,上升沿进行锁存程序:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;entity testct1 isport(clk: in std_logic;testen: out std_logic;clr_cnt:out std_logic;load:out std_logic);end entity;architecture a of testct1 issignal div2clk:std_logic;beginprocess(clk)beginif clk'event and clk='1' thendiv2clk<=not div2clk;end if;end process;process(clk,div2clk)beginif clk='0' and div2clk='0' thenclr_cnt<='1';else clr_cnt<='0';end if;load<=not div2clk;testen<=div2clk;end process;end a;模块图:仿真结果:2.计数器模块模块分析:使能端ena置高电平有效,进行计数,使能端ena置低电平停止计数保留原数值,置高电平继续计数。
八位十进制数字频率计

EDA课程设计报告书题目:8位十进制数字频率计的设计姓名:学号:所属学院:专业年级:指导教师:完成时间:8位十进制数字频率计的设计一、设计介绍数字频率计是采用数字电路制做成的能实现对周期性变化信号频率测量的仪器。
频率计主要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号的频率值。
其扩展功能可以测量信号的周期和脉冲宽度。
通常说的,数字频率计是指电子计数式频率计。
频率计主要由四个部分构成:输入电路、时基(T)电路、计数显示电路以及控制电路。
在电子技术领域,频率是一个最基本的参数。
数字频率计作为一种最基本的测量仪器以其测量精度高、速度快、操作简便、数字显示等特点被广泛应用。
许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度等通过传感器转换成信号频率,可用数字频率计来测量。
尤其是将数字频率计与微处理器相结合,可实现测量仪器的多功能化、程控化和智能化.随着现代科技的发展,基于数字式频率计组成的各种测量仪器、控制设备、实时监测系统已应用到国际民生的各个方面。
二、设计目的(1)熟悉Quatus 11软件的基本使用方法。
(2)熟悉EDA实验开发系统的使用方法。
(3)学习时序电路的设计、仿真和硬件设计,进一步熟悉VHDL设计技术。
三、数字频率计的基本原理数字频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,通常情况下计算每秒待测信号的脉冲个数,此时我们称闸门时间为1秒。
闸门时间也可以大于或小于一秒。
闸门时间越长,得到的频率值就越准确,但闸门时间越长则每测一次频率的间隔就越长。
闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。
数字频率计的主要功能是测量周期信号的频率。
频率是单位时间(1S)信号发生周期变化的次数。
如果我们能在给定的1S时间对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。
数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔的脉冲个数,将其换算后显示出来。
八位16进制、八位10进制频率计设计

EDA综合实习报告一李爱20111154006 电子科学与技术2011级1.数字频率计的设计(1)8位16进制频率计①.主程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MAIN ISPORT (A,clk1,CLK: IN STD_LOGIC;O:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);P: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END;ARCHITECTURE HEAD OF MAIN ISCOMPONENT CEPINPORT (CLK1:IN STD_LOGIC;CNT: OUT STD_LOGIC;RST:OUT STD_LOGIC;LOAD:OUT STD_LOGIC);END COMPONENT;COMPONENT JISHUPORT (CLR:IN STD_LOGIC;EN:IN STD_LOGIC;FIN:IN STD_LOGIC;COUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );END COMPONENT;COMPONENT SUOCUNPORT( LK :IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR (31 DOWNTO 0);QDOUT: OUT STD_LOGIC_VECTOR (31 DOWNTO 0));END COMPONENT;COMPONENT XIANSHIPORT (clk: in std_logic;Q:IN STD_LOGIC_VECTOR(31 DOWNTO 0);T:buffer STD_LOGIC_VECTOR(2 DOWNTO 0);Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;SIGNAL NET1,NET2,NET3:STD_LOGIC;SIGNAL NET4,NET5 :STD_LOGIC_VECTOR(31 DOWNTO 0);BEGINU1:CEPIN PORT MAP (CLK1=>CLK,CNT=>NET1,RST=>NET2,LOAD=>NET3);U2:JISHU PORT MAP (CLR=>NET2,EN=>NET1,FIN=>A,COUT=>NET4);U3:SUOCUN PORT MAP (LK=>NET3,DIN=>NET4,QDOUT=>NET5);U4:XIANSHI PORT MAP (clk=>clk1,Q=>NET5,Y=>P,T=>O);END HEAD;②.测频LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cepin ISPORT (CLK1:IN STD_LOGIC;CNT: OUT STD_LOGIC;RST:OUT STD_LOGIC;LOAD:OUT STD_LOGIC);END ;ARCHITECTURE one OF cepin ISSIGNAL M: STD_LOGIC;BEGINPROCESS (CLK1)BEGINIF CLK1 'EVENT AND CLK1='1' THENM<= NOT M;END IF;END PROCESS;PROCESS (CLK1,M)BEGINIF CLK1='0' AND M='0' THEN RST<='1';ELSE RST <='0';END IF;END PROCESS;LOAD <= NOT M;CNT <=M;END one;③.计数LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JISHU ISPORT (CLR:IN STD_LOGIC;EN:IN STD_LOGIC;FIN:IN STD_LOGIC;COUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END ;ARCHITECTURE two OF JISHU ISSIGNAL Q: STD_LOGIC_VECTOR(31 DOWNTO 0);BEGINPROCESS (CLR,EN,FIN) BEGINIF CLR='1' THEN Q <= (OTHERS=>'0');ELSIF FIN 'EVENT AND FIN='1' THENIF EN='1' THEN Q <= Q+1;END IF;END IF;END PROCESS;COUT <=Q;END two;④.锁存LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SUOCUN ISPORT( LK :IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR (31 DOWNTO 0);qDOUT: OUT STD_LOGIC_VECTOR (31 DOWNTO 0)); END ;ARCHITECTURE three OF SUOCUN ISBEGINPROCESS (LK,DIN)BEGINIF LK 'EVENT AND LK='1' THEN qDOUT <=DIN;END IF;END PROCESS;END three;⑤显示LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XIANSHI ISPORT (clk: in std_logic;Q:IN STD_LOGIC_VECTOR(31 DOWNTO 0);T:buffer STD_LOGIC_VECTOR(2 DOWNTO 0);Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ;ARCHITECTURE four OF XIANSHI ISBEGINPROCESS(Q,clk,T)V ARIABLE Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF clk'event and clk='1' THENQ1:=Q1+'1';END IF;if Q1="0001" thenCASE Q(3 downto 0) ISWHEN "0000"=>T<="000";Y<="0111111";WHEN "0001"=>T<="000";Y<="0000110";WHEN "0010"=>T<="000";Y<="1011011";WHEN "0011"=>T<="000";Y<="1001111";WHEN "0100"=>T<="000";Y<="1100110";WHEN "0101"=>T<="000";Y<="1101101";WHEN "0110"=>T<="000";Y<="1111101";WHEN "0111"=>T<="000";Y<="0000111";WHEN "1000"=>T<="000";Y<="1111111";WHEN "1001"=>T<="000";Y<="1101111";WHEN "1010"=>T<="000";Y<="1110111";WHEN "1011"=>T<="000";Y<="1111100";WHEN "1100"=>T<="000";Y<="0111001";WHEN "1101"=>T<="000";Y<="1011110";WHEN "1110"=>T<="000";Y<="1111011";WHEN "1111"=>T<="000";Y<="1110001";WHEN OTHERS=> NULL;END CASE;elsif Q1="0010" thenCASE Q(7 downto 4) ISWHEN "0000"=>T<="001";Y<="0111111"; WHEN "0001"=>T<="001";Y<="0000110"; WHEN "0010"=>T<="001";Y<="1011011"; WHEN "0011"=>T<="001";Y<="1001111"; WHEN "0100"=>T<="001";Y<="1100110"; WHEN "0101"=>T<="001";Y<="1101101"; WHEN "0110"=>T<="001";Y<="1111101"; WHEN "0111"=>T<="001";Y<="0000111"; WHEN "1000"=>T<="001";Y<="1111111"; WHEN "1001"=>T<="001";Y<="1101111"; WHEN "1010"=>T<="001";Y<="1110111"; WHEN "1011"=>T<="001";Y<="1111100"; WHEN "1100"=>T<="001";Y<="0111001"; WHEN "1101"=>T<="001";Y<="1011110"; WHEN "1110"=>T<="001";Y<="1111011"; WHEN "1111"=>T<="001";Y<="1110001"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0011"thenCASE Q(11 downto 8) ISWHEN "0000"=>T<="010";Y<="0111111"; WHEN "0001"=>T<="010";Y<="0000110"; WHEN "0010"=>T<="010";Y<="1011011"; WHEN "0011"=>T<="010";Y<="1001111"; WHEN "0100"=>T<="010";Y<="1100110"; WHEN "0101"=>T<="010";Y<="1101101"; WHEN "0110"=>T<="010";Y<="1111101"; WHEN "0111"=>T<="010";Y<="0000111"; WHEN "1000"=>T<="010";Y<="1111111"; WHEN "1001"=>T<="010";Y<="1101111"; WHEN "1010"=>T<="010";Y<="1110111"; WHEN "1011"=>T<="010";Y<="1111100"; WHEN "1100"=>T<="010";Y<="0111001"; WHEN "1101"=>T<="010";Y<="1011110"; WHEN "1110"=>T<="010";Y<="1111011"; WHEN "1111"=>T<="010";Y<="1110001"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0100" thenCASE Q(15 downto 12) ISWHEN "0001"=>T<="011";Y<="0000110"; WHEN "0010"=>T<="011";Y<="1011011"; WHEN "0011"=>T<="011";Y<="1001111"; WHEN "0100"=>T<="011";Y<="1100110"; WHEN "0101"=>T<="011";Y<="1101101"; WHEN "0110"=>T<="011";Y<="1111101"; WHEN "0111"=>T<="011";Y<="0000111"; WHEN "1000"=>T<="011";Y<="1111111"; WHEN "1001"=>T<="011";Y<="1101111"; WHEN "1010"=>T<="011";Y<="1110111"; WHEN "1011"=>T<="011";Y<="1111100"; WHEN "1100"=>T<="011";Y<="0111001"; WHEN "1101"=>T<="011";Y<="1011110"; WHEN "1110"=>T<="011";Y<="1111011"; WHEN "1111"=>T<="011";Y<="1110001"; WHEN OTHERS=>NULL;END CASE;elsif Q1="0101" thenCASE Q(19 downto 16) ISWHEN "0000"=>T<="100";Y<="0111111"; WHEN "0001"=>T<="100";Y<="0000110"; WHEN "0010"=>T<="100";Y<="1011011"; WHEN "0011"=>T<="100";Y<="1001111"; WHEN "0100"=>T<="100";Y<="1100110"; WHEN "0101"=>T<="100";Y<="1101101"; WHEN "0110"=>T<="100";Y<="1111101"; WHEN "0111"=>T<="100";Y<="0000111"; WHEN "1000"=>T<="100";Y<="1111111"; WHEN "1001"=>T<="100";Y<="1101111"; WHEN "1010"=>T<="100";Y<="1110111"; WHEN "1011"=>T<="100";Y<="1111100"; WHEN "1100"=>T<="100";Y<="0111001"; WHEN "1101"=>T<="100";Y<="1011110"; WHEN "1110"=>T<="100";Y<="1111011"; WHEN "1111"=>T<="100";Y<="1110001"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0110" thenCASE Q(23 downto 20) ISWHEN "0000"=>T<="101";Y<="0111111"; WHEN "0001"=>T<="101";Y<="0000110";WHEN "0011"=>T<="101";Y<="1001111"; WHEN "0100"=>T<="101";Y<="1100110"; WHEN "0101"=>T<="101";Y<="1101101"; WHEN "0110"=>T<="101";Y<="1111101"; WHEN "0111"=>T<="101";Y<="0000111"; WHEN "1000"=>T<="101";Y<="1111111"; WHEN "1001"=>T<="101";Y<="1101111"; WHEN "1010"=>T<="101";Y<="1110111"; WHEN "1011"=>T<="101";Y<="1111100"; WHEN "1100"=>T<="101";Y<="0111001"; WHEN "1101"=>T<="101";Y<="1011110"; WHEN "1110"=>T<="101";Y<="1111011"; WHEN "1111"=>T<="101";Y<="1110001"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0111" thenCASE Q(27 downto 24) ISWHEN "0000"=>T<="110";Y<="0111111"; WHEN "0001"=>T<="110";Y<="0000110"; WHEN "0010"=>T<="110";Y<="1011011"; WHEN "0011"=>T<="110";Y<="1001111"; WHEN "0100"=>T<="110";Y<="1100110"; WHEN "0101"=>T<="110";Y<="1101101"; WHEN "0110"=>T<="110";Y<="1111101"; WHEN "0111"=>T<="110";Y<="0000111"; WHEN "1000"=>T<="110";Y<="1111111"; WHEN "1001"=>T<="110";Y<="1101111"; WHEN "1010"=>T<="110";Y<="1110111"; WHEN "1011"=>T<="110";Y<="1111100"; WHEN "1100"=>T<="110";Y<="0111001"; WHEN "1101"=>T<="110";Y<="1011110"; WHEN "1110"=>T<="110";Y<="1111011"; WHEN "1111"=>T<="110";Y<="1110001"; WHEN OTHERS=> NULL;END CASE;elsif Q1="1000" thenCASE Q(31 downto 28) ISWHEN "0000"=>T<="111";Y<="0111111"; WHEN "0001"=>T<="111";Y<="0000110"; WHEN "0010"=>T<="111";Y<="1011011"; WHEN "0011"=>T<="111";Y<="1001111";WHEN "0101"=>T<="111";Y<="1101101";WHEN "0110"=>T<="111";Y<="1111101";WHEN "0111"=>T<="111";Y<="0000111";WHEN "1000"=>T<="111";Y<="1111111";WHEN "1001"=>T<="111";Y<="1101111";WHEN "1010"=>T<="111";Y<="1110111";WHEN "1011"=>T<="111";Y<="1111100";WHEN "1100"=>T<="111";Y<="0111001";WHEN "1101"=>T<="111";Y<="1011110";WHEN "1110"=>T<="111";Y<="1111011";WHEN "1111"=>T<="111";Y<="1110001";WHEN OTHERS=> NULL;END CASE;end if; END PROCESS;END four;⑥引脚:A:测频端口CLK:1Hz输入频率CLK1:2048Hz的刷新频率O:三八译码器选择端口P:数码管显示(2)8位10进制频率计①主程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MAIN ISPORT (CLK1,FSIN:IN STD_LOGIC;CLK:IN STD_LOGIC; E:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ;ARCHITECTURE HEAD OF MAIN ISCOMPONENT JISHUPORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT :OUT STD_LOGIC);END COMPONENT;COMPONENT CEPINPORT (CLK:IN STD_LOGIC;TSTEN:OUT STD_LOGIC;CLR_CNT:OUT STD_LOGIC;LOAD:OUT STD_LOGIC);END COMPONENT;COMPONENT SUOCUNPORT(LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT :OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END COMPONENT;COMPONENT XIANSHIPORT (clk: in std_logic;Q:IN STD_LOGIC_VECTOR(31 DOWNTO 0);T:buffer STD_LOGIC_VECTOR(2 DOWNTO 0);Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;SIGNAL TSTEN:STD_LOGIC;SIGNAL CLR_CNT:STD_LOGIC;SIGNAL LOAD:STD_LOGIC;SIGNAL C1:STD_LOGIC;SIGNAL C2:STD_LOGIC;SIGNAL C3:STD_LOGIC;SIGNAL C4:STD_LOGIC;SIGNAL C5:STD_LOGIC;SIGNAL C6:STD_LOGIC;SIGNAL C7:STD_LOGIC;SIGNAL C8:STD_LOGIC;SIGNAL DIN,S:STD_LOGIC_VECTOR(31 DOWNTO 0);BEGINU0:CEPIN PORT MAP(CLK=>CLK,TSTEN=>TSTEN,CLR_CNT=>CLR_CNT,LOAD=>LOAD);U1:JISHU PORT MAP(CLK=>FSIN,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(3 DOWNTO 0),COUT=>C1);U2:JISHU PORT MAP(CLK=>C1,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(7 DOWNTO 4),COUT=>C2);U3:JISHU PORT MAP(CLK=>C2,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(11 DOWNTO 8),COUT=>C3);U4:JISHU PORT MAP(CLK=>C3,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(15 DOWNTO 12),COUT=>C4);U5:JISHU PORT MAP(CLK=>C4,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(19 DOWNTO 16),COUT=>C5);U6:JISHU PORT MAP(CLK=>C5,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(23 DOWNTO 20),COUT=>C6);U7:JISHU PORT MAP(CLK=>C6,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(27 DOWNTO 24),COUT=>C7);U8:JISHU PORT MAP(CLK=>C7,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(31 DOWNTO 28),COUT=>C8);U9:SUOCUN PORT MAP(LOAD=>LOAD,DIN=>DIN(31 DOWNTO 0),DOUT=>S);U10:XIANSHI PORT MAP(CLK=>CLK1,Q=>S,T=>E,Y=>DOUT);END HEAD;②测频LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CEPIN ISPORT (CLK:IN STD_LOGIC;TSTEN:OUT STD_LOGIC;CLR_CNT:OUT STD_LOGIC;LOAD:OUT STD_LOGIC);END ;ARCHITECTURE TWO OF CEPIN ISSIGNAL DIV2CLK :STD_LOGIC;BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THENDIV2CLK<=NOT DIV2CLK;END IF;END PROCESS;PROCESS(CLK,DIV2CLK)BEGINIF CLK='0' AND DIV2CLK='0' THENCLR_CNT<='1';ELSE CLR_CNT<='0';END IF;END PROCESS;LOAD<=NOT DIV2CLK;TSTEN <=DIV2CLK;END TWO;③计数LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JISHU ISPORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END ;ARCHITECTURE ONE OF JISHU ISBEGINPROCESS(CLK,RST,EN)V ARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF RST='1' THEN CQI:=(OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1' THENIF EN='1' THENIF CQI<"1001" THENCQI:=CQI+1;ELSE CQI:=(OTHERS=>'0');END IF;END IF;END IF;IF CQI="1001" THEN COUT<='1';ELSE COUT<='0';END IF;CQ<=CQI;END PROCESS;END ONE;④所存LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SUOCUN ISPORT(LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT :OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END ;ARCHITECTURE THREE OF SUOCUN ISBEGINPROCESS(LOAD,DIN)BEGINIF LOAD'EVENT AND LOAD='1' THEN DOUT<=DIN;END IF;END PROCESS;END THREE;⑤显示LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XIANSHI ISPORT (clk: in std_logic;Q:IN STD_LOGIC_VECTOR(31 DOWNTO 0);T:buffer STD_LOGIC_VECTOR(2 DOWNTO 0);Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ;ARCHITECTURE four OF XIANSHI ISBEGINPROCESS(Q,clk,T)V ARIABLE Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF clk'event and clk='1' THENQ1:=Q1+'1';END IF;if Q1="0001" thenCASE Q(3 downto 0) ISWHEN "0000"=>T<="000";Y<="0111111";WHEN "0001"=>T<="000";Y<="0000110";WHEN "0010"=>T<="000";Y<="1011011";WHEN "0011"=>T<="000";Y<="1001111";WHEN "0100"=>T<="000";Y<="1100110";WHEN "0101"=>T<="000";Y<="1101101";WHEN "0110"=>T<="000";Y<="1111101";WHEN "1000"=>T<="000";Y<="1111111"; WHEN "1001"=>T<="000";Y<="1101111"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0010" thenCASE Q(7 downto 4) ISWHEN "0000"=>T<="001";Y<="0111111"; WHEN "0001"=>T<="001";Y<="0000110"; WHEN "0010"=>T<="001";Y<="1011011"; WHEN "0011"=>T<="001";Y<="1001111"; WHEN "0100"=>T<="001";Y<="1100110"; WHEN "0101"=>T<="001";Y<="1101101"; WHEN "0110"=>T<="001";Y<="1111101"; WHEN "0111"=>T<="001";Y<="0000111"; WHEN "1000"=>T<="001";Y<="1111111"; WHEN "1001"=>T<="001";Y<="1101111"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0011"thenCASE Q(11 downto 8) ISWHEN "0000"=>T<="010";Y<="0111111"; WHEN "0001"=>T<="010";Y<="0000110"; WHEN "0010"=>T<="010";Y<="1011011"; WHEN "0011"=>T<="010";Y<="1001111"; WHEN "0100"=>T<="010";Y<="1100110"; WHEN "0101"=>T<="010";Y<="1101101"; WHEN "0110"=>T<="010";Y<="1111101"; WHEN "0111"=>T<="010";Y<="0000111"; WHEN "1000"=>T<="010";Y<="1111111"; WHEN "1001"=>T<="010";Y<="1101111"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0100" thenCASE Q(15 downto 12) ISWHEN "0000"=>T<="011";Y<="0111111"; WHEN "0001"=>T<="011";Y<="0000110"; WHEN "0010"=>T<="011";Y<="1011011"; WHEN "0011"=>T<="011";Y<="1001111";WHEN "0101"=>T<="011";Y<="1101101"; WHEN "0110"=>T<="011";Y<="1111101"; WHEN "0111"=>T<="011";Y<="0000111"; WHEN "1000"=>T<="011";Y<="1111111"; WHEN "1001"=>T<="011";Y<="1101111"; WHEN OTHERS=>NULL;END CASE;elsif Q1="0101" thenCASE Q(19 downto 16) ISWHEN "0000"=>T<="100";Y<="0111111"; WHEN "0001"=>T<="100";Y<="0000110"; WHEN "0010"=>T<="100";Y<="1011011"; WHEN "0011"=>T<="100";Y<="1001111"; WHEN "0100"=>T<="100";Y<="1100110"; WHEN "0101"=>T<="100";Y<="1101101"; WHEN "0110"=>T<="100";Y<="1111101"; WHEN "0111"=>T<="100";Y<="0000111"; WHEN "1000"=>T<="100";Y<="1111111"; WHEN "1001"=>T<="100";Y<="1101111"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0110" thenCASE Q(23 downto 20) ISWHEN "0000"=>T<="101";Y<="0111111"; WHEN "0001"=>T<="101";Y<="0000110"; WHEN "0010"=>T<="101";Y<="1011011"; WHEN "0011"=>T<="101";Y<="1001111"; WHEN "0100"=>T<="101";Y<="1100110"; WHEN "0101"=>T<="101";Y<="1101101"; WHEN "0110"=>T<="101";Y<="1111101"; WHEN "0111"=>T<="101";Y<="0000111"; WHEN "1000"=>T<="101";Y<="1111111"; WHEN "1001"=>T<="101";Y<="1101111"; WHEN OTHERS=> NULL;END CASE;elsif Q1="0111" thenCASE Q(27 downto 24) ISWHEN "0000"=>T<="110";Y<="0111111"; WHEN "0001"=>T<="110";Y<="0000110"; WHEN "0010"=>T<="110";Y<="1011011";WHEN "0100"=>T<="110";Y<="1100110";WHEN "0101"=>T<="110";Y<="1101101";WHEN "0110"=>T<="110";Y<="1111101";WHEN "0111"=>T<="110";Y<="0000111";WHEN "1000"=>T<="110";Y<="1111111";WHEN "1001"=>T<="110";Y<="1101111";WHEN OTHERS=> NULL;END CASE;elsif Q1="1000" thenCASE Q(31 downto 28) ISWHEN "0000"=>T<="111";Y<="0111111";WHEN "0001"=>T<="111";Y<="0000110";WHEN "0010"=>T<="111";Y<="1011011";WHEN "0011"=>T<="111";Y<="1001111";WHEN "0100"=>T<="111";Y<="1100110";WHEN "0101"=>T<="111";Y<="1101101";WHEN "0110"=>T<="111";Y<="1111101";WHEN "0111"=>T<="111";Y<="0000111";WHEN "1000"=>T<="111";Y<="1111111";WHEN "1001"=>T<="111";Y<="1101111";WHEN OTHERS=> NULL;END CASE;end if; END PROCESS;END four;⑥引脚:FSIN:待测频率输入CLK:1Hz输入频率CLK1:2048Hz的刷新频率E:三八译码器选择端口DOUT:数码管显示。
FPGA八位十进制数字频率计

数字系统设计与VHDL课程设计任务书一、题目:基于FPGA的八位十进制数字频率计的设计与仿真二、主要内容本次设计是运用FPGA(现场可编程门阵列)芯片来实现一个八位十进制数字频率计,输入信号频率通过数码管来显示。
设计中采用Verilog HDL语言编程,运用QUARTUS Ⅱ软件实现。
三、基本要求1. 查阅相关原始资料,书写文献综述,英文资料翻译。
2. 理解相关的资料,确定系统功能、性能指标,选择系统组成方案。
3. 选择系统方案,运用Verilog HDL编程,采用QUARTUS Ⅱ集成开发环境进行编辑、综合测试,并进行引脚锁定。
4. 采用MagicSOPC实验开发平台,以FPGA为核心器件,主控芯片为EP2C35F672C8器件并下载到试验箱中进行验证,最终实现所需的八位十进制数字频率计,并在数码管上显示。
5. 撰写研究报告及结果分析,书写课程设计论文。
四、时间安排五、教材及参考书[1] 潘松, 王国栋. VHDL实用教程[M].西安:电子科技大学出版社,2007.[2] 黄智伟. FPGA系统设计与实践[M].北京:电子工业出版社,2005.[3] 包明. 赵明富.EDA技术与数字系统设计[M].北京:北京航空航天大学出版社,2001.[4] 莫琳,基于FPGA的频率计的设计与实现[J].现代电子技术,2004[5] EDA修改稿基于FPGA的八位十进制数字频率计学生姓名:学院:专业班级:专业课程:指导教师:2014 年6 月15 日一、系统设计1.系统设计要求(1)频率测量范围:1-99.999999MHZ。
(2)测量误差<5%。
2.方案设计使用现场可编程逻辑器件(FPGA)制作,利用Verilog HDL硬件描述语言编程进行控制,然后下载烧写实现。
对于八位十进制数字频率计的设计,本方案采用的是现场可编程逻辑器件来实现, 它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度,还可以用软件QuartusⅡ软件进行仿真和调试等,可以充分利用verilog HDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易。
八位十进制数字频率计的设计..

2012~2013学年第二学期《数字系统设计》课程设计报告题目:数字频率计的设计班级:10电子信息(1)姓名:鲍学贵李闯王群卢军张力付世敏凌玲尹凡指导教师:周珍艮电气工程系2013年6月《数字系统设计》任务书摘要数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波、方波或其它周期性变化的信号。
数字频率计广泛应用于科研机构、学校、实验室、企业生产车间等场所。
研究数字频率计的设计和开发,有助于频率计功能的不断完善、性价比的提高和实用性的加强。
本文介绍了一种自顶向下分层设计多功能数字频率计的设计方法。
该频率计采用VHDL 硬件描述语言编程,以QuartusII为开发环境,极大地减少了硬件资源的占用。
数字频率计模块划分的设计具有相对独立性,可以对模块单独进行设计、调试和修改,缩短了设计周期。
所设计的VHDL语言通过仿真能够较好的测出所给频率并且满足数字频率计的自动清零和自动测试的功能要求,具有理论与实践意义。
关键词:VHDL ;数字频率计; EDA; QuartusII目录第一章绪论 (1)1.1 设计背景 (1)1.2 设计意义 (1)1.3 本文的主要工作 (2)第二章数字频率计的系统分析 (3)2.1 8位十进制数字频率计系统设计的原理 (3)2.1.1 数字频率计的基本原理 (3)2.1.2 系统总体框架图 (3)2.2 8位十进制数字频率计设计任务与要求 (4)2.3 目标芯片FLEX10K (4)第三章各功能模块基于VHDL的设计与仿真 (6)3.1 8位十进制数字频率计的电路逻辑图 (6)3.2 测频控制信号发生器的功能模块及仿真 (6)3.3系统时钟分频的功能模块及仿真 (8)3.4 32位锁存器的功能模块及仿真 (9)3.4.1 锁存器 (9)3.4.2 锁存器的功能模块及仿真 (9)3.5 数码管扫描的功能模块及仿真 (10)3.6 数码管译码显示的功能模块及仿真 (12)3.7 十进制计数器的功能模块及仿真 (14)3.7.1 计数器 (14)3.7.2 十进制计数器的功能模块及仿真 (14)3.8 8位十进制数字频率计的仿真 (16)第四章结束语 (23)参考文献 (24)答辩记录及评分表 (25)第一章绪论1.1设计背景数字频率计[1]是电子测量与仪表技术最基础的电子仪表类别之一,数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器,而且它是数字电压必不可少的部件。
实验08八位十进制频率计

实验八8位十进制频率计一. 实验目的1. 掌握8位十进制频率计的设计;2. 学习HDL编程例化语句的使用。
二. 准备知识根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1s的输入信号脉冲计数允许的信号;1s计数结束后,计数值锁入锁存器,并将下一测频计数周期做准备的计数器清零。
在这里,计数器由8个十进制的计数器级联组成,如图8.1所示的是频率计的计数结构图,可以看出,十进制模块之间是由进位级联而成的。
本实验要使用HDL语言编写顶层文件。
使用直流电机转速信号PIN140为待测频率,为使电机转动,需要给电机的加上控制信号,MotorA(PIN138)接VCC,MotorB(PIN139)接GND。
这里对直流电机的电路不做详细说明。
图8.1 8位十进制频率计原理图三. 实验步骤1、新建工程新建文件夹,在该文件夹下新建工程freqtest。
2、编写低层HDL文件根据原理图8.1的内容,编写各个功能模块的HDL文件。
3、编写顶层HDL文件编写顶层HDL文件freq,使用例化语句,把原理图8.1描述出来。
设定为顶层文件,进行编译,如有错误,纠正直至成功为止。
3、锁定管脚按表锁定管脚,并重新进行编译,把管脚信息编译到下载文件中。
4、下载下载后,观察所测的直流电机的频率。
直流电机每转动一圈,光电探测器产生4个速度脉冲信号。
故电机的实际频率为所测频率的1/4倍。
四. 实验参考程序程序清单TESTCTL.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TESTCTL ISPORT ( CLKK : IN STD_LOGIC; -- 1HzCNT_EN,RST_CNT,LOAD : OUT STD_LOGIC);END TESTCTL;ARCHITECTURE BEHA V OF TESTCTL ISSIGNAL DIV2CLK : STD_LOGIC;BEGINPROCESS( CLKK )BEGINIF CLKK'EVENT AND CLKK = '1' THENDIV2CLK <= NOT DIV2CLK;END IF;END PROCESS;PROCESS (CLKK, DIV2CLK)BEGINIF CLKK='0' AND Div2CLK='0' THENRST_CNT <= '1';ELSERST_CNT <= '0';END IF;END PROCESS;LOAD <= NOT DIV2CLK ;CNT_EN <= DIV2CLK;END BEHA V;程序清单CNT_10.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT_10 ISPORT ( CLK : IN STD_LOGIC;RST : IN STD_LOGIC; --1 RESETEN : IN STD_LOGIC; --1 COUNTER ENABLECO : OUT STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END CNT_10;ARCHITECTURE BEH OF CNT_10 ISSIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS (CLK)BEGINIF RST='1' THENQ1<=(OTHERS=>'0');ELSIF RISING_EDGE(CLK) THENIF EN='1' THENIF Q1="1001" THENQ1<=(OTHERS=>'0');CO<='1';ELSEQ1<=Q1+1;CO<='0';END IF;END IF;END IF;Q<=Q1;END PROCESS;END BEH;程序清单REG32B.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B ISPORT ( LOAD : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) ); END REG32B;ARCHITECTURE BEH OF REG32B ISBEGINPROCESS(LOAD, DIN)BEGINIF LOAD'EVENT AND LOAD = '1' THENDOUT <= DIN;END IF;END PROCESS;END BEH;程序清单CNT_10.VHDLIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY freq ISport ( F_IN : IN STD_LOGIC;CLK48MHz : IN STD_LOGIC;COUT : OUT STD_LOGIC;load : OUT STD_LOGIC;MotorA : OUT STD_LOGIC;MotorB : OUT STD_LOGIC;dig : OUT STD_LOGIC_VECTOR(7 downto 0);seg : OUT STD_LOGIC_VECTOR(7 downto 0));END freq;ARCHITECTURE bdf_type OF freq IScomponent cnt_10PORT(CLK : IN STD_LOGIC;RST : IN STD_LOGIC;EN : IN STD_LOGIC;CO : OUT STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(3 downto 0));end component;component testctlPORT(CLKK : IN STD_LOGIC;CNT_EN : OUT STD_LOGIC;RST_CNT : OUT STD_LOGIC;LOAD : OUT STD_LOGIC);end component;component int_divGENERIC (F_DIV:INTEGER;F_DIV_WIDTH:INTEGER);PORT(Clockin : IN STD_LOGIC;ClockOut : OUT STD_LOGIC;Cnt : OUT STD_LOGIC_VECTOR(16 downto 0));end component;component reg32bPORT(LOAD : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 downto 0);DOUT : OUT STD_LOGIC_VECTOR(31 downto 0));end component;component scanledPORT(DIN : IN STD_LOGIC_VECTOR(31 downto 0);SEL : IN STD_LOGIC_VECTOR(2 downto 0);DIG : OUT STD_LOGIC_VECTOR(7 downto 0);DSEL : OUT STD_LOGIC_VECTOR(3 downto 0));end component;component decode7PORT(DIN : IN STD_LOGIC_VECTOR(3 downto 0);DOUT : OUT STD_LOGIC_VECTOR(7 downto 0));end component;signal CLK1Hz, CLK400Hz, RESET, ENABLE: STD_LOGIC;signal F ,REGF : STD_LOGIC_VECTOR(31 downto 0);--signal load : STD_LOGIC;signal COUTA, COUTB, COUTC, COUTD, COUTF, COUTE, COUTG: STD_LOGIC; signal SCANCNT : STD_LOGIC_VECTOR(2 downto 0);signal SEGIN : STD_LOGIC_VECTOR(3 downto 0);BEGINMotorA <= '1';MotorB <= '0';U1 : cnt_10PORT MAP(CLK => F_IN,RST => RESET,EN => ENABLE,CO => COUTA,Q => F(3 downto 0));U2 : cnt_10PORT MAP(CLK => COUTA,RST => RESET,EN => ENABLE,CO => COUTB,Q => F(7 downto 4));U3 : cnt_10PORT MAP(CLK => COUTB,RST => RESET,EN => ENABLE,CO => COUTC,Q => F(11 downto 8));U4 : cnt_10PORT MAP(CLK => COUTC,RST => RESET,EN => ENABLE,CO => COUTD,Q => F(15 downto 12));U13 : cnt_10PORT MAP(CLK => COUTD,RST => RESET,EN => ENABLE,CO => COUTE,Q => F(19 downto 16));U15 : cnt_10PORT MAP(CLK => COUTE,RST => RESET,EN => ENABLE,CO => COUTF,Q => F(23 downto 20));U14 : cnt_10PORT MAP(CLK => COUTF,RST => RESET,EN => ENABLE,CO => COUTG,Q => F(27 downto 24));U16 : cnt_10PORT MAP(CLK => COUTG,RST => RESET,EN => ENABLE,CO => COUT,Q => F(31 downto 28));U9 : testctlPORT MAP(CLKK => CLK1Hz,CNT_EN => ENABLE,RST_CNT => RESET,LOAD => load);Uinst : int_divGENERIC MAP(F_DIV => 120000,F_DIV_WIDTH => 17) PORT MAP(Clockin => CLK48MHz,ClockOut => CLK400Hz);Uinst1 : reg32bPORT MAP(LOAD => load,DIN => F,DOUT => REGF);Uinst2 : scanledPORT MAP(DIN => REGF,SEL => SCANCNT,DIG => dig,DSEL => SEGIN);Uinst3 : decode7PORT MAP(DIN => SEGIN,DOUT => seg);Uinst6 : int_divGENERIC MAP(F_DIV => 8,F_DIV_WIDTH => 3) PORT MAP(Clockin => CLK400Hz,Cnt => SCANCNT);Uinst7 : int_divGENERIC MAP(F_DIV => 400,F_DIV_WIDTH => 9) PORT MAP(Clockin => CLK400Hz,ClockOut => CLK1Hz);END;程序清单CNT_10.VHDVerilog HDL 程序:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字系统设计与VHDL课程设计任务书一、题目:基于FPGA的八位十进制数字频率计的设计与仿真二、主要内容本次设计是运用FPGA(现场可编程门阵列)芯片来实现一个八位十进制数字频率计,输入信号频率通过数码管来显示。
设计中采用Verilog HDL语言编程,运用QUARTUS Ⅱ软件实现。
三、基本要求1. 查阅相关原始资料,书写文献综述,英文资料翻译。
2. 理解相关的资料,确定系统功能、性能指标,选择系统组成方案。
3. 选择系统方案,运用Verilog HDL编程,采用QUARTUS Ⅱ集成开发环境进行编辑、综合测试,并进行引脚锁定。
4. 采用MagicSOPC实验开发平台,以FPGA为核心器件,主控芯片为EP2C35F672C8器件并下载到试验箱中进行验证,最终实现所需的八位十进制数字频率计,并在数码管上显示。
5. 撰写研究报告及结果分析,书写课程设计论文。
四、时间安排五、教材及参考书[1] 潘松, 王国栋. VHDL实用教程[M].西安:电子科技大学出版社,2007.[2] 黄智伟. FPGA系统设计与实践[M].北京:电子工业出版社,2005.[3] 包明. 赵明富.EDA技术与数字系统设计[M].北京:北京航空航天大学出版社,2001.[4] 莫琳,基于FPGA的频率计的设计与实现[J].现代电子技术,2004[5] EDA修改稿基于FPGA的八位十进制数字频率计学生姓名:学院:专业班级:专业课程:指导教师:2014 年6 月15 日一、系统设计1.系统设计要求(1)频率测量范围:1-99.MHZ。
(2)测量误差<5%。
2.方案设计使用现场可编程逻辑器件(FPGA)制作,利用Verilog HDL硬件描述语言编程进行控制,然后下载烧写实现。
对于八位十进制数字频率计的设计,本方案采用的是现场可编程逻辑器件来实现, 它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度,还可以用软件QuartusⅡ软件进行仿真和调试等,可以充分利用verilog HDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易。
3.设计说明八位十进制数字频率计的基本原理是,测频法和测周期法。
测频法是在确定的时间Tw内,记录被测信号的周期Nx,则测得的频率为Fx=Nx/Tw。
测周期法需要有标准信号频率fs,在待测信号的一个周期Tx内,记录标准频率的周期数,则测得的频率为fx=fs/Ns。
4.设计模块本设计可有3个模块实现,如下图所示。
顶层模块(时基控制,分频以及对测频的控制);十进制计数器模块,对测量的脉冲进行计数;数码管显示模块,用于测量的结果,通过试验箱上的数码管显示,利用动态扫描显示。
二、软件设计1.程序框图程序框图如图1所示。
图1 程序框图2.Verilog HDL源程序(见附录)三、调试和下载验证1.实验调试(1)软件调试1) 运行Quartus II软件。
双击桌面Quartus II9.0或者开始菜单\altera\ Quartus II9.0进入程序主窗口。
2) 新建源程序文件。
点击File\new\verilog HDL File,点击ok。
输入程序代码。
3) 新建工程。
保存程序代码时,软件会自动提示新建工程,也可以点击取消,创建新的源程序文件,全部模块的源程序创建完成再新建工程,最后把所有模块添加到工程。
两个方法过程都差不多。
点击File\New Project Wizard点击next,第一行是工程目录,第二行是工程名称,第三行是顶层实体名,这必须与主程序模块名一致。
然后点击next,点击Add All再点击next,器件选择EP2C35F672C8,再点击next,确定。
4) 综合编译。
点击star compilation进行编译。
编译过程中提示首先提示Decode_8S缺失,仔细检查后发现没有创建Decode_8S源程序文件。
创建好后再编译,提示好几个地方的符号错误,双击错误定位到出现错误的地方,修改好,点击编译,提示一处错误,双击定位到出错地点,发现是逻辑错误,查阅参考书后,把错误修正了。
再点击编译,没有错误。
5) 创建波形文件。
点击File\new\vector waveform file,然后添加clk、key、SM_duan节点,设置clk频率,并把key波形随机设置几个1,点击仿真。
(2)硬件调试在软件调试调试成功的情况下,接下来我们要进行硬件调试,步骤如下:1) 运行Quartus II软件,打开工程。
2) 再次编译源程序(见附录)。
3) 分配管脚(见附录)。
4) 将生成的.sof文件写入FPGA试验箱中。
(3)实物拍照实物如图2所示。
图2 实物照片2.实验结论所做的八位十进制数字频率计,当输入信号时就会在数码管上显示被测信号的频率,并且误差很小,只有当被测信号频率特大时会出现误差,其他都和标准频率一样。
四、感受两周的实训已经过去,对于我来说这两周的实训赋予了我太多实用的东西了,不仅让我更深层次的对课本的理论知识深入了理解,而且还让我对分析事物的逻辑思维能力得到了锻炼,提高了实际动手能力,下面谈一下就这两周实训中我自己的一些心得体会。
我们在老师提供的实践平台上通过自己的实践学到了很多课本上学不到的宝贵东西,熟悉了对相关软件的一般项目的操作和学到了处理简单问题的基本方法,更重要的是掌握了verilog HDL语言的基本设计思路和方法,我想这些会对我今后的学习起到很大的助推作用。
此外,还要在今后的课本理论知识学习过程中要一步一个脚印的扎实学习,灵活的掌握和运用专业理论知识这样才能在以后出去工作的实践过程中有所成果。
其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。
通过这次课程设计使我懂得了理论与实际相结合很重要,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
最后还要感谢学校为我们提供这样专业的实践平台还有实训老师在两周实训以来的不断指导和同学的热情帮助。
总的来说,这次实训我收获很大。
参考文献[1] 夏宇闻.Verilog数字系统教程[M].北京:北京航空航天出版社,2006.[2] 梁瑞宇.FPGA设计实验指导书(Verilog HDL)[M].北京:北京航空航天出版社,2008.[3]潘松著.EDA技术实用教程-Verilog_HDL版(第4版)[M].北京:科学出版社,2010.附录源程序八位十进制数字频率计程序实现如下module freqtest(clock,clock0,dig,seg);input clock; //系统时钟input clock0; //被测信号输入output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg [25:0] counter; //时钟分频计数器reg [31:0] freq_result; //频率测量结果寄存器wire [31:0] pre_freq; //脉冲计数寄存器reg rst;wire divide_clk; //1Hz 闸门信号wire clk_scan; //数码管扫描显示时钟wire cout1,cout2,cout3,cout4,cout5,cout6,cout7;assign clk_scan = counter[15]; //动态扫描时钟//时钟分频进程:分出1Hz 基准信号always @(posedge clock)beginif (divide_clk)counter <= 26'd0;elsecounter <= counter + 1'b1;endassign divide_clk = (counter >= 26'd);//锁存测量值进程always @(posedge clock)beginif(divide_clk)freq_result <= pre_freq;end//产生计数器复位信号always @(posedge clock)beginif(divide_clk)rst <= 1'b1;elserst <= 1'b0;end//8 位十进制计数模块:由8 个十进制计数模块构成cnt10 u1(.clock(clock0),.rst(rst),.cin(1'b1),.cout(cout1),.dout(pre_freq[3:0])); cnt10 u2(.clock(clock0),.rst(rst),.cin(cout1),.cout(cout2),.dout(pre_freq[7:4])); cnt10 u3(.clock(clock0),.rst(rst),.cin(cout2),.cout(cout3),.dout(pre_freq[11:8])); cnt10 u4(.clock(clock0),.rst(rst),.cin(cout3),.cout(cout4),.dout(pre_freq[15:12])); cnt10 u5(.clock(clock0),.rst(rst),.cin(cout4),.cout(cout5),.dout(pre_freq[19:16])); cnt10 u6(.clock(clock0),.rst(rst),.cin(cout5),.cout(cout6),.dout(pre_freq[23:20])); cnt10 u7(.clock(clock0),.rst(rst),.cin(cout6),.cout(cout7),.dout(pre_freq[27:24])); cnt10 u8(.clock(clock0),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28]));//数码管显示模块scan_led u9(.clk_1k(clk_scan),.d(freq_result),.dig(dig),.seg(seg)); endmodulemodule cnt10(clock,rst,cin,cout,dout); //10 进制计数器input clock; //计数时钟input cin; //进位输入input rst; //复位信号output cout; //进位输出output[3:0] dout; //计数输出reg[3:0] counter; //寄存器assign dout = counter;assign cout = cin && (counter >= 4'd9); //进位输出always @(posedge clock or posedge rst)beginif(rst)counter <= 4'd0; //计数器复位else if(cin) //进位输入beginif(cout)counter <= 4'd0;elsecounter <= counter + 1'b1;endendendmodulemodule scan_led(clk_1k,d,dig,seg);input clk_1k;input [31:0] d; //输入要显示的数据output [7:0] dig; //数码管选择输出引脚output [7:0] seg; //数码管段输出引脚reg [7:0] seg_r; //定义数码管输出寄存器reg [7:0] dig_r; //定义数码管选择输出寄存器reg [3:0] disp_dat; //定义显示数据寄存器reg [2:0] count; //定义计数寄存器assign dig=dig_r; //输出数码管选择assign seg=seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <=count+1'b1;endalways @(posedge clk_1k)beginif(d<10)begincase(count) //选择扫描显示数据3'd0:disp_dat=d[31:28]; //第一个数码管3'd1:disp_dat=d[27:24]; //第二个数码管3'd2:disp_dat=d[23:20]; //第三个数码管3'd3:disp_dat=d[19:16]; //第四个数码管3'd4:disp_dat=d[15:12]; //第五个数码管3'd5:disp_dat=d[11:8]; //第六个数码管3'd6:disp_dat=d[7:4]; //第七个数码管3'd7:disp_dat=d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r=8'b; //选择第一个数码管显示3'd1:dig_r=8'b; //选择第二个数码管显示3'd2:dig_r=8'b; //选择第三个数码管显示3'd3:dig_r=8'b; //选择第四个数码管显示3'd4:dig_r=8'b; //选择第五个数码管显示3'd5:dig_r=8'b; //选择第六个数码管显示3'd6:dig_r=8'b; //选择第七个数码管显示3'd7:dig_r=8'b; //选择第八个数码管显示endcaseendif(d>10&d<100)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendif(d>100&d<1000)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;endcaseendif(d>1000&d<10000) begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendif(d>10000&d<)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendif(d>&d<)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendif(d>&d<)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendif(d>)begincase(count)3'd0:disp_dat=d[31:28];3'd1:disp_dat=d[27:24];3'd2:disp_dat=d[23:20];3'd3:disp_dat=d[19:16];3'd4:disp_dat=d[15:12];3'd5:disp_dat=d[11:8];3'd6:disp_dat=d[7:4];3'd7:disp_dat=d[3:0];endcasecase(count)3'd0:dig_r=8'b;3'd1:dig_r=8'b;3'd2:dig_r=8'b;3'd3:dig_r=8'b;3'd4:dig_r=8'b;3'd5:dig_r=8'b;3'd6:dig_r=8'b;3'd7:dig_r=8'b;endcaseendendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r=8'hc0; //显示04'h1:seg_r=8'hf9; //显示14'h2:seg_r=8'ha4; //显示24'h3:seg_r=8'hb0; //显示34'h4:seg_r=8'h99; //显示44'h5:seg_r=8'h92; //显示54'h6:seg_r=8'h82; //显示64'h7:seg_r=8'hf8; //显示74'h8:seg_r=8'h80; //显示84'h9:seg_r=8'h90; //显示94'ha:seg_r=8'h88; //显示a4'hb:seg_r=8'h83; //显示b4'hc:seg_r=8'hc6; //显示c4'hd:seg_r=8'ha1; //显示d4'he:seg_r=8'h86; //显示e4'hf:seg_r=8'h8e; //显示fendcaseendendmodule。