# Pseudo Random Pattern Generator實驗
報告內容:
---
- 此實驗必須使用到計數時會有相對應的輸出結果,從SR Latch的運作方式建構出相近的波形圖。
- 當計數器啟動時必定會有110的輸出方式。
- 當進行最後的判別時,會進行到N階層得波形是循序漸進的,除了亂數的產生外,更可發現clock的波形是有規律的,High跟Low的時序為相對應。
實驗目的:
---
- 產生隨機變數且有同步準備之功能,當計數產生得要輸出110。
- 藉由 SR Latch的真值表進行構思,並產生相對應的波形後,都出亂數產生器。
▼此圖Pseudo Random Pattern Generator之細節波形圖

## 程式碼:
▼主程式
```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,但最終仔細的將波形加入英文字碼進行細分後,即可觀察到有些地方的虛擬亂數週期有一定的週期性。有一定的週期性。