一.设计任务
题目: 彩灯控制器的设计
功能:试设计一种彩灯控制器控制8盏灯。该彩灯控制器有4种自动切换的花样。第一种花样为彩灯从右到左,然后从左到右逐次点亮,全灭全亮;第二种花样为彩灯两边同时亮一个逐次向中间移动再散开;第三种花样为彩灯两边同时亮两个逐次向中间移动再散开;第四种花样为彩灯两边同时亮三个,然后四亮四灭,四灭四亮,最后一灭一亮。四个花样自动变换,重复以上过程。输入时钟频率为50Hz,灯亮的时间在1—4秒之间,可以自由控制。电路中以“1”代表灯亮,以“0”代表灯灭。
扩展功能:第五种花样为两亮两灭,两灭两亮;第六种花样为彩灯两边同时熄灭一个逐次向中间移动再散开;第七种花样为彩灯一亮一灭,一灭一亮,重复4次。七种花样自动变换,重复以上过程。
要求:1)设计思路分析要条理清楚 2)总体设计应画一流程图 3)程序要加必要的注释
4) 编写测试模块,并给出仿真波形
5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二.软件环境
操作系统:Windows 7操作系统; 编程语言:Verilog-HDL; 操作软件:ModelSim SE 6.2
三.设计思想及流程图
1. 设计思想:每个花样可以做成一个模块,每个模块完成就切换到下一个模块。每个模块的基本思想都是可用寄存器预先存储各个状态再依次输出。七个花样自动变换,重复以上过程。 2.流程图
开始
CLK上升沿
CLR=1 ? 是 否 花样一, F=00000000 FLAGS=0
FLAGS变成1 FLAGS=1 花样二 FLAGS变成 花样三 FLAGS变成3 FLAGS=2 FLAGS=3 花样四 FLAGS变成4 花样五 FLAGS变成5 FLAGS=4 FLAGS=5 花样六 FLAGS变成6
花样七 FLAGS变成0 FLAGS=6 仿 真 时 间 否 到? 是 - 1 -
结束 四.源代码
底层模块
module LIGHT ( CLR,CLK,F ); input CLK,CLR; output [7:0] F; reg [7:0] F; integer FLAGS=0; integer a=7; integer i=0;
always @( posedge CLK ) //CLK上升沿触发 if(CLR==1) begin
F=8'b00000000; //CLR=1时清零 end
else if(FLAGS==0)// 花样一:彩灯从右到左,然后从左到右逐次点亮,全灭全亮
begin if(i<17) i=i+1; else begin i=0; FLAGS=1; end case(i)
1:F=8'b00000001; 2:F=8'b00000010; 3:F=8'b00000100; 4:F=8'b00001000; 5:F=8'b00010000; 6:F=8'b00100000; 7:F=8'b01000000; 8:F=8'b10000000;
- 2 -
9:F=8'b01000000; 10:F=8'b00100000; 11:F=8'b00010000; 12:F=8'b00001000; 13:F=8'b00000100; 14:F=8'b00000010; 15:F=8'b00000001; 16:F=8'b00000000; 17:F=8'b11111111; endcase end
else if(FLAGS==1) //花样二:彩灯两边同时亮一个逐次向中间移动再散开 begin if(i<7) i=i+1; else begin i=0; FLAGS=2; end case(i)
1:F=8'b10000001; 2:F=8'b01000010; 3:F=8'b00100100; 4:F=8'b00011000; 5:F=8'b00100100; 6:F=8'b01000010; 7:F=8'b10000001; endcase end
else if(FLAGS==2) //花样三:彩灯两边同时亮两个逐次向中间移动再散开
begin if(i<5) i=i+1; else begin i=0;
- 3 -
FLAGS=3; end case(i)
1:F=8'b11000011; 3:F=8'b00111100; 5:F=8'b11000011; endcase end
else if(FLAGS==3) //花样四:彩灯两边同时亮三个,然后四亮四灭,四灭四亮,最后一灭一亮
begin if(i<4) i=i+1; else begin i=0; FLAGS=4; end case(i)
1:F=8'b11100111; 3:F=8'b00001111; endcase end
else if(FLAGS==4) //花样五; 两亮两灭,两灭两亮 begin if(i<2) i=i+1; else begin i=0;
- 4 -
2:F=8'b01100110; 4:F=8'b01100110;
2:F=8'b11110000; 4:F=8'b01010101;
FLAGS=5; end case(i)
0:F=8'b11001100; 1:F=8'b00110011; endcase end
else if(FLAGS==5) //花样六:彩灯两边同时熄灭一个逐次向中间移动再散开 begin if(i<9) i=i+1; else begin i=0; FLAGS=6; end case(i)
1:F=8'b11111111; 2:F=8'b01111110; 3:F=8'b00111100; 4:F=8'b00011000; 5:F=8'b00000000; 6:F=8'b00011000;
7:F=8'b00111100; 8:F=8'b01111110; 9:F=8'b11111111; endcase end
else if(FLAGS==6) //花样七:彩灯一亮一灭,一灭一亮 begin if(a!=0) begin case(i) 0:begin
- 5 -
F=8'b10101010; i=1; a=a-1; end 1:begin
F=8'b01010101; i=0; a=a-1; end endcase end else begin FLAGS=0;
F=8'b00000000;// 所有花样结束时清零 a=7; end end endmodule 顶层模块: `timescale 1ms/1ms module LIGHT_TEST; reg CLK,CLR; wire [7:0] F;
parameter STEP = 20; //定义50Hz输入
LIGHT LIGHT ( CLR,CLK,F ); //底层模块名,实例名及参数定义 always #( STEP*50/2 ) CLK = ~CLK; //设定时钟时间 initial begin
CLR = 1; CLK = 0;
- 6 -
#(STEP) CLR=0;
#( 4000*STEP ) $finish;//设定运行时间80000ms end endmodule
五.仿真结果
六.收获及体会
虽然只是短短几天的学习,但这是我对一种陌生语言——硬件描述语言的认知,是一个从无到有的过程,通过这次实践,我掌握了Verilog-HDL语言的一些基础知识,熟悉了一下数字电路的知识,并且学习了ModelSim软件的用法。HDL语言最大的特点就是融入了时间的概念,符合数字电路的特点。还有一个特点就是HDL语言通常要用2个模块文件来实现:一个是功能模块文件,主要用于设计功能,也就是这个程序究竟要完成什么任务;二是顶层模块文件,也叫测试模块,主要用于功能模块文件的仿真,输出一个波形,反映功能的具体情况。 这次实习结果在前人的成果上增添了2个新的的花样,并且修改了许多参考样例的冗长代码,是本任务的创新之处。感谢学校给了我们这次实习的机会,使得我们的动手能力又得以提高,这对我们将来的发展是有很大的帮助的,不管是考研还是走向工作岗位,我们从这次实习获得了宝贵的经验!
七.参考文献
[1] 张顺兴.数字电路与系统设计.南京:东南大学出版社
[2] 常晓明. Verilog‐Hdl实践与应用系统设计. 北京:北京航空航天大学出版社,2005
[3] 部分补充资料
- 7 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务