Blog

Definování kombinačních obvodů ve Verilogu

Tento článek představuje techniky pro vysvětlování kombinatorických obvodů ve Verilogu zkoumáním, jak lze použít podmíněný operátor k vysvětlení kombinačních pravdivých tabulek. Ukazuje také, jak použít blok „vždy“ Verilog k popisu kombinačních obvodů; Blok „vždy“ může poskytnout ještě jednodušší řešení pro definování digitálního obvodu.

V předchozím článku jsme diskutovali o použití klíčového slova „přiřazení“ Verilog k provádění průběžného přiřazování. Taková přiřazení jsou vždy aktivní a lze je použít k získání popisu digitálního obvodu na úrovni brány. Například v následujícím kódu definujícím bránu AND je pravá strana vyhodnocována průběžně a výsledek je umístěn v síti out1:

                    asignar out1 = a & b;   
                  

Verilog má podmíněný operátor (??. Syntaxe uvedená níže, která nám umožňuje zkontrolovat podmínku před provedením takových přiřazení:

Publicaciones relacionadas
                    asignar [signal_name] = [conditional_expression] ? [value_if_true] : [value_if_false];

                  

„Podmíněný výraz“ je vyhodnocen. Pokud má hodnotu true, je „if true_value“ přiřazeno „signal_name“. Pokud není správné, „signal_name“ získá „value_ if false“. Jako příklad zvažte následující kód:

                    asignar out1 = (sel)? (a y b): (a | b);
                  

Pokud je „povodeň“ pravdivá, budou a a b přiřazena „out1“. Pokud není správné, je „out1“ | b. Výše uvedený kód proto implementuje funkčnost multiplexeru 2: 1. Koncepční implementace tohoto kódu může být taková, jak je znázorněno na obrázku 1 níže.

Podmíněné přiřazení nám umožňuje mít abstraktnější definici určitých obvodů, protože má funkčnost příkazu „if“ v tradičních počítačových programovacích jazycích. Podmíněný operátor lze použít vnořeným způsobem k implementaci složitějších obvodů. Příklad 1 pojednává o těchto detailech.

Příklad 1: vnořené podmíněné operátory

Použijte podmíněný operátor (? 4, k identifikaci 4 až 2 primárních kodérů s následující tabulkou pravdivosti:

Verilog kód pro tento primární kodér je uveden níže:

                    módulo Prio_4_to_2
(
cable de entrada [3:0] X,
cable de salida [1:0] y
cable de salida v
);

asigna y = x[3] ? 2'b11:
X[2] ? 2'b10:
X[1] ? 2'b01:
2'b00;

asigna v = (x[3] | X[2] | X[1] | X[0] )? 1'b1: 1'b0;

endmódulo

                  

Kromě řádků 7 až 10 obsahuje kód základní prvky jazyka popsaného v našem předchozím článku. Pojďme se tedy na tyto řádky podívat.

Termíny 2’b11, 2’b10, 2’b01 se vztahují k verilogovým reprezentacím, které představují dvoubitová binární čísla. Obecně první číslo (před ‘b) označuje počet bitů. Písmeno B označuje, že čísla jsou binární. Čísla za písmenem „B“ udávají hodnotu čísla. 2’b01 je tedy Verilogova notace představující dvoubitové binární číslo s hodnotou 01 a 3’b100 označuje tříbitové binární číslo s hodnotou 100.

Řádek 7 kontroluje MSB vstupu, x[3], je podmíněný operátor. Pokud x[3]= 1, podmínka je vyhodnocena jako pravdivá a 2’b11 je přiřazeno a (přiřazená hodnota je převzata z pravdivostní tabulky). Pokud x[3]= 0, podmínka je vyhodnocena jako nepravdivá a výraz za dvojtečkou (:) je přiřazen k y. Výraz za dvěma body je kód na řádku 8, který je sám o sobě dalším podmíněným operátorem.

Druhý podmíněný operátor na řádku 8 přebírá druhý nejvýznamnější bit vstupu, x[2]K určení, zda je přiřazena 2’b10, nebo výraz za dvojtečkou, musí být vyhodnocen ještě další podmíněný operátor (řádek 9). Můžete ověřit, že odpovídá a je přiřazen k dané tabulce pravdy.

Aktuální výstup (v) tabulky pravdivosti bude logicky vysoký, pokud alespoň jeden bit vstupu bude logicky vysoký. Řádek 11 ilustruje tento popis aplikací bitového operátoru OR (|) na bity vstupu. Simulace výše uvedeného kódu Xilinx ISE je uvedena na obrázku 2.

Simulace Xilinx ISE

Obrázek 2. Simulace Xilinx ISE výše uvedeného kódu.

Je důležité si uvědomit, že podmíněné výrazy se vyhodnocují opakovaně, dokud není nalezen správný výraz. K tomuto skutečnému výrazu bude provedeno odpovídající přiřazení. Výsledkem je, že dříve hodnocené příkazy mají vyšší prioritu než následující. To znamená, že teoreticky je podmíněný operátor vhodnější pro implementaci prioritní sítě (obrázek 3) než vyvážená struktura, jako je multiplexer (obrázek 4).

prioritní síť

Obrázek 3. Je to prioritní síť.

 Multiplexer n-1 bez priority mezi vstupy.

Obrázek 4. Multiplexer n-1 bez priority mezi vstupy.

Předchozí článek stanoví podobnou diskusi o souběžných přiřazeních VHDL.

Procedurální výrazy Verilog

Libovolný kombinační obvod můžeme rozdělit na několik základních logických bran (AND, OR, NOT atd.) A k popisu těchto bran můžeme použít výraz „přiřazení“ (popis úrovně brány). Můžeme také použít podmíněný operátor popsaný v předchozí části, abychom získali abstraktnější způsob definování některých kombinačních obvodů (podobně jako příkaz „if“ v počítačových programovacích jazycích). Stále však existuje výkonnější řešení: blok Verilog použijte „vždy“.

Uvnitř bloku „vždy“ můžeme mít procedurální výrazy prováděné postupně. Blok „always“ navíc podporuje abstraktní jazykové konstrukce, jako jsou příkazy „if“ a „case“.

Sekvenční exekutivní funkce spolu s existujícími strukturami abstraktního jazyka v rámci bloku „vždy“ nám umožňuje snadněji popsat funkčnost obvodu, protože lidské uvažování má uspořádanou povahu a je založeno na abstraktních definicích. Obvykle uvažujeme spíše algoritmickými způsoby na vysoké úrovni než logickými branami na nízké úrovni. Blok „vždy“ může poskytnout jednodušší řešení pro definování digitálního obvodu. Další podrobnosti o tom, proč HDL podporuje vysvětlení založená na sekvenčních výrazech, najdete v úvodu k sekvenčním výrazům VHDL.

Příklad 2: Blokovat deklarace „Vždy“

Níže je uvedena zjednodušená syntaxe pro blok „vždy“:

                    siempre @ (lista de sensibilidad)
empezar
secuential_statements;
fin


                  

Seznam citlivosti určuje, kdy mají být provedeny sekvenční výrazy v bloku „always“. Zvažte například použití bloku „vždy“ k vysvětlení obvodů na obrázku 5.

Definování kombinačních obvodů ve Verilogu 1603173054 921 Definovani kombinacnich obvodu ve Verilogu

Obrázek 5. Circuit_1

Když se změní a nebo b, výstup se může změnit, což znamená, že a a b by měly být „vždy“ na seznamu citlivosti bloku. Obecně platí, že pro kombinační obvod musí být všechny vstupní signály zahrnuty do seznamu citlivosti.

Nyní můžeme použít bitový operátor AND k vysvětlení funkčnosti obvodu (aab) a přiřadit výsledek výstupu. V bloku „vždy“ existují dva různé typy přiřazení: přiřazení bloku (=) a odblokování přiřazení (

                    siempre @ (a, b)
empezar
     out1 = a & b;
fin
                  

Jaký je rozdíl mezi přiřazením zámku a odemknutím?

Při přiřazení zámku se vyhodnotí pravá strana a okamžitě se přiřadí out1. Proto, když je spuštěn řádek 3, out1 je aktualizován těsně před přechodem na další řádek kódu. Název „přiřazení zámku“ zdůrazňuje, že následující řádky jsou uzamčeny, dokud není aktualizována levá strana.

Při neblokujícím přiřazení se výraz na pravé straně vyhodnotí, ale nepoužije se na proměnnou na levé straně, dokud nedosáhne konce bloku „vždy“. Výběr zamčeného nebo odemčeného úkolu může být pro začátečníky matoucí a zneužití může vést k nežádoucí funkčnosti. Například použití přiřazení kláves k odstranění klopných obvodů může představit závodní podmínky.

V tomto úvodním článku se nebudeme zabývat podrobnostmi a držíme se jednoduchého průvodce, abychom se vyhnuli možným nástrahám: při psaní kódu pro kombinovaný obvod používejte přiřazení zámku. Proto bude blok „vždy“ v seznamu 1 použit k definování brány AND.

V předchozím článku jsme se seznámili s „drátovým“ datovým typem Verilog. Tento datový typ představuje v našem návrhu FPGA fyzický kabel. V rámci bloku „vždy“ nám standard Verilog neumožňuje přiřadit hodnotu „kabelu“. Místo toho používáme datový typ „reg“. Název „reg“ může být trochu matoucí, ale mějte na paměti, zda „reg“ povede ve vašem designu k fyzickému úložišti. Následující kód je Verilogovým vysvětlením obrázku 5 pomocí bloku „always“. Všimněte si, že výstupní datový typ musí být „reg“, protože získává svou hodnotu bez procedurálního přiřazení.

                    módulo Circuit_1
(
cable de entrada a,
cable de entrada b,
salida reg out1
);

siempre @ (a, b)
empezar
out1 = a & b;
fin

endmódulo
                  

V tomto článku se seznámíme s podmíněným operátorem Verilog. K definování kodéru priority používáme vnořenou formu tohoto operátoru. Dále vezmeme v úvahu blok „always“, což je výkonnější jazyková konstrukce pro popis kombinačních obvodů. V budoucích článcích budeme zkoumat použití bloku „always“ k implementaci sekvenčních obvodů.

Botón volver arriba
Cerrar

Bloqueador de anuncios detectado

¡Considere apoyarnos desactivando su bloqueador de anuncios!