实验二 模可变计数器_第1页
实验二 模可变计数器_第2页
实验二 模可变计数器_第3页
实验二 模可变计数器_第4页
实验二 模可变计数器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、 南昌大学实验报告学生姓名: 学 号: 专业班级:中兴101班 实验类型:验证 综合 设计 创新 实验日期:2012、10、18 成绩: 实验二 模可变计数器的设计一、实验目的1.学习计数器的VHDL设计、波形仿真和硬件测试;2.学会自己设计程序;3.学会设计模可变计数器;4.学习多层次设计方法。二、实验内容与要求1.计设置一位控制模的位M,要求M=0:模23计数;当M=1:模109计数。2.计数结果用静态数码管显示,一个四位二进制表示09中的一个数;3.给出此项设计的仿真波形;4.应用实验装置验证此计数器的功能。三、实验思路1.按照实验要求,本实验可分为四个模块进程:分频、模23与109计数

2、转换、数码管控制、七段译码。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分别为个位

3、和十位计数;当M为1时实现模109计数,用GW 、SW、 BW 分别为个位 十位和百位计数。由于端口不能参与运算,因些在结构体中定义了se10、 sel1、 sel2三个buffer变量,分别用来对应SEL(0)、 SEL(1)、SEL(2);在程序的最后用端口接收信号。5进程敏感信号为RST EN M 三个,当RST为低电平,EN为高电平时则计数,否则不计数。6. 位选信号的设置:用整形变量CNT8分别使不同的位选信号对应不同的输入,而得到不同输出。对应关系:表一 位选信号Sel2sel1sel0000001010011DQ7Q6Q5Q4sel2sel1sel0100101110111DQ3

4、Q2Q1Q07模23与模109计数转换思路框图:图一 思维框图四实现方法一:原理图输入法设计(自己独立完成)1. 建立文件夹建立自己的文件夹(目录),如c:myeda,进入Windows操作系统l Quartus II不能识别中文,文件及文件夹名不能用中文。2. 原理图设计输入打开Quartus II,选菜单FileNew,选择“Device Design File->Block Diagram->Schematic File”项。点击“OK”,在主界面中将打开 “Block Editor”窗口。(1) 分频器模块:(实体名为CLKDIV)-时间:2012年9月28号-版本:7.0

5、-功能:分频器(100分频)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CLKDIV IS定义实体名为CLKDIV PORT(CLK : IN STD_LOGIC;-输入信号为自带时钟 CLK_DIV : OUT STD_LOGIC);-输出信号为分频后的时钟信号END CLKDIV;ARCHITECTURE RT1 OF CLKDIV IS SIGNAL DATA:INTEGER RANGE 0 TO 100;-实现10

6、0分频 SIGNAL CLK_TEMP:STD_LOGIC;BEGINPROCESS(CLK) BEGIN IF RISING_EDGE(CLK) THEN IF(DATA=100) THEN DATA<=0; CLK_TEMP<=NOT CLK_TEMP; ELSE DATA<=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_116

7、4.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count ISPORT (CLK,RST,EN,M : IN STD_LOGIC;-输入变量为CLK、复位信号:RST、使能端信号:EN、-以及模变转换信号:M CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ;-输出信号为计数的个、十、百位 COUT : OUT STD_LOGIC ) ;-count为进位位END ENTITY count;ARCHITECTURE one OF count ISSIGNAL model : INTEGER;BEGIN

8、PROCESS (CLK,RST,EN,M,model) VARIABLE CQI : STD_LOGIC_VECTOR (11 DOWNTO 0) ; BEGIN IF 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' TH

9、EN IF EN = '1' THEN IF CQI < model THEN IF 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 <

10、= '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

11、_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 IS SIGNAL cout8:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL A :STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN P1:PROC

12、ESS(cout8)数码管动态扫描 BEGIN CASE cout8 IS WHEN "000" => choose <= "000" A <= "0000" WHEN "001" => choose <= "001" A <= "0000" WHEN "010" => choose <= "010" A <= "0000" WHEN "011"

13、; => choose <= "011" A <= "0000" WHEN "100" => choose <= "100" A <= "0000" WHEN "101" => choose <= "101" A <= data3; WHEN "110" => choose <= "110" A <= data2; WHEN "111&

