---
# System prepended metadata

title: 實作：設計具有載入與同步清除功能的上數 BCD to 7段顯示器

---

# 實作：設計具有載入與同步清除功能的上數 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之模擬波形圖
![sagement](https://i.imgur.com/LOAjBAR.png)

### 討論：
我這次撰寫過程中所遇到的問題：
1.不太清楚題意，使得我懷疑D flip flop 是否真的有必要放進程式中。
2.testbench的撰寫還是不熟練，為了找出讓所有的輸出入都能顯示在波形圖花了太多時間。

### 心得
我覺得有點累，我可能會有一段時間不會去碰程式碼。還有我還真的找不到可以一起討論的人，主要是時間安排不同。

