# 數位邏輯設計實習 期末準備
## 10-6七段多工顯示之時分秒計時器
- design.cv
```
module timer_7seg(Clk10M, Clr, De, A, B, C, D, E, F, G);
input Clk10M, Clr;
output [3:1] De;
output A, B, C, D, E, F, G;
reg [7:0] H, M, S;
reg [23:0] Q;
reg [3:0] Code;
reg Clk1;
reg [6:0] L;
// 除頻1Hz
always@(posedge Clk10M)
begin
if(Clr || Q == 9999999)
Q = 0;
else
Q += 1;
Clk1 = Q[23];
end
// 取得多工顯示頻率 ~ 300Hz
assign De = Q[14:12];
// 產生計時器
always@(posedge Clk1)
if(Clr)
begin
H = 0;
M = 0;
S = 0;
end
else if(S[3:0] == 4'h9)
begin
S[7:4] += 1;
S[3:0] = 0;
if (S == 8'h59)
begin
M[3:0] += 1;
S = 0;
if(M[3:0] == 4'h9)
begin
M[7:4] += 1;
M[3:0] = 0;
if(M == 8'h59)
begin
H[3:0] += 1;
M = 0;
if(H[3:0] == 4'9)
begin
H[7:4] += 1;
H[3:0] = 0
if(H == 8'h24)
begin
H = 0;
end
end
end
end
end
end
else
S[3:0] += 1;
//七段多工十進制碼,組合邏輯電路
always@(De or H or M or S)
case(De)
0 : Code = H[7:4]; // 3'b000
1 : Code = H[3:0]; // 3'b001
2 : Code = M[7:4];
3 : Code = M[3:0];
4 : Code = S[7:4];
5 : Code = S[3:0];
default : Code = 0;
endcase
// 七段顯示,組合電路
always@(Code)
case(Code)
0: L = 7'h73;
1: L = 7'h30;
2: L = 7'h6d;
3: L = 7'h79;
4: L = 7'h33;
5: L = 7'h5b;
6: L = 7'h1f;
7: L = 7'h70;
8: L = 7'h7f;
9: L = 7'h73;
default: L = 7'h00;
endcase
assign {A, B, C, D, E, F, G} = L;
endmodule
```
## 電子骰子遊戲
- design.cv
```
module dice(Clk10M, Start, Led);
input Clk10M, Start;
output [6:0] Led;
reg [6:0] Led;
reg [20:0] Cnt1;
reg [5:0] Cnt2;
reg [1:0] State;
reg Clk, Dice_clk;
// 除頻1Hz
always@(posedge Clk10M)
begin
Cnt1 += 1;
Clk = Cnt1[15];
end
// 產生計時器
always@(posedge Clk1)
if(Start == 0)
begin
State = 3;
Cnt2 = 0;
end
else
begin
Cnt2 += 1;
if(Cnt2 == 6'b111111)
State -= (State>0);
end
// 骰子顯示頻率
always@(State)
case(State)
3: Dice_clk = Cnt1[18];
2: Dice_clk = Cnt1[19];
1: Dice_clk = Cnt1[20];
default: Dice_clk = 0; // 骰子停止
endcase
// 骰子LED值顯示
always@(posedge Dice_clk)
case(Led)
7'b0001000 : Led = 7'b0100010;
7'b0100010 : Led = 7'b0011100;
7'b0011100 : Led = 7'b1010101;
7'b1010101 : Led = 7'b1011101;
7'b1011101 : Led = 7'b1110111;
default : Led = 7'b0001000;
endcase
endmodule
```
## 三色點矩陣顯示多工掃描
- design.cv
```
module dot_mx(Clk10M, Row, Cr, Cg);
input Clk10M,;
output [1:8] Row, Cr, Cg;
reg [1:8] Row, Cr, Cg;
reg [25:0] Q;
reg Clk;
// 除頻
always@(posedge Clk10M)
begin
Q += 1;
Clk = Q[11];
end
// 產生計時器
always@(posedge Clk1)
case(Row)
8'b00000001 : Row = 8'b10000000;
8'b10000000 : Row = 8'b01000000;
8'b01000000 : Row = 8'b00100000;
8'b00100000 : Row = 8'b00010000;
8'b00010000 : Row = 8'b00001000;
8'b00001000 : Row = 8'b00000100;
8'b00000100 : Row = 8'b00000010;
default : Row = 8'b00000001;
// 骰子顯示頻率
always@(Q[24] or Q[25] or Row)
if(Q[24] == 1)
case(Row)
8'b10000000 : Cr = 8'b00010000;
8'b01000000 : Cr = 8'b00100010;
8'b00100000 : Cr = 8'b01000100;
8'b00010000 : Cr = 8'b11011111;
8'b00001000 : Cr = 8'b01010001;
8'b00000100 : Cr = 8'b01001010;
8'b00000010 : Cr = 8'b01000100;
8'b00000001 : Cr = 8'b01011111;
default : Cr = 8'b00000000;
endcase
else
Cr = 8'b00000000;
if(Q[25] == 1)
case(Row)
8'b10000000 : Cg = 8'b00010000;
8'b01000000 : Cg = 8'b00100010;
8'b00100000 : Cg = 8'b01000100;
8'b00010000 : Cg = 8'b11011111;
8'b00001000 : Cg = 8'b01010001;
8'b00000100 : Cg = 8'b01001010;
8'b00000010 : Cg = 8'b01000100;
8'b00000001 : Cg = 8'b01011111;
default : Cg = 8'b00000000;
endcase
else
Cg = 8'b00000000;
end
endmodule
```
## LCD液晶顯示模組
```
module LCM(Clk10M, Clr, EN. RS, RW, D, Cs);
input Clk10M, Clr;
output EN, RS, RW;
output [7:0] D;
output [2:0] Cs;
reg Clk, Clk_en;
reg [7:0] D;
reg [23:0] Cnt;
reg [1:0] Cn;
reg [2:0] Cs, Ns;
parameter [2:0] S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b011, S4 = 3'b100, S5 = 3'b101, S6 = 3'b110, S7 = 3'b111;
// 除頻
always@(posedge Clk10M)
begin
if(Clr)
Cnt = 0;
else
Cnt += 1;
Clk = Cnt[23];
// Clk = Cnt[0]; // 模擬用
end
always@(posedge Clk or posedge Clr)
begin
if(Clr)
begin
Cn = 0;
Cs = 3'b000;
end
else if(Cn == 2'b10)
begin
Cn = 0;
Cs = Ns;
end
else
Cn += 1;
Clk_en = Cn[0];
end
always@(Cs)
case(Cs)
S0: begin
Ns = S1;
D = 8'b00111000;
end
S1: begin
Ns = S2;
D = 8'b00111000;
end
S2: begin
Ns = S3;
D = 8'b00001110;
end
S3: begin
Ns = S4;
D = 8'b00001110;
end
S4: begin
Ns = S5;
D = 8'b00000001;
end
S5: begin
Ns = S6;
D = 8'b11000100;
end
S6: begin
Ns = S7;
D = 8'b01000001;
end
S7: begin
Ns = S7;
D = 8'b00000000;
end
endcase
assign EN = (Cs == S7 ? 0 : Clk_en);
assign RS = (Cs == S6 ? 1 : 0);
assign RW = 0;
endmodule
```