14、quot; => choose <= "111" A <= data1; WHEN OTHERS => NULL; END CASE; END PROCESS P1; P2:PROCESS(clk) BEGIN IF clk'EVENT AND clk ='1' THEN cout8 <= cout8+1; END IF; END PROCESS P2; P3:PROCESS(A)数码管译码 BEGIN CASE A IS WHEN "0000"=> scan <="011111

15、1" -0 WHEN "0001"=> scan <="0000110" -1 WHEN "0010"=> scan <="1011011" -2 WHEN "0011"=> scan <="1001111" -3 WHEN "0100"=> scan <="1100110" -4 WHEN "0101"=> scan <="110110

16、1" -5 WHEN "0110"=> scan <="1111101" -6 WHEN "0111"=> scan <="0000111" -7 WHEN "1000"=> scan <="1111111" -8 WHEN "1001"=> scan <="1101111" -9 WHEN "1010"=> scan <="111011

17、1" -A WHEN "1011"=> scan <="1111100" -B WHEN "1100"=> scan <="0111001" -C WHEN "1101"=> scan <="1011110" -D WHEN "1110"=> scan <="1111001" -E WHEN "1111"=> scan <="111000

18、1" -F WHEN OTHERS=> NULL; END CASE; END PROCESS P3;END; 2.包装元件入库。编译通过后,单击FileCreate Default Symbol,当前文件变成了一个包装好的自己的单一元件(分频器:CLKDIV;计数器:COUNT;译码器:scan_led),并被放置在工程路径指定的目录中以备后用。3.保存各个模块的原理图单击FileSave as按扭,出现对话框,选择自己的目录(如c:myeda),合适名称保存刚才输入的原理图,原理图的扩展名为.bdf。如图3所示。 图二 各个模块的原理图4设置工程文件(Project)以mo

19、kebian为工程名命名5. 选择目标器件6. 放置元件7. 添加连线将以上各器件连接成实验原理图如下:图三 原理图设计8. 编译(Compiler)单击Quartus II Compiler,跳出Compiler窗口,此编译器的功能包括网表文件的提取、设计文件的排错、逻辑综合、逻辑分配、适配(结构综合)、时序仿真文件提取和编程下载文件装配等。单击Start,开始编译!如果发现有错,排除错误后再次编译。7. 仿真,测试项目的正确性(仅对计数模块进行仿真测试)1)建立新的波形激励文件2)在波形编辑器窗口添加节点3)通过Edit->End Time 来设定仿真结束时间4)在CLOCK窗口中设

20、置clk的时钟周期为1s5)点击save保存6) 通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。仿真波形如下:M=0,模23计数。COUNT进位。M=1,模109计数。COUNT进位。在跳变时有些许延迟M从1跳到0,切换到23计数M从0跳到1,切换到109计数RST=0,恢复计数RST=1,清零8. 观察分析波形9. 时序分析五、实现方法二:VHDL文本输入法设计-模可变计数器-程序来源:大部分由自己设计,部分程序摘自书上模10计数器设计,课本113页-2012年10月18日LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE

21、 IEEE.STD_LOGIC_UNSIGNED.ALL; -设计库和程序包名,其中将标准逻辑矢量-数据。Unsigned.all的用处是允许当遇到+号时,调用+号的算符重载函数。ENTITY mokebian ISPORT(CLK,M,EN,RST:IN STD_LOGIC; -定义端口 sel0,sel1,sel2:buffer STD_LOGIC; SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -端口类型为标准逻辑矢量数据,数码管八段 CLK1:buffer STD_LOGIC; GW,SW,BW: buffer STD_LOGIC_VECTOR(3 DOWN

22、TO 0);-计数器的个,十,百位 COUT:OUT STD_LOGIC; -溢出信号 SEL:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) -位选信号 ); END mokebian;ARCHITECTURE behav OF mokebian ISSIGNAL CNT : STD_LOGIC_VECTOR(7 DOWNTO 0); -数码管分频计数 SIGNAL J : STD_LOGIC_VECTOR(11 DOWNTO 0); -12位BCD计数值 SIGNAL CNT8: STD_LOGIC_VECTOR(2 DOWNTO 0); -数码管选择 SIGNAL A

