南昌大学实验报告学生姓名:学号:专业班级:中兴101班实验类型:□验证□综合■设计□创新实验日期:2012、10、18成绩:实验二模可变计数器的设计一、实验目的1.学习计数器的VHDL设计、波形仿真和硬件测试;2.学会自己设计程序;3.学会设计模可变计数器;4.学习多层次设计方法。
二、实验内容与要求1.计设置一位控制模的位M,要求M=0:模23计数;当M=1:模109计数。
2.计数结果用静态数码管显示,一个四位二进制表示0~9中的一个数;3.给出此项设计的仿真波形;4.应用实验装置验证此计数器的功能。
三、实验思路1.按照实验要求,本实验可分为四个模块进程:分频、模23与109计数转换、数码管控制、七段译码。
2.模可变计数器原理:即在原有的模值计数器上加入模值转换功能3.计数器的数码管显示需注意十位和百位的进位即:当个位数的数值为9的下一个脉冲来时转换为,同时向十位进一,转换的算法为:9(1001)+7(0111)=0(0000),并进一位;当数值为99时,用同样的方法转换:153(1001 1001B,数码管显示99)+103(01100111B)=100(0001 0000 0000);4.要求分别实现模23和模109的计数,因此我分别用buffer变量GW、SW 、 BW 代表个位、十位、百位。
还有一个控制模的位M,当M为0时实现模23计数,只用到GW和SW分别为个位和十位计数;当M为1时实现模109计数,用GW 、SW、 BW 分别为个位十位和百位计数。
由于端口不能参与运算,因些在结构体中定义了se10、 sel1、 sel2三个buffer变量,分别用来对应SEL(0)、 SEL(1)、SEL(2);在程序的最后用端口接收信号。
5.进程敏感信号为RST EN M 三个,当RST为低电平,EN为高电平时则计数,否则不计数。
6.位选信号的设置:用整形变量CNT8分别使不同的位选信号对应不同的输入,而得到不同输出。
对应关系:表一位选信号7.模23与模109计数转换思路框图:图一思维框图四.实现方法一:原理图输入法设计(自己独立完成)1. 建立文件夹建立自己的文件夹(目录),如c:\myeda,进入Windows操作系统Quartus II不能识别中文,文件及文件夹名不能用中文。
2. 原理图设计输入打开Quartus II,选菜单File→New,选择“Device Design File->Block Diagram->Schematic File”项。
点击“OK”,在主界面中将打开“Block Editor”窗口。
(1)分频器模块:(实体名为CLKDIV)--时间:2012年9月28号--版本:7.0--功能:分频器(100分频)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CLKDIV IS—定义实体名为CLKDIVPORT(CLK : IN STD_LOGIC;--输入信号为自带时钟CLK_DIV : OUT STD_LOGIC);--输出信号为分频后的时钟信号END CLKDIV;ARCHITECTURE RT1 OF CLKDIV ISSIGNAL DA TA:INTEGER RANGE 0 TO 100;--实现100分频SIGNAL CLK_TEMP:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF RISING_EDGE(CLK) THENIF(DATA=100) THENDATA<=0;CLK_TEMP<=NOT CLK_TEMP;ELSEDATA<=DATA+1;END IF;END IF;CLK_DIV<=CLK_TEMP;END PROCESS;END RT1;(2)计数模块:(实体名为COUNT)--时间:2012年9月28号--版本:7.0--功能:模可变计数器LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count ISPORT (CLK,RST,EN,M : IN STD_LOGIC;--输入变量为CLK、复位信号:RST、使能端信号:EN、--以及模变转换信号:MCQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ;--输出信号为计数的个、十、百位COUT : OUT STD_LOGIC ) ;--count为进位位END ENTITY count;ARCHITECTURE one OF count ISSIGNAL model : INTEGER;BEGINPROCESS (CLK,RST,EN,M,model)V ARIABLE CQI : STD_LOGIC_VECTOR (11 DOWNTO 0) ;BEGINIF M = '0' THEN model <= 34;ELSIF M = '1' THEN model <= 264;ELSE model <= 0;END IF;IF RST = '1' THEN CQI := (OTHERS => '0');ELSIF CLK'EVENT AND CLK = '1' THENIF EN = '1' THENIF CQI < model THENIF CQI(7 DOWNTO 0) = 153 THEN CQI := CQI + 103 ;ELSIF CQI(3 DOWNTO 0) = 9 THEN CQI := CQI + 7 ;ELSE CQI := CQI + 1 ;END IF;ELSE CQI := (OTHERS => '0') ;END IF;END IF;END IF;IF CQI = model THEN COUT <= '1';ELSE COUT <= '0';END IF;CQ1 <= CQI(3 DOWNTO 0);CQ2 <= CQI(7 DOWNTO 4);CQ3 <= CQI(11 DOWNTO 8);END PROCESS;END ARCHITECTURE one;(3)数码管显示模块:(实体名为scan_led)--时间:2012年9月28号--版本:7.0--功能:数码管显示LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan_led ISPORT(clk : IN STD_LOGIC;data1,data2,data3: IN STD_LOGIC_VECTOR(3 DOWNTO 0);scan : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--输出数码管的7位显示choose: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--数码管位选信号END ENTITY;ARCHITECTURE one OF scan_led ISSIGNAL cout8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINP1:PROCESS(cout8)—数码管动态扫描BEGINCASE cout8 ISWHEN "000" => choose <= "000"; A <= "0000";WHEN "001" => choose <= "001"; A <= "0000";WHEN "010" => choose <= "010"; A <= "0000";WHEN "011" => choose <= "011"; A <= "0000";WHEN "100" => choose <= "100"; A <= "0000";WHEN "101" => choose <= "101"; A <= data3;WHEN "110" => choose <= "110"; A <= data2;WHEN "111" => choose <= "111"; A <= data1;WHEN OTHERS => NULL;END CASE;END PROCESS P1;P2:PROCESS(clk)BEGINIF clk'EVENT AND clk ='1' THEN cout8 <= cout8+1;END IF;END PROCESS P2;P3:PROCESS(A)—数码管译码BEGINCASE A ISWHEN "0000"=> scan <="0111111"; --0WHEN "0001"=> scan <="0000110"; --1WHEN "0010"=> scan <="1011011"; --2WHEN "0011"=> scan <="1001111"; --3WHEN "0100"=> scan <="1100110"; --4WHEN "0101"=> scan <="1101101"; --5WHEN "0110"=> scan <="1111101"; --6WHEN "0111"=> scan <="0000111"; --7WHEN "1000"=> scan <="1111111"; --8WHEN "1001"=> scan <="1101111"; --9WHEN "1010"=> scan <="1110111"; --AWHEN "1011"=> scan <="1111100"; --BWHEN "1100"=> scan <="0111001"; --CWHEN "1101"=> scan <="1011110"; --DWHEN "1110"=> scan <="1111001"; --EWHEN "1111"=> scan <="1110001"; --FWHEN OTHERS=> NULL;END CASE;END PROCESS P3;END;2.包装元件入库。