# 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,但最終仔細的將波形加入英文字碼進行細分後,即可觀察到有些地方的虛擬亂數週期有一定的週期性。有一定的週期性。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up