M1 es un multiplexor k-1 de ancho a 1 con habilitaciones individuales controladas desde el contador de anillo. Donde la señal READY fuerza la salida a un '0'. M2 es un selector 1: k-1 con habilitaciones individuales desconectadas del contador de anillo. El contador de anillos tiene k etapas. MUX1 es un multiplexor 2: 1 de ancho k + 1 con una única entrada de selección.
En el modelo M1, M2 y MUX1, no tiene acceso a transistores en el entorno de software integrado de la tecnología de síntesis de Xilinx. En el mejor de los casos, puede emularlo en un FPGA.
M1_out <= reduce_or (B(32 downto 1) and Ring_Counter(31 downto 0))
when Ready = '0' else
'0' when Ready = '1';'
Ready is Ring_Counter (31).
Cuando en una implementación a nivel de transistor, la reducción OR es en realidad un OR de cable. Dependiendo de los paquetes y la versión VHDL, es posible que tenga una reducción O disponible como función o como operador.
Lo que tiene de especial la arquitectura es la capacidad de utilizar pestillos para P en lugar de un registro de desplazamiento a la derecha de desplazamiento de carga paralelo y ahorrar energía al reducir el número de redes que cambian con el reloj.
Podrías escribir modelos de comportamiento de transistores pero no te acercará más a los transistores reales.
Addendum
"podemos escribir un modelo estructural en lugar del modelo de comportamiento ..."
Estructural en este caso es el nivel de transistor. No podemos modelar los transistores con precisión sin simulación analógica, VHDL no sabe nada acerca de los transistores. Podemos hacer un modelo lógico digital estructural.
Se utilizan dos tipos de transistores, ambos mostrados incidentalmente en MUX1, que es un multiplexor 2: 1 de k + 1 de ancho:
Llamealaconexiónsuperioraltransistorsource
,alaconexióninferiordrain
yalaburbujamedia(derecha)oburbujamenosalaconexióngate
.
Lasiguientenoeslaúnicaformademodelartransistoresaquí.Modelartransistoresesalgomejordejarloeneldominioanalógico.
Modelamoslosdostransistoresdemaneradiferentesegúnlaburbuja:
libraryieee;useieee.std_logic_1164.all;entitytransisport(source:instd_logic;gate:instd_logic;drain:outstd_logic);endentity;architecturefuncoftransisbegindrain<=sourcewhengate='1'else'Z'whengate='0'else'X';endarchitecture;libraryieee;useieee.std_logic_1164.all;entitytrans_bubbleisport(source:instd_logic;gate:instd_logic;drain:outstd_logic);endentity;architecturefuncoftrans_bubbleisbegindrain<=sourcewhengate='0'else'Z'whengate='1'else'X';endarchitecture;
Sinlasimulaciónanalógica,loúnicoquepodríamoshacerseríamodelarlafuenteyeldrenajecomomodoinout
yresolverambassalidas.Parecemuchotrabajoparaalgoquenopuedesermuyprecisodetodosmodos.
UnmodeloMUX1simplequeusatransistores:
libraryieee;useieee.std_logic_1164.all;entityMUX1isgeneric(k:natural:=32--kwidth);port(a:instd_logic_vector(kdownto0);--widthisk+1b:instd_logic_vector(kdownto0);sel:instd_logic;outp:outstd_logic_vector(kdownto0));endentity;architecturefuncofMUX1issignalwire_ab:std_logic_vector(kdownto0);beginMUX_1:foriinoutp'rangegenerateMUX1A:entitywork.trans_bubbleportmap(source=>a(i),gate=>sel,drain=>wire_ab(i));MUX1B:entitywork.transportmap(source=>b(i),gate=>sel,drain=>wire_ab(i));endgenerate;WIRED_OR:outp<=wire_ab;
arquitecturafinal;
Lasdeclaracionesdegeneracióngeneranunconjuntode32transistoresconburbujasparaelladoadelmulitplexery32transistoressinburbujasparaelladob.LassalidasdelostransistoresoelcableOjaronelvalordesalidacontandoconlaresoluciónstd_logic.Untransistorestáencendidooapagado.Enestosmodelos,laentradadelafuenteseexpulsaeneldrenajecuandolacompuertasehabilita,delocontrarioseemite'Z'(altaimpedancia).
EscribiendounbancodepruebassimpleparaMUX1:
libraryieee;useieee.std_logic_1164.all;entitymux1_tbisgeneric(k:natural:=32);endentity;architecturefooofmux1_tbissignala:std_logic_vector(kdownto0):=('0'&X"FEEDFACE");
signal b: std_logic_vector(k downto 0) := ('1' & X"DEADBEEF");
signal outp: std_logic_vector(k downto 0);
signal sel: std_logic;
begin
DUT:
entity work.mux1
generic map (
k => k
)
port map (
a => a,
b => b,
sel => sel,
outp => outp
);
STIMULUS:
process
begin
wait for 10 ns;
sel <= '0';
wait for 10 ns;
sel <= '1';
wait for 10 ns;
wait;
end process;
end architecture;
nos da:
Que muestra que funciona MUX1. Además, si tuviera que mirar dentro de la jerarquía, encontraría 32 pares de transistores (MUX_1 [0-32] / MUX1A y MUX_1 [0-32] / MUX1B o alguna variación, donde los MUX1A son trans_bubble y los MUX1B son trans).
M1 y M2 requieren acceso individual a las entradas de la puerta y tienen un riel común para la fuente (M2) o el drenaje (M1), consulte la Figura 2 del documento. Tenga en cuenta que en ningún lugar del multiplexor MUX1, el selector M1 o el decodificador M2 hay más de un transistor habilitado a la vez.
Debido a que el contador de anillo también proporciona una señal LISTA, también impulsa la salida del selector M1 a '0'
a través del transistor por debajo del drenaje común. En lugar de usar las funciones de resolución, simplemente puede invertir las conexiones para que el drenaje del único transistor esté en la parte superior del símbolo esquemático. Podemos hacer esto porque todas las habilitaciones de transistores son mutuamente excluyentes. La intención es tener siempre algo conduciendo una red. Esto evita el enganche y otros fenómenos desagradables en implementaciones reales. El suelo puede ser reemplazado por un '0'.