8-3編碼器,3-8譯碼器的verilog實現


在數字系統中,由於采用二進制運算處理數據,因此通常將信息變成若干位二進制代碼。在邏輯電路中,信號都是以高,低電平的形式輸出。編碼器:實現編碼的數字電路,把輸入的每個高低電平信號編成一組對應的二進制代碼。

設計一個輸入為8個高電平有效信號,輸出代碼為原碼輸出的3位二進制編碼器。

image

化簡邏輯表達式:image由邏輯表達式可以得出,普通的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

上述編碼器有一個缺點,即在某一個時刻只允許有一個有效的輸入,而同時若又有兩個或兩個以上的輸入信號要求編碼,輸出端一定會發生混亂,出現錯誤。為了解決這個問題,引入了優先編碼器。優先編碼器的功能是允許同時在幾個輸入端有輸入信號,編碼器按照輸入信號預先排定的優先順序,只對同時輸入的幾個信號中有優先權高位的一個信號編碼。

image

對應的真值表為

image

對應的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

時序仿真的結果:

image

譯碼器(Decoder):把代碼狀態的特定含義翻譯過來的過程為譯碼。譯碼器:實現譯碼操作的邏輯電路,就是把一種代碼轉換為另一種代碼的電路。

譯碼器與編碼器圖解:

image

設計一個具有三個使能端的3-8譯碼器:

真值表為:3位編碼輸入端a[2:0],使能輸入端g1,g2,g3;輸出信號:8位編碼輸出端y[7:0]。

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM