目录一、设计任务与要求 (3)二、总体框图 (3)三、选择器件 (4)四、功能 (5)1、数控分频器 (5)2、BCD译码器 (6)3、扫描器 (11)4、3-8译码器 (13)5、7段数码管显示译码器 (16)五、总体设计电路图 (19)1总体(顶层)电路原理图 (19)2仿真结果 (19)3管脚分配图 (20)4.硬件连接情况 (20)六.心得体会 (20)数控分频器设计一、设计任务与要求数控分频器的功能就是当输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,以实现所需的输出频率。
基本功能:1、实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频,如输入01001000,即对输入的时钟信号进行72 分频。
2、输出的波形应为占空比位50%的方波。
3、有显示功能,显示当前的分频比,即,输入的二进制数的大小。
总体框图设计思路:数控分频器用计数值可并行预置的加法器设计完成,当在输入端给定不同输入数据时将对输入的时钟信号有不同的分频比。
把输入端输入的八位二进制数直接通过BCD译码器转换为十位BCD码表示的十进制数,通过扫描器对3个数码管进行选通扫描,最后7段数码管显示译码器对选中数码管的赋值进行译码,并驱动数码管显示该数据。
模块的功能:1、数控分频器:实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频。
2、BCD译码器:把输入端的8位2进制数转换成10位BCD码表示的十进制数。
3、扫描器:when “000”=>daout<=dout(3 downto 0);when “001”=>daout<=dout(7 downto 4);when “010”=>daout<=dout(3 downto 2)<="00";daout(1 downto 0)<=dout(9 downto 8);when others=>null;4、3-8译码器:当sel=0时,q=11111110;选择个位数码管亮。
当sel=1时,q=11111101;选择十位数码管亮。
当sel=2时,q=11111011;选择百位数码管亮。
5、7段数码管显示译码器:把BCD码表示的十进制数转换成驱动数码管显示的段信号,使数码管显示数字。
三、选择器件1、装有QuartusII软件的计算机一台。
2、芯片:使用altera公司生产的Cyclone系列芯片,如EP1C12Q240C8芯片。
此次设计实验采用ALTERA公司的cyclone系列的FPGA芯片EP1C12,设计和仿真采用ALTERA公司的QUARTUS II软件,EP1C12各项参数参照上表。
Cyclone的性能特性(1)、新的可编程体系结构,实现低成本设计。
(2)、嵌入式存储器资源支持多种存储器应用和数字信号处理(DSP)实现(3)、专用外部存储器接口电路,支持与DDR FCRAM 和SDRAM 器件以及SDR SDRAM 存储器的连接。
(4)、支持串行总线和网络接口以及多种通信协议片内和片外系统时序管理使用嵌入式PLL(5)、支持单端I/O 标准和差分I/O 技术,LVDS 信号数据速率高达640Mbps 。
(6)、处理功耗支持Nios II 系列嵌入式处理器(7)、采用新的串行配置器件的低成本配置方案(8)、Quartus II 软件OpenCore 评估特性支持免费的IP 功能评估3、EDA 实验箱一个。
4、下载接口是数字芯片的下载接口(JTAG )主要用于FPGA 芯片的数据下载。
5、拨码开关。
6、7段数码管显示.将七段数码管的输入,即四位二进制数译十进制的形式显示到数码管上,数码管的每段是高电平,即输出位1时对应的灯就亮,输出位出0灯就灭,根据灯亮的段读出数字。
四、功能模块1、数控分频器dv f instclkd[7..0]f out图1数控分频器逻辑符号逻辑功能:用计数值可并行预置的加法计数器设计完成,当输入端输入的8位二进制数不同时,有不同的分频比。
VHDL 程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dvf isport ( clk : in std_logic;d : in std_logic_vector( 7 downto 0);fout :out std_logic );end;architecture one of dvf issignal full : std_logic;beginp_reg: process(clk)variable cnt8 : std_logic_vector(7 downto 0);beginif clk'event and clk='1' thenif cnt8= "11111111" thencnt8 := d;full <='1';else cnt8 :=cnt8 + 1;full <= '0';end if;end if;end process p_reg ;p_div: process(full)variable cnt2 : std_logic;beginif full'event and full ='1' thencnt2 :=not cnt2;if cnt2= '1' then fout<='1'; else fout<='0';end if;end if;end process p_div;end;仿真结果:图2 数控分频器仿真图仿真分析:波形仿真结果如上图所示,图中d[7..0]表示8位2进制输入端,fout为对时钟端的分频(大小与输入端2进制数大小相同)。
2、BCD译码器bin2bcddin[7..0]bcd[9..0]inst1图3 BCD译码器逻辑符号逻辑功能:把0-255这256个用8位2进制数表示的十进制数转换成用10位BCD 码表示的十进制数。
VHDL程序library ieee;use ieee.std_logic_1164.all;entity bin2bcd isport(din:in std_logic_vector(7 downto 0);bcd:out std_logic_vector(9 downto 0));end bin2bcd;architecture fun of bin2bcd isbeginprocess(din)begincase din iswhen "00000000"=>bcd<="0000000000";when "00000001"=>bcd<="0000000001";when "00000010"=>bcd<="0000000010";when "00000011"=>bcd<="0000000011";when "00000100"=>bcd<="0000000100";when "00000101"=>bcd<="0000000101";when "00000110"=>bcd<="0000000110";when "00000111"=>bcd<="0000000111";when "00001000"=>bcd<="0000001000";when "00001001"=>bcd<="0000001001";when "00001010"=>bcd<="0000010000";when "00001011"=>bcd<="0000010001";when "00001100"=>bcd<="0000010010";when "00001101"=>bcd<="0000010011";when "00001110"=>bcd<="0000010100";when "00001111"=>bcd<="0000010101";when "00010000"=>bcd<="0000010110";when "00010001"=>bcd<="0000010111";when "00010010"=>bcd<="0000011000";when "00010011"=>bcd<="0000011001";when "00010100"=>bcd<="0000100000";when "00010101"=>bcd<="0000100001";when "00010110"=>bcd<="0000100010";when "00010111"=>bcd<="0000100011";when "00011000"=>bcd<="0000100100";when "00011001"=>bcd<="0000100101";when "00011010"=>bcd<="0000100110";when "00011100"=>bcd<="0000101000"; when "00011101"=>bcd<="0000101001"; when "00011110"=>bcd<="0000110000"; when "00011111"=>bcd<="0000110001"; when "00100000"=>bcd<="0000110010"; when "00100001"=>bcd<="0000110011"; when "00100010"=>bcd<="0000110100"; when "00100011"=>bcd<="0000110101"; when "00100100"=>bcd<="0000110110"; when "00100101"=>bcd<="0000110111"; when "00100110"=>bcd<="0000111000"; when "00100111"=>bcd<="0000111001"; when "00101000"=>bcd<="0001000000"; when "00101001"=>bcd<="0001000001"; when "00101010"=>bcd<="0001000010"; when "00101011"=>bcd<="0001000011"; when "00101100"=>bcd<="0001000100"; when "00101101"=>bcd<="0001000101"; when "00101110"=>bcd<="0001000110"; when "00101111"=>bcd<="0001000111"; when "00110000"=>bcd<="0001001000"; when "00110001"=>bcd<="0001001001"; when "00110010"=>bcd<="0001010000"; when "00110011"=>bcd<="0001010001"; when "00110100"=>bcd<="0001010010"; when "00110101"=>bcd<="0001010011"; when "00110110"=>bcd<="0001010100"; when "00110111"=>bcd<="0001010101"; when "00111000"=>bcd<="0001010110"; when "00111001"=>bcd<="0001010111"; when "00111010"=>bcd<="0001011000"; when "00111011"=>bcd<="0001011001"; when "00111100"=>bcd<="0001100000"; when "00111101"=>bcd<="0001100001"; when "00111110"=>bcd<="0001100010"; when "00111111"=>bcd<="0001100011"; when "01000000"=>bcd<="0001100100"; when "01000001"=>bcd<="0001100101"; when "01000010"=>bcd<="0001100110"; when "01000011"=>bcd<="0001100111"; when "01000100"=>bcd<="0001101000"; when "01000101"=>bcd<="0001101001"; when "01000110"=>bcd<="0001110000";when "01001000"=>bcd<="0001110010"; when "01001001"=>bcd<="0001110011"; when "01001010"=>bcd<="0001110100"; when "01001011"=>bcd<="0001110101"; when "01001100"=>bcd<="0001110110"; when "01001101"=>bcd<="0001110111"; when "01001110"=>bcd<="0001111000"; when "01001111"=>bcd<="0001111001"; when "01010000"=>bcd<="0010000000"; when "01010001"=>bcd<="0010000001"; when "01010010"=>bcd<="0010000010"; when "01010011"=>bcd<="0010000011"; when "01010100"=>bcd<="0010000100"; when "01010101"=>bcd<="0010000101"; when "01010110"=>bcd<="0010000110"; when "01010111"=>bcd<="0010000111"; when "01011000"=>bcd<="0010001000"; when "01011001"=>bcd<="0010001001"; when "01011010"=>bcd<="0010010000"; when "01011011"=>bcd<="0010010001"; when "01011100"=>bcd<="0010010010"; when "01011101"=>bcd<="0010010011"; when "01011110"=>bcd<="0010010100"; when "01011111"=>bcd<="0010010101"; when "01100000"=>bcd<="0010010110"; when "01100001"=>bcd<="0010010111"; when "01100010"=>bcd<="0010011000"; when "01100011"=>bcd<="0010011001"; when "01100100"=>bcd<="010*******"; when "01100101"=>bcd<="010*******"; when "01100110"=>bcd<="010*******"; when "01100111"=>bcd<="010*******"; when "01101000"=>bcd<="010*******"; when "01101001"=>bcd<="010*******"; when "01101010"=>bcd<="010*******"; when "01101011"=>bcd<="010*******"; when "01101100"=>bcd<="010*******"; when "01101101"=>bcd<="010*******"; when "01101110"=>bcd<="010*******"; when "01101111"=>bcd<="010*******"; when "01110000"=>bcd<="010*******"; when "01110001"=>bcd<="010*******"; when "01110010"=>bcd<="010*******";when "01110100"=>bcd<="010*******"; when "01110101"=>bcd<="010*******"; when "01110110"=>bcd<="010*******"; when "01110111"=>bcd<="010*******"; when "01111000"=>bcd<="010*******"; when "01111001"=>bcd<="010*******"; when "01111010"=>bcd<="010*******"; when "01111011"=>bcd<="010*******"; when "01111100"=>bcd<="010*******"; when "01111101"=>bcd<="010*******"; when "01111110"=>bcd<="010*******"; when "01111111"=>bcd<="010*******"; when "10000000"=>bcd<="010*******"; when "10000001"=>bcd<="010*******"; when "10000010"=>bcd<="010*******"; when "10000011"=>bcd<="010*******"; when "10000100"=>bcd<="010*******"; when "10000101"=>bcd<="010*******"; when "10000110"=>bcd<="010*******"; when "10000111"=>bcd<="010*******"; when "10001000"=>bcd<="010*******"; when "10001001"=>bcd<="010*******"; when "10001010"=>bcd<="010*******"; when "10001011"=>bcd<="010*******"; when "10001100"=>bcd<="010*******"; when "10001101"=>bcd<="010*******"; when "10001110"=>bcd<="010*******"; when "10001111"=>bcd<="010*******"; when "10010000"=>bcd<="010*******"; when "10010001"=>bcd<="010*******"; when "10010010"=>bcd<="010*******"; when "10010011"=>bcd<="010*******"; when "10010100"=>bcd<="010*******"; when "10010101"=>bcd<="010*******"; when "10010110"=>bcd<="010*******"; when "10010111"=>bcd<="010*******"; when "10011000"=>bcd<="010*******"; when "10011001"=>bcd<="010*******"; when "10011010"=>bcd<="010*******"; when "10011011"=>bcd<="010*******"; when "10011100"=>bcd<="010*******"; when "10011101"=>bcd<="010*******"; when "10011110"=>bcd<="010*******";when "10100000"=>bcd<="010*******"; when "10100001"=>bcd<="010*******"; when "10100010"=>bcd<="010*******"; when "10100011"=>bcd<="010*******"; when "10100100"=>bcd<="010*******"; when "10100101"=>bcd<="010*******"; when "10100110"=>bcd<="010*******"; when "10100111"=>bcd<="010*******"; when "10101000"=>bcd<="010*******"; when "10101001"=>bcd<="010*******"; when "10101010"=>bcd<="010*******"; when "10101011"=>bcd<="010*******"; when "10101100"=>bcd<="010*******"; when "10101101"=>bcd<="010*******"; when "10101110"=>bcd<="010*******"; when "10101111"=>bcd<="010*******"; when "10110000"=>bcd<="010*******"; when "10110001"=>bcd<="010*******"; when "10110010"=>bcd<="010*******"; when "10110011"=>bcd<="010*******"; when "10110100"=>bcd<="0110000000"; when "10110101"=>bcd<="0110000001"; when "10110110"=>bcd<="0110000010"; when "10110111"=>bcd<="0110000011"; when "10111000"=>bcd<="0110000100"; when "10111001"=>bcd<="0110000101"; when "10111010"=>bcd<="0110000110"; when "10111011"=>bcd<="0110000111"; when "10111100"=>bcd<="0110001000"; when "10111101"=>bcd<="0110001001"; when "10111110"=>bcd<="0110010000"; when "10111111"=>bcd<="0110010001"; when "11000000"=>bcd<="0110010010"; when "11000001"=>bcd<="0110010011"; when "11000010"=>bcd<="0110010100"; when "11000011"=>bcd<="0110010101"; when "11000100"=>bcd<="0110010110"; when "11000101"=>bcd<="0110010111"; when "11000110"=>bcd<="0110011000"; when "11000111"=>bcd<="0110011001"; when "11001000"=>bcd<="0110000100"; when "11001001"=>bcd<="0110000101"; when "11001010"=>bcd<="0110000110";when "11001100"=>bcd<="0110001000"; when "11001101"=>bcd<="0110001001"; when "11001110"=>bcd<="0110010000"; when "11001111"=>bcd<="0110010001"; when "11010000"=>bcd<="0110010010"; when "11010001"=>bcd<="0110010011"; when "11010010"=>bcd<="0110010100"; when "11010011"=>bcd<="0110010101"; when "11010100"=>bcd<="0110010110"; when "11010101"=>bcd<="0110010111"; when "11010110"=>bcd<="0110011000"; when "11010111"=>bcd<="0110011001"; when "11011000"=>bcd<="1000000000"; when "11011001"=>bcd<="1000000001"; when "11011010"=>bcd<="1000000010"; when "11011011"=>bcd<="1000000011"; when "11011100"=>bcd<="1000000100"; when "11011101"=>bcd<="1000000101"; when "11011110"=>bcd<="1000000110"; when "11011111"=>bcd<="1000000111"; when "11100000"=>bcd<="1000001000"; when "11100001"=>bcd<="1000001001"; when "11100010"=>bcd<="1000010000"; when "11100011"=>bcd<="1000010001"; when "11100100"=>bcd<="1000010010"; when "11100101"=>bcd<="1000010011"; when "11100110"=>bcd<="1000010100"; when "11100111"=>bcd<="1000010101"; when "11101000"=>bcd<="1000010110"; when "11101001"=>bcd<="1000010111"; when "11101010"=>bcd<="1000011000"; when "11101011"=>bcd<="1000011001"; when "11101100"=>bcd<="1000100000"; when "11101101"=>bcd<="1000100001"; when "11101110"=>bcd<="1000100010"; when "11101111"=>bcd<="1000100011"; when "11110000"=>bcd<="1000100100"; when "11110001"=>bcd<="1000100101"; when "11110010"=>bcd<="1000100110"; when "11110011"=>bcd<="1000100111"; when "11110100"=>bcd<="1000101000"; when "11110101"=>bcd<="1000101001"; when "11110110"=>bcd<="1000110000";when "11111000"=>bcd<="1001001000";when "11111001"=>bcd<="1001001001";when "11111010"=>bcd<="1001010000";when "11111011"=>bcd<="1001010001";when "11111100"=>bcd<="1001010010";when "11111101"=>bcd<="1001010011";when "11111110"=>bcd<="1001010100";when "11111111"=>bcd<="1001010101";when others=>bcd<=null;end case;end process;end architecture fun;仿真结果图4 BCD译码器仿真图仿真分析:仿真波形结果如上图所示din[7..0]为输入的8位2进制数,经译码器译码后转换为相应的BCD码。