在數字系統中,由於采用二進制運算處理數據,因此通常將信息變成若干位二進制代碼。在邏輯電路中,信號都是以高,低電平的形式輸出。編碼器:實現編碼的數字電路,把輸入的每個高低電平信號編成一組對應的二進制代碼。
設計一個輸入為8個高電平有效信號,輸出代碼為原碼輸出的3位二進制編碼器。
化簡邏輯表達式:由邏輯表達式可以得出,普通的8-3編碼器用或門即可實現。對應的verilog程序如下:
module mb_83(x,y); input [7:0]x; output [2:0]y; reg [2:0]y; always@(x) begin case (x) 8'b00000001:y=3'b000; //當 當 x=8 ’b00000001,則 則 y 輸出為 3 ’b000 8'b00000010:y=3'b001; //當 當 x=8 ’b00000010,則 則 y 輸出為 3 ’b001 8'b00000100:y=3'b010; //當 當 x=8 ’b00000100,則 則 y 輸出為 3 ’b010 8'b00001000:y=3'b011; //當 當 x=8 ’b00001000,則 則 y 輸出為 3 ’b011 8'b00010000:y=3'b100; //當 當 x=8 ’b00010000,則 則 y 輸出為 3 ’b100 8'b00100000:y=3'b101; //當 當 x=8 ’b00100000,則 則 y 輸出為 3 ’b101 8'b01000000:y=3'b110; //當 當 x=8 ’b01000000,則 則 y 輸出為 3 ’b110 8'b10000000:y=3'b111; //當 當 x=8 ’b10000000,則 則 y 輸出為 3 ’b111 default: y=3'b000; endcase end endmodule
上述編碼器有一個缺點,即在某一個時刻只允許有一個有效的輸入,而同時若又有兩個或兩個以上的輸入信號要求編碼,輸出端一定會發生混亂,出現錯誤。為了解決這個問題,引入了優先編碼器。優先編碼器的功能是允許同時在幾個輸入端有輸入信號,編碼器按照輸入信號預先排定的優先順序,只對同時輸入的幾個信號中有優先權高位的一個信號編碼。
對應的真值表為
對應的verilog程序:(輸入信號:i[7:0];輸入使能端:ei;輸出信號端:y: [2:0];輸出使能端eo;優先標志端gs)
module yxbm_83(y,eo,gs,i,ei); input [7:0] i; //8 位輸入 i input ei; // 使能輸入端 ei output eo,gs; // 使能輸出端 eo ,優先標志端 gs output[2:0] y; //3 位輸出 y reg[2:0] y; //3 位輸出寄存器 y reg eo,gs; // 使能輸出寄存器, always@(i,ei) // 電平觸發方式,當 i 跟 跟 ei 有改變的時候,執行以下操作 begin if(ei==1'b1) //當 ei 為 為 1 的時候 begin y<=3'b111; gs<=1'b1; eo<=1'b1; end else begin if(i[7]==1'b0) //當 i 的第 8 為 為 0 時候 begin y<=3'b000; gs<=1'b0; eo<=1'b1; end else if(i[6]==1'b0) //當 i 的第七位為 0 時候 begin y<=3'b001; gs<=1'b0; eo<=1'b1; end else if(i[5]==1'b0) //當 i 的第 6 位為 0 時候 begin y<=3'b010; gs<=1'b0; eo<=1'b1; end else if(i[4]==1'b0) //當 i 的第 5 位為 0 時候 begin y<=3'b011; gs<=1'b0; eo<=1'b1; end else if(i[3]==1'b0) //當 i 的第 4 位為 0 時候 begin y<=3'b100; gs<=1'b0; eo<=1'b1; end else if(i[2]==1'b0) //當 i 的第 3 位為 0 時候 begin y<=3'b101; gs<=1'b0; eo<=1'b1; end else if(i[1]==1'b0) //當 i 的第 2 位為 0 時候 begin y<=3'b110; gs<=1'b0; eo<=1'b1; end else if(i[0]==1'b0)//當 i 的第 1 位為 0 時候 begin y<=3'b111; gs<=1'b0; eo<=1'b1; end else if(i==8'b11111111)//當 i 為 為 8'b11111111 時候 begin y<=3'b111; gs<=1'b1; eo<=1'b0; end end end endmodule
時序仿真的結果:
譯碼器(Decoder):把代碼狀態的特定含義翻譯過來的過程為譯碼。譯碼器:實現譯碼操作的邏輯電路,就是把一種代碼轉換為另一種代碼的電路。
譯碼器與編碼器圖解:
設計一個具有三個使能端的3-8譯碼器:
真值表為:3位編碼輸入端a[2:0],使能輸入端g1,g2,g3;輸出信號:8位編碼輸出端y[7:0]。
module ym_3_8(a,g1,g2,g3,y); input[2:0] a; //3 位 位 2 進制編碼輸入端 input g1,g2,g3; //3 個使能輸入端 output[7:0] y; //8 位編碼輸出端 reg[7:0] y; always@(a or g1 or g2 or g3) // 電平觸發方式 begin if(g1==0) y=8'b11111111; // 如果 g1 為 為 0 ,則 y 輸出為 11111111 else if(g2==1) y=8'b11111111; // 如果 g2 為 為 1 ,則 y 輸出為 11111111 else if(g3==1) y=8'b11111111; // 如果 g3 為 為 1 ,則 y 輸出為 11111111 else case(a[2:0]) // 判斷 a 的值,並通過 a 的值來給 y // 設置輸出值 3'b000:y[7:0]=8'b11111110; 3'b001:y[7:0]=8'b11111101; 3'b010:y[7:0]=8'b11111011; 3'b011:y[7:0]=8'b11110111; 3'b100:y[7:0]=8'b11101111; 3'b101:y[7:0]=8'b11011111; 3'b110:y[7:0]=8'b10111111; 3'b111:y[7:0]=8'b11111111; endcase end endmodule