# 數位系統實驗報告Lab13 :::info 學號: B093040044 系級: 資工113 姓名: 蔡明軒 ::: ``` 實驗日期: 2021/12/13 ``` ## 實驗一 ### 內容 - Fig. 5.17(a) ![](https://i.imgur.com/kpIcBTA.png) - 得到Fig. 5.17(a)序向電路的 input equation 及 state equation - 得到Fig. 5.17(a)序向電路的 state table 及 state diagram - 用Behavioral model,撰寫 state diagram 的 Verilog HDL description - 用Structural model,撰寫 logic circuit diagram 的 Verilog HDL description - 撰寫input順序為==00, 01, 11, 10==的Testbench檔案,驗證兩種 HDL description 結果是否相同(第一次運作的時候把 A reset為 0) ### 過程 - Input equation $D = A\oplus x\oplus y$ - State equation - D flip-flop輸出即輸入 $A(t+1) = A\oplus x\oplus y$ - State table | Present State | x | y | Next state | |:-------------:|:---:|:---:|:----------:| | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 1 | | 0 | 1 | 0 | 1 | | 0 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | | 1 | 0 | 1 | 0 | | 1 | 1 | 0 | 0 | | 1 | 1 | 1 | 1 | - 觀察State table,畫出State Diagram ![](https://i.imgur.com/RwPvxr2.png) - Flip-flop 採用 PPT 的版本 ```verilog= module D_flip_flop (Q, Q_b, D, Clk, rst); output Q, Q_b; input D, Clk, rst; reg Q; assign Q_b = ~Q; always @ (posedge Clk, negedge rst) if (rst == 0) Q <= 1'b0; else Q <= D; endmodule ``` - 根據剛剛完成的 State Diagram,撰寫 Behavioral 版本的 Verilog HDL description ```verilog= module Diagram ( output A, input x,y,Clock,reset ); reg state; parameter S0 = 1'b0, S1 = 1'b1; always @(posedge Clock, negedge reset) if(reset==0)state<=S0; else case(state) S0:if(x == y) state<=S0;else state<=S1; S1:if(x == y) state<=S1;else state<=S0; endcase assign A = state; endmodule ``` - 根據上面的電路圖,撰寫 Structural 版本的 Verilog HDL description ```verilog= module Stuctural_Model ( output A, input x,y,Clock,reset ); wire w1,w2,tmp; xor(w1,x,y); xor(w2,A,w1); D_flip_flop D1(A,tmp,w2,Clock,reset); endmodule ``` - 撰寫testbench,input順序如下 | x | y | | - | - | | 0 | 0 | | 1 | 1 | | 0 | 1 | | 1 | 0 | ```verilog= `timescale 1ns / 1ps module tb; wire A_Diagram, A_Stuctural; reg x,y, Clock, reset; Diagram M1 (A_Diagram, x, y, Clock, reset); Stuctural_Model M2 (A_Stuctural, x, y, Clock, reset); initial #40 $finish; initial begin Clock = 0; forever #5 Clock = ~Clock; end initial fork reset = 0; #2 reset = 1; x=0; y=0; #10 x=0;#10 y=1; #20 x=1;#20 y=1; #30 x=1;#30 y=0; join endmodule ``` ### 結果 - state diagram ![](https://i.imgur.com/RwPvxr2.png) - 預期結果 | Time | x | y | State | Next State | |:----: |:---:|:---:|:-----:|:----------:| | 5ns | 0 | 0 | 0 | 0 | | 15ns | 0 | 1 | 0 | 1 | | 25ns | 1 | 1 | 1 | 1 | | 35ns | 1 | 0 | 1 | 0 | - Diagram(Behavioral) 和 Structural 的輸出結果都與上面的預期結果相同 ![](https://i.imgur.com/6XawPOg.png) ## 實驗二 ### 內容 - Fig. 5.18 ![](https://i.imgur.com/RITu75t.png) - 得到Fig. 5.18序向電路的 input equation 及 state equation - 得到Fig. 5.18序向電路的 state table 及 state diagram - 用Behavioral model,撰寫 state diagram 的 Verilog HDL description - 用Structural model,撰寫 logic circuit diagram 的 Verilog HDL description - 撰寫input順序為==0, 1, 0, 0==的Testbench檔案,驗證兩種 HDL description 結果是否相同(第一次運作的時候把 A 和 B reset為 0) ### 過程 - Input equation $J_A=B,K_A=Bx'$ $J_B=x',K_B=x\oplus A$ - State equation **利用JK Flip-Flop 的 Characteristic equations $Q(t+1) = JQ'+K'Q$,得到兩個Flipflop的輸出** - $A(t+1) = BA'+(Bx')'A=BA'+B'A+Ax$ - $B(t+1) = x'B'+(x\oplus A)'B=x'B'+xAB+x'A'B$ - State table | A(t) | B(t) | x | A(t+1) | B(t+1) | |:----:|:----:|:---:|:------:|:------:| | 0 | 0 | 0 | 0 | 1 | | 0 | 0 | 1 | 0 | 0 | | 0 | 1 | 0 | 1 | 1 | | 0 | 1 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | 1 | | 1 | 0 | 1 | 1 | 0 | | 1 | 1 | 0 | 0 | 0 | | 1 | 1 | 1 | 1 | 1 | - 觀察State table,畫出State Diagram ![](https://i.imgur.com/RBAS1gi.png) - 參考JK Flip-flop的characteristic equations $Q(t+1) = JQ'+K'Q$,將 PPT 提供的D Flip-flop修改成JK Flip-flop ```verilog= module JK_flip_flop (Q, Q_b, J,K , Clk, rst); output Q, Q_b; input J,K, Clk, rst; reg Q; assign Q_b = ~Q; always @ (posedge Clk, negedge rst) if (rst == 0) Q <= 1'b0; else Q <= (J&Q_b | ~K&Q); endmodule ``` - 根據剛剛完成的 State Diagram,撰寫 Behavioral 版本的 Verilog HDL description ```verilog= module Diagram ( output A,B, input x,Clock,reset ); reg[1:0] state; parameter S0 = 2'b00, S1 = 2'b01,S2=2'b10,S3=2'b11; always @(posedge Clock, negedge reset) if(reset==0)state<=S0; else case(state) S0:if(x) state<=S0;else state<=S1; S1:if(x) state<=S2;else state<=S3; S2:if(x) state<=S2;else state<=S3; S3:if(x) state<=S3;else state<=S0; endcase assign A = state[1],B = state[0]; endmodule ``` - 根據上面的電路圖,撰寫 Structural 版本的 Verilog HDL description ```verilog= module Stuctural_Model ( output A,B, input x,Clock,reset ); wire nA,nB,nx,K_a,K_b; not(nx,x); xor(K_b,A,x); and(K_a,nx,B); JK_flip_flop F_A(A,nA,B,K_a,Clock,reset),F_B(B,nB,nx,K_b,Clock,reset); endmodule ``` - 撰寫testbench,input順序為 0,1,0,0 ```verilog= `timescale 1ns / 1ps module tb; wire A_Diagram,B_Diagram, A_Structural,B_Structural; reg x, Clock, reset; Diagram M1 (A_Diagram, B_Diagram, x, Clock, reset); Stuctural_Model M2 (A_Structural,B_Structural, x, Clock, reset); initial #40 $finish; initial begin Clock = 0; forever #5 Clock = ~Clock; end initial fork reset = 0; #2 reset = 1; x = 0; #10 x = 1; #20 x = 0; #30 x = 0; join endmodule ``` ### 結果 - state diagram ![](https://i.imgur.com/RBAS1gi.png) - 預期結果 | Time | x | State | Next State | |:----:|:---:|:-----: |:----------: | | 5ns | 0 | 00 | 01 | | 15ns | 1 | 01 | 10 | | 25ns | 0 | 10 | 11 | | 35ns | 0 | 11 | 00 | - Diagram(Behavioral) 和 Structural 的輸出結果都與上面的預期結果相同,A為State前面的bit,B則為後面的bit ![](https://i.imgur.com/jd8wakh.png) ## 實驗心得 >這次的實驗為序向電路分析,在實驗一的過程中,我將程式寫完後,發現 Structural 的輸出都一直是 X ,一開始,我先確認了各個 module 的 port 有沒有接錯,但也沒有發現任何錯誤,後來詢問了助教,這才發現原來在 x 和 y 賦值前 reset都是無效的,這樣會變成在第一個正緣的時候因為x , y尚未賦值,輸出也會變成 X,在進入下一個正緣之後,也會因為原本的狀態為 X ,最後的結果也只會是 X。 >由於有了實驗一撞牆的經驗,實驗二就順利很多,我在模擬最一開始的時候就給 x 賦值,在第二個 ns 進行reset ,這樣一來,就可以讓程式在 reset 前就給 input 賦值,就不會產生實驗一的錯誤了。