23、: STD_LOGIC_VECTOR(3 DOWNTO 0); -数码管显示值0 SIGNAL MODEL : STD_LOGIC_VECTOR(11 DOWNTO 0); -模长信号BEGIN -进程P1分出的频率用来数码管的位选扫描 P1:PROCESS(CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN CNT<=CNT+1; IF CNT=100 THEN CLK1<='1' -100分频 ELSE CLK1<='0' END IF; END IF; END PROCESS; -

24、模23与模109的转换P2:PROCESS(EN,RST,M,CLK1) BEGINCASE M ISWHEN '0'=>MODEL<="000000100010" -23WHEN '1'=>MODEL<="000100001000" -109END CASE; GW<=J(3 downto 0); SW<=J(7 downto 4); BW<=J(11 downto 8); IF RST='1' THEN J<=(others=>'0'

25、); ELSIF CLK1'EVENT AND CLK1='1' THEN IF EN='1' THEN IF J<MODEL THEN IF GW=9 THEN -个位为9时加7调整 J<=J+7; IF SW=9 THEN -十位为9时加103调整 J<=J+103; END IF; ELSE J<=J+1; END IF; ELSE J<=(others=>'0'); END IF; END IF; END IF;END PROCESS;-数码管控制 P3:PROCESS( CLK) BEGIN

26、IF CLK'EVENT AND CLK='1' THEN IF CNT8<"010" THEN CNT8 <=CNT8+1; ELSE CNT8<=(OTHERS=>'0'); END IF; END IF;SEL(0)<=sel0 ;SEL(1)<=sel1 ;SEL(2)<=sel2 ; CASE CNT8 IS -个、十、百分别送数码管动态显示 WHEN "000" => sel2<='0'sel1<='1'sel0

27、<='0'A<=GW; WHEN "001" => sel2<='0'sel1<='0'sel0<='1'A<=SW; WHEN "010" => sel2<='0'sel1<='0'sel0<='0'A<=BW; WHEN OTHERS =>NULL; END CASE; END PROCESS ; -七段译码P4:PROCESS(A) BEGIN CASE A I

28、S WHEN "0000" =>SG<="00111111" WHEN "0001" =>SG<="00000110" WHEN "0010" =>SG<="01011011" WHEN "0011" =>SG<="01001111" WHEN "0100" =>SG<="01100110" WHEN "0101" =

29、>SG<="01101101" WHEN "0110" =>SG<="01111101" WHEN "0111" =>SG<="00000111" WHEN "1000" =>SG<="01111111" WHEN "1001" =>SG<="01101111" WHEN OTHERS=>NULL;END CASE;END PROCESS; COUT

30、<='1' WHEN J =MODEL ELSE '0'END behav; -结束结构体六、实验步骤1.打开quartus II,新建工程,选择元器件,再新建VHDL文件,保存为程序实体名,即mokebian。如下图:图4文本输入2.然后进行编译,看是否有语法错误,如果有,则双击错误提示返回修改,直到编译成功:如下图图5 编译通过3.然后新建波形仿真文件,将end time时间设置好,再将CLK,M ENABLE,RST分别设置一定的值,保存为实体名,编译,如下图:图六波形仿真文件建立第二个时钟上升沿到来仍是0,因为此时EN为0,不允许计数七、仿真波形分

31、析仿真结果如下所示:分各种情况一一对其分析M=0,模23计数RST=1,清零M=1,模109计数(5)两种方法仿真的结果一样八、引脚锁定和编程下载 1.Assignments-.>device->引脚锁定,参照下载实验板1K100的引脚号说明书,选择适当的引脚2.引脚锁定后,保存,必须重新进行一次全程编译,编译通过后才能编程下载。3、编程下载,用下载线将计算机并口和试验箱上的JTAG口接起来,接通电源。选择Tools>Programmer菜单,打开programmer窗口。在mode中选中JTAG,将Program/Configure下的笑方框选中4在开始编程之前,必须正确设置编程硬件。点击“Hardware Setup”按钮,打开硬件设置口。点击“Add Hardware”打开硬件添加窗口,在“Hardware type”下拉框中选择“ByteBlasterMV or ByteBlaster II”,“Port”下拉框中选择“LPT1”,点击OK按钮确认,关闭Hardware Setup窗口,完成硬件设置。5、点击“Start”按钮,开始编程下载 图(14)下载成功九、硬件测试结果(1)

温馨提示

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

评论

0/150

提交评论