# 實作:設計具有載入與同步清除功能的上數 BCD to 7段顯示器
###### 資工二一 1410932049 鍾宏昌
### 目的:
利用BCD計數器、D flip flop 及case 指令來做出1位元七段顯示器。
### 撰寫程式碼:
#### 主程式([BCD7.v](https://github.com/s1410932049/HW4/blob/master/BCD7.v))
```verilog=
module BCD(clk, rst_syn, Q_out);
input clk;
input rst_syn;
output [3:0] Q_out;
reg [3:0] Q_out;
always@ (posedge clk)
begin
if (!rst_syn)
Q_out = 0;
else if (Q_out == 9)
Q_out = 0;
else
Q_out = Q_out + 1;
end
endmodule
//segment
module segment (bcd, seg);
input bcd;
output [7:0] seg;
reg [7:0]seg;
always @(bcd) begin
case (bcd)
1:seg=8'b11000000;
2:seg=8'b11111001;
3:seg=8'b10100100;
4:seg=8'b10100000;
5:seg=8'b10011001;
6:seg=8'b10010010;
7:seg=8'b10000010;
8:seg=8'b11111000;
9:seg=8'b10000000;
10:seg=8'b10010000;
11:seg=8'b10100000;
12:seg=8'b10000011;
13:seg=8'b10100001;
14:seg=8'b10000100;
15:seg=8'b11110001;
default:seg=8'b00000000;
endcase
end
endmodule
// 1-bit Synchronous Load
module dff_1 (clk, D, Din, Load, Q4);
input clk, D, Din, Load;
output Q4;
reg Q4;
always@ (posedge clk)
begin
if (Load) Q4 = Din;
else Q4 = D;
end
endmodule
```
#### testbench程式碼([BCD7_tb](https://github.com/s1410932049/HW4/blob/master/BCD7_tb.v))
```verilog=
module BCD7_tb;
reg clk;
reg rst_syn;
reg D;
reg Din;
reg bcd;
reg Load;
wire [7:0]seg;
parameter PERIOD = 20;
parameter real DUTY_CYCLE = 0.5;
parameter OFFSET = 0;
// clock process
initial begin
#OFFSET;
forever begin
clk = 1'b0;
#(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
#(PERIOD*DUTY_CYCLE);
end
end
initial begin
Din=1'b1;
D=1'b0;
bcd=0;
end
initial begin
Load=1'b1;
#20 Load=1'b0;
#20 Load=1'b1;
#500 $finish;
end
initial begin
$dumpfile("BCD7.vcd");
$dumpvars(0, BCD7_tb);
$dumpvars(0, dff_1);
$dumpvars(0, BCD);
end
BCD dff_1(
.rst_syn(Q4),
.clk(clk)
);
segment BCD(
.bcd(Q_out)
);
dff_1 BCD7_tb(
.clk(clk),
.Load(Load),
.Din(Din),
.D(D)
);
endmodule
```
### 結果:
#### gatkwave之模擬波形圖

### 討論:
我這次撰寫過程中所遇到的問題:
1.不太清楚題意,使得我懷疑D flip flop 是否真的有必要放進程式中。
2.testbench的撰寫還是不熟練,為了找出讓所有的輸出入都能顯示在波形圖花了太多時間。
### 心得
我覺得有點累,我可能會有一段時間不會去碰程式碼。還有我還真的找不到可以一起討論的人,主要是時間安排不同。