Verilog八線 - 三線優先編碼器設計(74LS148)


 

百度百科_74LS148

 

if語句法

 1  //8線-3線優先編碼器設計(74LS148)
 2  //
 3  //EI |  A7 A6 A5 A4 A3 A2 A1 A0  |  Y2 Y1 Y0  GS  EO
 4  //0  |  0  x  x  x  x  x  x  x   |  0  0  0   0   1  
 5  //0  |  1  0  x  x  x  x  x  x   |  0  0  1   0   1
 6  //0  |  1  1  0  x  x  x  x  x   |  0  1  0   0   1
 7  //0  |  1  1  1  0  x  x  x  x   |  0  1  1   0   1
 8  //0  |  1  1  1  1  0  x  x  x   |  1  0  0   0   1
 9  //0  |  1  1  1  1  1  0  x  x   |  1  0  1   0   1
10  //0  |  1  1  1  1  1  1  0  x   |  1  1  0   0   1
11  //0  |  1  1  1  1  1  1  1  0   |  1  1  1   0   1
12  //0  |  1  1  1  1  1  1  1  1   |  1  1  1   1   0
13  //1  |  x  x  x  x  x  x  x  x   |  1  1  1   1   1
14 
15  
16  module encoder_83 (din, EI, GS, EO, dout);
17      input [7:0] din;  //編碼輸入端data_in,低電平有效
18      input EI;  //使能輸入端EI(選通輸入端),EI為 0 時芯片工作,即允許編碼
19      output [2:0] dout;  //編碼輸出端data_out
20      output GS;  //片優先編碼輸出端,優先編碼器工作工作狀態標志GS,低電平有效
21      output EO;  //使能輸出端EO(選通輸出端)
22      reg [2:0] dout;
23      reg GS, EO;
24      always @(din or EI)
25          if(EI) begin dout <= 3'b111; GS <= 1; EO <= 1; end  //所有輸出端被鎖存在高電平
26          else if (din[7] == 0) begin dout <= 3'b000; GS <= 0; EO <= 1; end
27         else if (din[6] == 0) begin dout <= 3'b001; GS <= 0; EO <= 1; end
28         else if (din[5] == 0) begin dout <= 3'b010; GS <= 0; EO <= 1; end
29         else if (din[4] == 0) begin dout <= 3'b011; GS <= 0; EO <= 1; end
30         else if (din[3] == 0) begin dout <= 3'b100; GS <= 0; EO <= 1; end
31         else if (din[2] == 0) begin dout <= 3'b101; GS <= 0; EO <= 1; end
32         else if (din[1] == 0) begin dout <= 3'b110; GS <= 0; EO <= 1; end
33         else if (din[0] == 0) begin dout <= 3'b111; GS <= 0; EO <= 1; end
34         else if (din == 8'b11111111) begin dout <= 3'b111; GS <= 1; EO <= 0; end //芯片工作,但無編碼輸入
35         else begin dout <= 3'b111; GS <= 1; EO <= 1; end  //消除鎖存器(latch)
36 endmodule
37 
38 //EI = 0 表示允許編碼,否則所有輸出端被封鎖在高電平(控制芯片工作)
39 //EO = 0 表示電路工作,但無編碼輸入(用於級聯)
40 //GS = 0 表示電路工作,且有編碼輸入(判斷輸入端是否有輸入)

testbench:

 1 `timescale 1 ps/ 1 ps
 2 module encoder_83_vlg_tst();
 3     reg EI;
 4     reg [7:0] din;
 5     wire EO;
 6     wire GS;
 7     wire [2:0] dout;
 8     encoder_83 i1 (.EI(EI), .EO(EO), .GS(GS), .din(din), .dout(dout));
 9     initial                                                
10         begin                                                  
11             EI = 1;
12             din = 8'b11111111;
13             #10 EI = 0;
14             #10 din = 8'b01010101;
15             #10 din = 8'b10101010; 
16             #10 din = 8'b11010101;
17             #10 din = 8'b11101010;
18             #10 din = 8'b11110101;
19             #10 din = 8'b11111010;
20             #10 din = 8'b11111101;
21             #10 din = 8'b11111110;
22             #10 din = 8'b11111111;          
23         end                      
24 endmodule
View Code

 

 

 case語句法

 1   //8線-3線優先編碼器設計(74LS148)
 2  //
 3  //EI |  A7 A6 A5 A4 A3 A2 A1 A0  |  Y2 Y1 Y0  GS  EO
 4  //0  |  0  x  x  x  x  x  x  x   |  0  0  0   0   1  
 5  //0  |  1  0  x  x  x  x  x  x   |  0  0  1   0   1
 6  //0  |  1  1  0  x  x  x  x  x   |  0  1  0   0   1
 7  //0  |  1  1  1  0  x  x  x  x   |  0  1  1   0   1
 8  //0  |  1  1  1  1  0  x  x  x   |  1  0  0   0   1
 9  //0  |  1  1  1  1  1  0  x  x   |  1  0  1   0   1
10  //0  |  1  1  1  1  1  1  0  x   |  1  1  0   0   1
11  //0  |  1  1  1  1  1  1  1  0   |  1  1  1   0   1
12  //0  |  1  1  1  1  1  1  1  1   |  1  1  1   1   0
13  //1  |  x  x  x  x  x  x  x  x   |  1  1  1   1   1
14 
15  
16  module encoder_83_case (din, EI, GS, EO, dout);
17      input [7:0] din;  //編碼輸入端data_in,低電平有效
18      input EI;  //使能輸入端EI(選通輸入端),EI為 0 時芯片工作,即允許編碼
19      output [2:0] dout;  //編碼輸出端data_out
20      output GS;  //片優先編碼輸出端,優先編碼器工作工作狀態標志GS,低電平有效
21      output EO;  //使能輸出端EO(選通輸出端)
22      reg [2:0] dout;
23      reg GS, EO;
24      always @(din or EI)
25          if(EI) 
26              begin dout <= 3'b111; GS <= 1; EO <= 1; end  //所有輸出端被鎖存在高電平
27          else 
28              casez (din)  //建議用casez語句,casez把z/?匹配成任意。 casex把z/?/x匹配成任意,x為仿真初態
29                  8'b0??????? : begin dout <= 3'b000; GS <= 0; EO <= 1; end  //無關項建議用?表示,?是高阻態的另一種表示。?,z,Z是等價的
30                  8'b10?????? : begin dout <= 3'b001; GS <= 0; EO <= 1; end
31                  8'b110????? : begin dout <= 3'b010; GS <= 0; EO <= 1; end
32                  8'b1110???? : begin dout <= 3'b011; GS <= 0; EO <= 1; end
33                  8'b11110??? : begin dout <= 3'b100; GS <= 0; EO <= 1; end
34                  8'b111110?? : begin dout <= 3'b101; GS <= 0; EO <= 1; end
35                  8'b1111110? : begin dout <= 3'b110; GS <= 0; EO <= 1; end
36                  8'b11111110 : begin dout <= 3'b111; GS <= 0; EO <= 1; end
37                  8'b11111111 : begin dout <= 3'b111; GS <= 1; EO <= 0; end //芯片工作,但無編碼輸入
38                  default     : begin dout <= 3'b111; GS <= 1; EO <= 1; end  //消除鎖存器(latch)
39              endcase
40 endmodule
41 
42 //EI = 0 表示允許編碼,否則所有輸出端被封鎖在高電平(控制芯片工作)
43 //EO = 0 表示電路工作,但無編碼輸入(用於級聯)
44 //GS = 0 表示電路工作,且有編碼輸入(判斷輸入端是否有輸入)

 

 

 

 

如有錯誤還請指出,如有侵權還請告知,如需轉載請注明出處!                                              

本人博客:http://www.cnblogs.com/yllinux/

 


免責聲明!

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



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