概述
题目要求:
8个共阳极的LED灯,提供48MHZ的时钟信号;流水灯模式为:1、5亮,其余灭,右移三次后全灭;4、8亮,其余灭,左移三次后全灭;4、5亮,其余灭,向两边移动三次后全灭;1、8亮,其余灭,向中间移动三次后全灭。
设计思路:
1、Moore机
2、状态输出表:
状态名 | 状态赋值 | 输出 |
0 | 00000 | 01110111 |
1 | 00001 | 10111011 |
2 | 00010 | 11011101 |
3 | 00011 | 11101110 |
4 | 00100 | 11111111 |
5 | 00101 | 11101110 |
6 | 00110 | 11011101 |
7 | 00111 | 10111011 |
8 | 01000 | 01110111 |
9 | 01001 | 11111111 |
10 | 01010 | 11100111 |
11 | 01011 | 11011011 |
12 | 01100 | 10111101 |
13 | 01101 | 01111110 |
14 | 01110 | 11111111 |
15 | 01111 | 01111110 |
16 | 10000 | 10111101 |
17 | 10001 | 11011011 |
18 | 10010 | 11100111 |
19 | 10011 | 11111111 |
3、未用状态的次态为无关项,状态编码为自然二进制,用D触发器做状态存储器。
4、转移方程:
q0=q1·q2·q3·q4+q0·q4’+q0·q3’
q1=q1’·q2·q3·q4+q1·q2’+q1·q4’+q1·q3’
q2=q0’·q2’·q3·q4+q2·q4’+q2·q3’
q3=q3’·q4+q3·q4’
q4=q3’·q4’+q3·q4’
5、输出方程:
z0=(q0+q2+q3+q4)·(q1’+q2’+q4’)·(q1’+q2+q3+q4);
z1=(q0’+q3+q4)·(q1’+q2’+q3+q4)·(q0+q1+q2+q3+q4’)·(q1+q2’+q3’+q4’); z2=(q0’+q3+q4’)·(q1’+q2+q3’+q4’)·(q0+q1+q3’+q4);
z3=(q0’+q3’+q4)·(q0+q1+q2+q3’+q4’)·(q1+q2’+q3+q4’)·(q1’+q2+q3’+q4);
z[4:7]可以通过z[0:3]得到:
select=(q0|q1&(q2|q3|q4))
z[4:7]=({4{select}} &({z3,z2,z1,z0}))|({4{!select}}&({z0,z1,z2,z3}));
6、分频得到1HZ的时钟
自启动性:
未用状态 | 下一状态 |
10100 | 10101 |
10101 | 10110 |
10110 | 10111 |
10111 | 01000 |
11000 | 11001 |
11001 | 11010 |
11010 | 11011 |
11011 | 01000 |
11100 | 11101 |
11101 | 11110 |
11110 | 11111 |
11111 | 10000 |
最多经过三次时钟上升沿,回到正常状态中。
思考:
(1)采用格雷码为状态编码赋值可能更好。
(2)采用JK触发器可能会使转移方程变得简单。
(3)使用八个触发器,直接以流水灯的变化作为该状态的次态,可以省掉译码电路。
电路图(可能看不清楚):
代码
module led_control(
input clk,
output [7:0] led
);
//reg [7:0] ledout;
reg [31:0] divclock_num=0;
reg clock=0;
reg q0=0,q1=0,q2=0,q3=0,q4=0;
wire z0,z1,z2,z3;
parameter full_num=24000000;
always@(posedge clk)
begin
if (divclock_num==full_num)
begin
clock=~clock;
divclock_num=0;
end
else
begin
divclock_num=divclock_num+1'b1;
end
end
assign z0=(q0|q2|q3|q4)&(~q1|~q2|~q4)&(~q1|q2|q3|q4);
assign z1=(~q0|q3|q4)&(~q1|~q2|q3|q4)&(q0|q1|q2|q3|~q4)&(q1|~q2|~q3|~q4);
assign z2=(~q0|q3|~q4)&(~q1|q2|~q3|~q4)&(q0|q1|~q3|q4);
assign z3=(~q0|~q3|q4)&(q0|q1|q2|~q3|~q4)&(q1|~q2|q3|~q4)&(~q1|q2|~q3|q4);
assign led[7:4]={z0,z1,z2,z3};
assign led[3:0]=({4{(q0|q1&(q2|q3|q4))}}&({z3,z2,z1,z0}))|({4{!(q0|q1&(q2|q3|q4))}}&({z0,z1,z2,z3}));
always@(posedge clock)
begin
q0<=q1&q2&q3&q4|q0&~q4|q0&~q3;
q1<=~q1&q2&q3&q4|q1&~q2|q1&~q4|q1&~q3;
q2<=~q0&~q2&q3&q4|q2&~q4|q2&~q3;
q3<=~q3&q4|q3&~q4;
q4<=~q3&~q4|q3&~q4;
end
endmodule
仿真文件:
module sim_led();
reg clk;
wire [7:0] led;
led_control uut(clk,led );
initial
begin
clk=0;
end
always #2 clk=~clk;
endmodule
vavido仿真波形:
最后
以上就是畅快皮带为你收集整理的数电课程设计分享之流水灯的全部内容,希望文章能够帮你解决数电课程设计分享之流水灯所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复