---
# System prepended metadata

title: Pseudo Random Pattern Generator實驗

---


                                
#  Pseudo Random Pattern Generator實驗


報告內容：
---
- 此實驗必須使用到計數時會有相對應的輸出結果，從SR Latch的運作方式建構出相近的波形圖。
- 當計數器啟動時必定會有110的輸出方式。
- 當進行最後的判別時，會進行到N階層得波形是循序漸進的，除了亂數的產生外，更可發現clock的波形是有規律的，High跟Low的時序為相對應。




實驗目的：
---
- 產生隨機變數且有同步準備之功能，當計數產生得要輸出110。
- 藉由 SR Latch的真值表進行構思，並產生相對應的波形後，都出亂數產生器。
▼此圖Pseudo Random Pattern Generator之細節波形圖
![ ](https://i.imgur.com/Y2MxqSX.png)


## 程式碼：
▼主程式
```verilog=
module debounce2 (Clk100,Ki,Ko1,Ko2);
input Clk100, Ki;
output Ko1, Ko2;
reg Ko1,Ko2;
reg [1:0] Q1,Q2;
reg S,R;

always@(posedge Clk100) 
begin
Q1[1] <= Q1[0];
Q1[0] <= Ki;

if (Q1 == 2'b11) S = 1;
else S = 0;
if (Q1 == 2'b00) R = 1;
else R = 0;
end
always@(R or S)
if (S == 1 && R == 0)
Ko1 = 1;
else if (S == 0 && R == 1)
Ko1 = 0;

always@(posedge Clk100)
begin
Q2[1] <= Q2[0];
Q2[0] <= Ko1;

if (Q2 == 2'b01) Ko2 = 1;
else Ko2 = 0;
end

endmodule

```

▼副程式testbench

```verilog=
lib i;
use i.std_logic_k.all;

entity reg_tb is
end entity;

architecture foo of rng_tb is
    signal por:std_logic;
    signal Clk100:  std_logic := '0';
    signal random_flag: std_logic;
    signal random_data: std_logic_vector (15 downto 0);
begin
dut:
    entity work.random_data_generator
        port map (
            por => por,
            Clk100 => Clk100,
            random_flag => random_flag,
            random_data => random_data
        );
clk:
    process
    begin
        wait for 5 ns;
        Clk100 <= not Clk100;
        if now > 100 ns then
            wait;
        end if;
    end process;
stimuli:
    process
    begin
        Ko1 <= '1';
        random_flag <= '0';
        wait until falling_edge(Clk100);
        Ko1 <= '0';
        wait until falling_edge(Clk100);
        wait for 1 ns;
        Ko1 <= '1';
        wait until falling_edge(Clk100);
        random_flag <= '1';
        wait;
    end process;
end architecture;

```
## 程式碼連結：
https://gist.github.com/Fukuanchih/524b498030fe3c8c6d584e74a3c402c2


## 實驗心得：
- 一開始我嘗試先做出SR Latch的波形圖來觀察之相對波形，並搭配著真值表來進行比對，從中也讓我發現能以這樣的思路來完成亂數產生的形式，但只能作為參考之值。

- 最終還是需要有相對的判別與輸出，也讓我學到了$ time的使用方式，verilog中有兩種時間的函數式，$ time是我當時構想時所查詢到的方法之一，也讓我發現到原來還有另一種，為$ realtimeg使用這兩個即可反映出現在的時刻，而最特別為$time可以記錄當前的時刻，並且可以達到64位元。
- 從波形圖中最為明顯的有一致性的必定是clock的High跟Low，但最終仔細的將波形加入英文字碼進行細分後，即可觀察到有些地方的虛擬亂數週期有一定的週期性。有一定的週期性。






