# 數位系統 第 8 次實驗報告 ###### tags: `digital system` 姓名:高聖傑 系級:資工113 學號:B093040016 實驗日期:11/29 ## 實驗一 ### 內容 - 目標 & 要求 - 模擬並驗證 8-bit magnitude comparator - 其內部由兩個 4-bit magnitude comparators 所組成 ### 過程 從 most significant bit 往 least significant bit 一個一個比,遇到平手就繼續往下比較,若比到最後全都一樣,即是等於。 換句話說就是:若高位提前分出勝負,低位的勝負就沒有那麼重要了。 且最後都沒有分出勝負,才能說雙方平手。 而兩個 4-bit comparators 之間也一樣 以 8-bit 為例,7=MSB,0=LSB, cmp4_1 負責 [7:4],output L1, G1,cmp4_0 負責 [3:0] 輸出的 L 是小於 (Lesser) 的意思 G 是大於 (Greater) 的意思 E 是等於 (Equal) 的意思 最後連結兩者的核心邏輯就是: ``` L = L1 + E1L0 G = G1 + E1G0 E = E1E0 ``` #### module code ```verilog= module cmp_4bit(output gt, output lt, output eq, input [3:0] A, B); wire[3:0] x, na, nb, agb, alb; not(na[0], A[0]); not(na[1], A[1]); not(na[2], A[2]); not(na[3], A[3]); not(nb[0], B[0]); not(nb[1], B[1]); not(nb[2], B[2]); not(nb[3], B[3]); xnor(x[0], A[0], B[0]); xnor(x[1], A[1], B[1]); xnor(x[2], A[2], B[2]); xnor(x[3], A[3], B[3]); and(eq, x[0], x[1], x[2], x[3]); and(agb[3], A[3], nb[3]); and(agb[2], x[3], A[2], nb[2]); and(agb[1], x[3], x[2], A[1], nb[1]); and(agb[0], x[3], x[2], x[1], A[0], nb[0]); or(gt, agb[0], agb[1], agb[2], agb[3]); and(alb[3], na[3], B[3]); and(alb[2], x[3], na[2], B[2]); and(alb[1], x[3], x[2], na[1], B[1]); and(alb[0], x[3], x[2], x[1], na[0], B[0]); or(lt, alb[0], alb[1], alb[2], alb[3]); endmodule module cmp_8bit(output gt, output lt, output eq, input [7:0] A, B); //L = L1 + E1L0; //G = G1 + E1G0; //E = E1E0; wire l0, l1, g0, g1, e0, e1; wire[1:0] w; cmp_4bit cmp4_0(g0, l0, e0, A[3:0], B[3:0]); cmp_4bit cmp4_1(g1, l1, e1, A[7:4], B[7:4]); and(w[0], e1, l0); and(w[1], e1, g0); and(eq, e1, e0); or(lt, w[0], l1); or(gt, w[1], g1); endmodule ``` #### testbench code ```verilog= //tb1 `timescale 1ns / 1ps module tbGen1(); reg[7:0] A, B; wire eq, gt, lt; cmp_8bit _tb1(.A(A), .B(B), .eq(eq), .gt(gt), .lt(lt)); initial begin A = 8'b10101010; B = 8'b10101010; #10 A = 8'b11010011; B = 8'b10100000; #10 A = 8'b01010111; B = 8'b01010011; #10 A = 8'b01111111; B = 8'b10000000; #10 A = 8'b10010011; B = 8'b10010100; #10 $finish; end endmodule ``` ### 模擬結果 ![](https://i.imgur.com/Nz8Lwo7.png) 兩數字的比較結果正確,有正確判斷大於、小於、等於 ## 實驗二 ### 內容 - 目標 & 要求 - 模擬並驗證 3-to-8 decoder - 其內部由兩個 2-to-4 decoders 所組成 ### 過程 用 input 的 enable 選擇兩個 decoder 的其中一個來使用 且要把其中一個 enable 反相。 如圖 ![](https://i.imgur.com/t76JlZ5.png =450x) #### module code ```verilog= module decoder2to4(output[3:0] y, input[1:0] x, input e); assign y[0] = ~x[0] & ~x[1] & e, y[1] = x[0] & ~x[1] & e, y[2] = ~x[0] & x[1] & e, y[3] = x[0] & x[1] & e; endmodule module decoder3to8(output[7:0] y, input[2:0] x); wire ne; not(ne, x[2]); decoder2to4 d03(y[3:0], x[1:0], ne); decoder2to4 d47(y[7:4], x[1:0], x[2]); endmodule ``` #### testbench code ```verilog= //tb2 `timescale 1ns / 1ps module tbGen2(); wire[7:0] y; reg[2:0] x; decoder3to8 _tb2(.y(y), .x(x)); initial begin x = 3'b000; #10 x = 3'b001; #10 x = 3'b010; #10 x = 3'b100; #10 x = 3'b111; #10 $finish; end endmodule ``` ### 模擬結果 ![](https://i.imgur.com/SV2TWaS.png) decoder 成功根據少量的輸入,選擇正確輸出的 wire ## 實驗三 ### 內容 - 目標 & 要求 - 使用 Behavioral level modeling 模擬並驗證 8-to-1 multiplexer - 使 8-to-1 multiplexer 根據 F(A, B, C, D) = Σ(1, 2, 5, 8, 9, 10, 12, 13) 做對應輸出 ### 過程 觀察輸出與 D 的關係,且將觀察結果寫進 Behavioral level modeling 的case區塊裡面。 計算過程如圖: ![](https://i.imgur.com/yPO8H71.png) #### module code ```verilog= module mux8(output reg Y, input A, B, C, D, input[2:0] sel); always @ (A, B, C, D, sel) case (sel) 3'b000: Y = D; 3'b001: Y = ~D; 3'b010: Y = D; 3'b011: Y = 0; 3'b100: Y = 1; 3'b101: Y = ~D; 3'b110: Y = 1; 3'b111: Y = 0; endcase endmodule ``` #### testbench code ```verilog= `timescale 1ns / 1ps module tbGen3(); reg A, B, C, D; reg[2:0] sel; wire Y; mux8 _tb3(.Y(Y), .A(A), .B(B), .C(C), .D(D), .sel(sel)); initial begin A = 1'b0; B = 1'b0; C = 1'b0; D = 1'b0; sel = 3'b000; #10 A = 1'b0; B = 1'b0; C = 1'b0; D = 1'b1; sel = 3'b000; #10 A = 1'b0; B = 1'b0; C = 1'b1; D = 1'b0; sel = 3'b001; #10 A = 1'b0; B = 1'b0; C = 1'b1; D = 1'b1; sel = 3'b001; #10 A = 1'b0; B = 1'b1; C = 1'b0; D = 1'b0; sel = 3'b010; #10 A = 1'b0; B = 1'b1; C = 1'b0; D = 1'b1; sel = 3'b010; #10 A = 1'b0; B = 1'b1; C = 1'b1; D = 1'b0; sel = 3'b011; #10 A = 1'b0; B = 1'b1; C = 1'b1; D = 1'b1; sel = 3'b011; #10 A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; sel = 3'b100; #10 A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b1; sel = 3'b100; #10 A = 1'b1; B = 1'b0; C = 1'b1; D = 1'b0; sel = 3'b101; #10 A = 1'b1; B = 1'b0; C = 1'b1; D = 1'b1; sel = 3'b101; #10 A = 1'b1; B = 1'b1; C = 1'b0; D = 1'b0; sel = 3'b110; #10 A = 1'b1; B = 1'b1; C = 1'b0; D = 1'b1; sel = 3'b110; #10 A = 1'b1; B = 1'b1; C = 1'b1; D = 1'b0; sel = 3'b111; #10 A = 1'b1; B = 1'b1; C = 1'b1; D = 1'b1; sel = 3'b111; #10 $finish; end endmodule ``` ### 模擬結果 ![](https://i.imgur.com/aY3nh9V.png) 8-to-1 mux 有正確在 1, 2, 5, 8, 9, 10, 12, 13 的位置輸出 1 ## 實驗心得 > 這次的實驗主要是讓我們練習用 verilog 程式碼實做 Magnitude Comparator, Decoder, Multiplexer 的 module。 > 在做實驗一時,我們觀察到一個現象,不論是單 bit 或是整個區塊的比較器,都是從 most significant bit 往 least significant bit 往下比較,這是因為低位的權重沒有高位的權重來的重要。 > 換句話說就是:若高位提前分出勝負,低位的勝負就沒有那麼重要了。 且最後都沒有分出勝負,才能說雙方平手。 > 實驗二是用兩個 2-to-4 decoders 組成一個 3-to-8 decoder, 有編碼,就有解碼,不知道以後會不會做到 encoder 呢? > 實驗三要實做一個 8-to-1 multiplexer,過程上沒遇到什麼大問題,就是看錯幾次。我到對答案的時候才發現,可以做下面已經給好答案的,這次就把他當作是我自己想練習囉 XD