彩灯控制器

彩灯控制器

简介

​上次是我们通过设置几个开关,用他们的$0/1$状态表示一个数,然后$BCD$译码管就显示相应的数字。而这次的内容则是,让这个$”8”$的外面一圈$a,b,c,d,e,f$这$6$个灯管轮流亮。

数码管

​哦对了,这次还要求要层次化,需要写个顶层文件。

过程

​如何让译码管特定的灯管点亮我们已经在上次实验中学会了,那么如何控制译码管的灯循环轮流依次去亮呢?这里我们引入一个变量$Q$,并且使用实验箱中$CLK$器件,它会产生可调的时间脉冲,每当接收到一次脉冲,$Q+1$,然后根据$Q$的值去给$codeout$分配每一位的值,就可以控制译码管显示的字了。

代码

顶层文件 $gal\underline{}3035\underline{}2.v$

1
2
3
4
5
6
7
module gal_3035_2(clk,en,Q,codeout); //彩灯控制器
input clk,en;
output [2:0] Q; //计数器输出
output [6:0] codeout; //译码器输出
gal_3035_2_1 a(clk,en,Q); //调用计数器子模块
gal_3035_2_2 b(Q,codeout); //调用译码器子模块
endmodule

计数器模块 $gal\underline{}3035\underline{}2\underline{}1.v$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module gal_3035_2_1(clk,en,Q);//计数器
input clk,en; //输入时钟和使能
output reg[2:0] Q; //计数器输出
always@(posedge clk)//时钟上升沿执行
begin
if(en == 1'b1) //使能端处于高电平自加
begin
if(Q < 3'd6)
Q <= Q + 1'b1;
else
Q <= 0;
end
else
Q <= Q;
end
endmodule

译码器模块$gal\underline{}3035\underline{}2\underline{}2.v$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module gal_3035_2_2(Q,codeout); //译码器
input [2:0]Q; //译码器输入接收计数器输出
output reg[6:0]codeout; //译码器输出
always@(Q)
begin
case(Q)
3'd0:codeout = 7'b0000001; //Q为0 点亮a管
3'd1:codeout = 7'b0000010; //Q为1 点亮b管
3'd2:codeout = 7'b0000100; //Q为2 点亮c管
3'd3:codeout = 7'b0001000; //Q为3 点亮d管
3'd4:codeout = 7'b0010000; //Q为4 点亮e管
3'd5:codeout = 7'b0100000; //Q为5 点亮f管
default:codeout = 7'b0000000;
endcase
end
endmodule

波形仿真

引脚分配

$Family:Cyclone\ IV\ E\ \ \ \ \ \ \ \ Device:EP4CE22E22C8$

信号名 主板器件 PIN
Q[2] LED2 52
Q[1] LED1 50
Q[0] LED0 46
clk CLK0 88
codeout[6] a 112
codeout[5] b 100
codeout[4] c 104
codeout[3] d 111
codeout[2] e 106
codeout[1] f 110
codeout[0] g 103
文章作者: FcAYH
文章链接: http://www.fcayh.cn/2021/01/14/colorcontrol/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Forever丶CIL