Kombinációs áramkörök modelezése Laborgyakorlat Dr. Oniga István
Funkcionális kombinációs egységek A következő funkcionális egységek logikai felépítésével, és működésével foglalkozunk: kódolók, dekódolók, multiplexerek, demultiplexerek, komparátorok, összeadok, paritásvizsgáló áramkörök.
Kódolók A kódoló egy olyan áramkör amelynek bármelyik 1 az m - ből bemenetének az aktiválása esetén egy k bites kódot szolgál Y m 1 decimális BCD átalakító r 0 a n I n r = 0,1,,(k-1), 3 2 1 0 0 1 2 3 4 5 6 7 8 Decimális bemenet 0 1 2 3 4 5 6 7 8 9 1 2 4 8 BCD kimenet 9
Decimális BCD átalakító A táblázat alapján felírhatók az egyes kimeneteket megvalósító logikai függvények Y 0 =I 1 +I 3 +I 5 +I 7 +I 9 Y 1 =I 2 +I 3 +I 6 +I 7 Y 2 =I 4 +I 5 +I 6 +I 7 Y 3 =I 8 +I 9 I Y 3 Y 2 Y 1 Y 0 I 0 0 0 0 0 I 1 0 0 0 1 I 2 0 0 1 0 I 3 0 0 1 1 I 4 0 1 0 0 I 5 0 1 0 1 I 6 0 1 1 0 I 7 0 1 1 1 I 8 1 0 0 0 I 9 1 0 0 1
Decimális BCD átalakító Verilog modul module BCDmod( input [9:0] din, output [3:0] led ); assign led[0]=din[1] din[3] din[5] din[7] din[9]; assign led[1]=din[2] din[3] din[6] din[7]; assign led[2]=din[4] din[5] din[6] din[7]; assign led[3]=din[8] din[9]; NET "led<0>" LOC="P59" ; NET "led<1>" LOC="P58" ; NET "led<2>" LOC="P54" ; NET "led<3>" LOC="P53" ; NET "din<0>" LOC="P101" ; NET "din<1>" LOC="P95" ; NET "din<2>" LOC="P89" ; NET "din<3>" LOC="P84" ; NET "din<4>" LOC="P78" ; NET "din<5>" LOC="P69" ; NET "din<6>" LOC="P48" ; NET "din<7>" LOC="P47" ; NET "din<8>" LOC="P41" ; NET "din<9>" LOC="P38" ;
Decimális BCD átalakító procedurális leírása // 3-Bit 1-of-9 Priority Encoder //Verilog 1995 module v_priority_encoder_1 (sel, code); input [7:0] sel; output [2:0] code; reg [2:0] code; always @(sel) begin if (sel[0]) code = 3'b000; else if (sel[1]) code = 3'b001; else if (sel[2]) code = 3'b010; else if (sel[3]) code = 3'b011; else if (sel[4]) code = 3'b100; else if (sel[5]) code = 3'b101; else if (sel[6]) code = 3'b110; else if (sel[7]) code = 3'b111; else code = 3'bxxx; end // 3-Bit 1-of-9 Priority Encoder //Verilog 2001 module v_priority_encoder_1 (input [7:0] sel, output reg [2:0] code); always @(sel) begin if (sel[0]) code = 3'b000; else if (sel[1]) code = 3'b001; else if (sel[2]) code = 3'b010; else if (sel[3]) code = 3'b011; else if (sel[4]) code = 3'b100; else if (sel[5]) code = 3'b101; else if (sel[6]) code = 3'b110; else if (sel[7]) code = 3'b111; else code = 3'bxxx; end
8:3 kódoló strukturális leirás Top modul Kódoló modul Implementáció Adja hozzá a megfelelő ucf fájlt
8:3 kódoló - szimuláció Adja hozzá a kódoló modulhoz egy Verilog test fixture fájlt. A test fixture fájlban hozza létre az alábbi ábra szerint a nyolc bites gerjesztő jelet és ellenőrizze az y kimenetet.
Prioritásos kódoló for Loop-al Ha egyidejűleg egynél több bemenet aktív, az eredmény nem meghatározható. A megoldás: a bemenetekhez prioritást rendelünk Ha egy vagy több bemenet aktív, akkor a legmagasabb prioritásúnak megfelelő eredményt kapjuk
Prioritás kódoló szimuláció
Prioritásos kódoló if-el module priority ( input [7:0] sel; output reg [2:0] code); always @(sel) begin if (sel[0]) code <= 3'b000; else if (sel[1]) code <= 3'b001; else if (sel[2]) code <= 3'b010; else if (sel[3]) code <= 3'b011; else if (sel[4]) code <= 3'b100; else if (sel[5]) code <= 3'b101; else if (sel[6]) code <= 3'b110; else if (sel[7]) code <= 3'b111; else code <= 3'bxxx; end
Dekódolók A dekódoló (dekóder) egy olyan áramkör amely a bemenetére adott kód alapján egyetlen kimenetet tesz aktívvá Egy bináris dekódolónak n bemenete és 2 n kimenete van (ezek közül egyidejűleg csak egy lehet aktív logikai értékű).
Bináris dekódoló 2-ról 4-re
Bináris dekódoló 3-ról 8-ra A dekódoló elvi rajza A 2 A 1 A 0 Y 0 Y 1 Y 2 Y 3 Y 4 Y 5 Y 6 Y 7 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1
Bináris dekódoló 3-ról 8-ra - Verilog modul module decod( input A0, input A1, input A2, output [7:0] led ); assign led[0]=~a0&~a1&~a2; assign led[1]=a0&~a1&~a2; assign led[2]=~a0&a1&~a2; assign led[3]=a0&a1&~a2; assign led[4]=~a0&~a1&a2; assign led[5]=a0&~a1&a2; assign led[6]=~a0&a1&a2; assign led[7]=a0&a1&a2; NET "A0" LOC="P41" ; NET "A1" LOC="P38" ; NET "A2" LOC="P36" ; NET "led<0>" LOC="P59" ; NET "led<1>" LOC="P58" ; NET "led<2>" LOC="P54" ; NET "led<3>" LOC="P53" ; NET "led<4>" LOC="P52" ; NET "led<5>" LOC="P51" ; NET "led<6>" LOC="P50" ; NET "led<7>" LOC="P43" ;
Bináris dekódoló 3-ról 8-ra // 1-of-8 decoder (One-Hot) module v_decoders_1 (input [2:0] sel, output reg [7:0] res); // 1-of-8 decoder (One-Cold) module v_decoders_1 (input [2:0] sel, output reg [7:0] res); always @(sel or res) begin case (sel) 3'b000 : res = 8'b00000001; 3'b001 : res = 8'b00000010; 3'b010 : res = 8'b00000100; 3'b011 : res = 8'b00001000; 3'b100 : res = 8'b00010000; 3'b101 : res = 8'b00100000; 3'b110 : res = 8'b01000000; default : res = 8'b10000000; endcase end always @(sel) begin case (sel) 3'b000 : res = 8'b11111110; 3'b001 : res = 8'b11111101; 3'b010 : res = 8'b11111011; 3'b011 : res = 8'b11110111; 3'b100 : res = 8'b11101111; 3'b101 : res = 8'b11011111; 3'b110 : res = 8'b10111111; default : res = 8'b01111111; endcase end
MUX-DEMUX Kevés számú adathordozó (vezeték, rádióhullám, stb.) igénybevételével - nagy számú jelek továbbítására alkalmas. Adatgyűjtés, adatelosztás Analóg multiplexelés, digitális multiplexelés Byte vagy bitszervezésű multiplexelés Időmultiplexelés vagy címszerinti multiplexelés
MULTIPLEXEREK A multiplexer olyan digitális kapcsoló, amely m (m=2 n ) különböző forrásból származó adatokat kapcsol egy kimenetre. A kiválasztó bemenetek határozzák meg, hogy melyik adatforrás jele kerül a kimenetre 2 n féle adathoz 2 n különböző cím kell 2 n különböző címet n bittel tudunk előállítani
Példa MUX 2:1 multiplexer module mux_21 (input in0, in1, sel, output r); assign r = (sel==1 b1)? in1 : in0; module mux_21 (input in0, in1, sel, output reg r); always @ (*) if (sel==1 b1) r <= in1; else r <= in0; module mux_21 (input in0, in1, sel, output reg r); always @ (*) case(sel) 1 b0: r <= in0; 1 b1: r <= in1; Assign If Case
4 x1 MULTIPLEXER 4 féle adathoz két különböző címbit kell 4 vonalas multiplexer blokkdiagramja 4 vonalas multiplexer áramköri megvalósítása Cím választó 0 A 0 1 A 1 0 1 MUX Adat kimenet Adat bemenetek D 0 D 1 D 2 D 3 0 1 2 3 Y = ~A1 & ~A0 & D0 ~A1 & A0 & D1 A1 & ~A0 & D2 A1 & A0 & D3
Multiplexer (4:1) module mux_41 (input in0, in1, in2, in3, input [1:0] sel, output reg r); always @ (*) case(sel) 2 b00: r <= in0; 2 b01: r <= in1; 2 b10: r <= in2; 2 b11: r <= in3; endcase
Quad (2:1) Multiplexer module mux24b (input [3:0] a, b, input s, output reg [3:0] y); always @ (*) if (s==1 b1) y <= b; else y <= a; module mux24b (input [3:0] a, b, input s, output reg [3:0] y); always @ (*) if (s==1 b0) y <= a; else y <= b;
Generikus Multiplexer Feladat: Írjon Verilog kódban egy 4 bites bementekkel rendelkező 3:1 multiplexert
Háromállapotú Multiplexer (4:1) // // 4-to-1 1-bit MUX using tristate buffers. // module v_multiplexers_3 (a, b, c, d, s, o); input a,b,c,d; input [3:0] s; output o; assign o = s[3]? a :1'bz; assign o = s[2]? b :1'bz; assign o = s[1]? c :1'bz; assign o = s[0]? d :1'bz;
Háromállapotú vonalak Ketiranyu kommunikacios vonalak Mai FPGA-kban belul nincs HiZ buffer! Kétirányú kommunikációs vonalak, pl. Külső memóriák adatbusza module tri_state (input clk, inout [7:0] data_io); wire [7:0] data_in, data_out; wire bus_drv; assign data_in = data_io; assign data_io = (bus_drv)? data_out : 8 bz; A kétirányú vonalak meghajtását engedélyező jel (bus_drv) kritikus
Háromállapotú vonalak // // Tristate Description Using Concurrent Assignment // module v_three_st_2 (T, I, O); input T, I; output O; assign O = (~T)? I: 1'bZ;