Vengo de un fondo de programación y no me metí demasiado con el hardware o el firmware (a lo sumo un poco de electrónica y Arduino).
¿Cuál es la motivación al usar lenguajes de descripción de hardware (HDL) como Verilog y VHDL sobre los lenguajes de programación como C o algunos ensamblajes?
¿Es esta cuestión una cuestión de elección?
Leí que el hardware, cuyo firmware está escrito en un HDL, tiene una clara ventaja al ejecutar instrucciones en paralelo. Sin embargo, me sorprendió ver discusiones que expresaban dudas acerca de si escribir firmware en C o ensamblado (¿cómo es apropiado ensamblar si no necesariamente tiene una CPU?) Pero concluí que también es una opción.
Por lo tanto, tengo algunas preguntas (no dudes en explicar nada):
¿Un firmware realmente se puede escribir en HDL o en un lenguaje de programación de software, o es simplemente otra forma de realizar la misma misión? Me encantaría ver ejemplos del mundo real. ¿Qué restricciones resultan de cada opción?
Sé que un uso común del firmware sobre el software es en los aceleradores de hardware (como GPU, adaptadores de red, aceleradores SSL, etc.). Según tengo entendido, esta aceleración no siempre es necesaria, sino que solo se recomienda (por ejemplo, en el caso de SSL y la aceleración de algoritmos complejos). ¿Se puede elegir entre firmware y software en todos los casos? De lo contrario, me agradaría ver casos en los que el firmware es claro e inequívocamente apropiado.
He leído que el firmware se grabó principalmente en ROM o flash. ¿Cómo se representa allí? ¿En bits, como el software? Si es así, ¿cuál es la profunda diferencia? ¿Es la disponibilidad de circuitos adaptados en el caso del firmware?
Supongo que cometí un error aquí y allá en algunas suposiciones, por favor perdóname. ¡Gracias!
Respuestas:
C y ensamblado son buenos lenguajes para decirle a una CPU qué hacer. Describen las acciones que debe realizar secuencialmente una sola máquina de estado.
Las HDL son buenos lenguajes para describir o definir una colección arbitraria de circuitos digitales. Pueden expresar operaciones realizadas en paralelo de formas que los lenguajes de programación no pueden. También pueden describir las limitaciones de tiempo para las interfaces entre bloques de formas que los lenguajes de programación no pueden.
En esa pregunta, lo que se pregunta es: "Si está escribiendo código para un microcontrolador, ¿hay alguna diferencia real si escribe en ensamblador o en C o en algún otro lenguaje de alto nivel?".
Dado que está preguntando específicamente sobre los sistemas con un microcontrolador (una CPU con periféricos), C o ensamblaje son opciones razonables para el desarrollo de la primera guerra, y las HDL no lo son.
Depende del tipo de hardware que tenga. Si tiene una CPU, use un lenguaje de programación. Si tiene un FPGA o está diseñando un ASIC, use un HDL. Si está diseñando una gran cantidad de lógica digital, puede buscar uno de los idiomas intermedios como SystemVerilog.
Creo que te estás quedando atrapado en el término "firmware". Esta palabra originalmente significaba que el código se ejecutaba en un sistema incrustado, al que el usuario final no podía cambiar. Si le vendió una PC a alguien, hay muchas posibilidades de que el usuario cambie el software que se ejecuta en ella. Si les vendió un osciloscopio, no querrá que cambien el código que se ejecuta en el microprocesador interno, por lo que lo llamó firmware.
Los usuarios de FPGA se apropiaron de la palabra "firmware" para la salida de sus diseños, porque es más cambiante que el hardware (material que se suelda). Pero realmente el "firmware" que configura un FPGA es diferente del "firmware" que se ejecuta en un uC. El firmware de uC dirige la uC a través de una serie de estados para realizar su función. El firmware FPGA define un conjunto de interconexiones entre elementos lógicos y valores que se almacenarán en tablas de búsqueda.
En cualquier caso, el firmware generalmente se almacena como bits en un eeprom (o en un disco en una máquina host que no lo descargará cada vez que se reinicie el sistema integrado). Pero eso no los hace similares entre sí.
fuente
Para la primera parte de su pregunta, sobre las motivaciones del uso de uno u otro: hay una diferencia fundamental entre C y HDL (VHDL / Verilog) . C es un lenguaje de programación de software (como lo es el ensamblado), VHDL / Verilog son lenguajes de descripción de hardware . No están destinados para el mismo propósito.
C se traduce en código ensamblador (en su forma binaria, es decir, lenguaje de máquina) cuando se compila . Este código es una serie de instrucciones que le indican a la CPU que realice una serie de operaciones básicas (cambiar un valor de registro, realizar una suma, etc.).
Por otro lado, un HDL se sintetiza en hardware. En VHDL, por ejemplo, podría escribir algo como:
(Ver también un ejemplo más completo aquí ). Esto se sintetizaría en un sumador (hardware). Si el código se sintetiza para un FPGA , esto significaría un flujo de bits que puede configurar el FPGA específico para implementar un sumador (como lógica combinacional ).
En realidad, podría diseñar una CPU en VHDL (consulte Procesadores de núcleo blando VS Procesadores de núcleo duro ), y escribir el software en C ...
Sobre el firmware: en realidad todo depende de cómo se defina la palabra. Un firmware puede ser un programa (software) que se ejecuta en un microcontrolador (escrito así, por ejemplo, en C o ensamblador), o puede ser un flujo de bits para configurar un dispositivo lógico programable (hardware) (CPLD o FPGA). A veces puede ser un paquete que contiene ambos: si toma el firmware para algunos modelos de FritzBox (un módem ADSL), en realidad contienen un sistema Linux completo (escrito en ensamblador, C y muchos otros lenguajes de programación) y un flujo de bits para configurar un FPGA (probablemente sintetizado desde VHDL o Verilog).
fuente
fuente
La concurrencia de hardware es una gran motivación.
Los electrones pueden fluir al mismo tiempo en cables paralelos, por lo que queremos tener eso en cuenta al diseñar el hardware.
En VHDL, si escribe algo como:
(fuera de un
process
ofunction
, que lo marca explícitamente como secuencial), entonces ha codificado el hecho de que:x
,y
,z
,a
Yb
son alambresa
yb
son señales de entradax
está conectado a la salida de unor
circuito, que tomaa
yb
como entradaEs fácil ver cómo se sintetizará en el hardware real, y eso
x
yy
evaluarlo al mismo tiempo.Luego, cuando es hora de simular el circuito, el simulador (que generalmente es un programa secuencial) simula la física del circuito de esta manera:
a
ob
cambiado? ¿Si? Hey,x
dependea
. Vamos a actualizarx
.y
También dependea
. Actualiza eso también.z
dependex
. Actualízalo porquex
se actualizó.x
dependa de (a
ob
)? ¿No? Lo mismo paray
yz
. OK, hemos terminado con este paso.Esto lleva a posibles resultados "interesantes" que no tienen un análogo secuencial, pero que representan posibles situaciones físicas:
x <= not x
conduciría a una recursión infinita de la simulación. Los simuladores pueden simplemente cortar después de cierta profundidad.x <= 0; x <= 1
conduce a un error (cortocircuito). Esta es una de las razones por las cualesstd_logic
existe.Aún así, a pesar de que VHDL modela el hardware más de cerca que C, no es en sí una descripción perfectamente detallada:
Al final, VHDL proporciona un buen equilibrio entre la funcionalidad de circuito comprensible para humanos de nivel superior y la capacidad de sintetización de nivel inferior.
C, por otro lado, está más enfocado en hablar con la CPU secuencialmente.
Por supuesto, podría codificar un circuito con estructuras C, enumeraciones y matrices, y luego simularlo como lo hace VHDL (esto se parece más o menos a lo que hace el Sistema C , pero nunca lo he intentado).
Pero esencialmente volvería a implementar un simulador VHDL y con un lenguaje más detallado. Herramienta adecuada para el trabajo correcto, supongo.
También hay herramientas que convierten C a VHDL /programming/8988629/can-you-program-fpgas-in-c-like-languages pero esperan un rendimiento más bajo ya que esas son conversiones difíciles de alto nivel.
fuente
Las HDL se usan para describir (sintetizar) hardware donde, como lenguaje de programación, se usa para programar el hardware ya sintetizado, es decir, la CPU.
Puede obtener versiones de cpus de núcleo blando como VHDL o bitstream para sintetizar esa CPU en un FPGA.
fuente
Un procesador usa una cantidad modesta de circuitos para realizar una gran cantidad de operaciones, secuencialmente, al permitir que la mayoría de los componentes se usen para realizar diferentes operaciones en diferentes momentos.
Un FPGA contiene varios circuitos que no pueden, al menos individualmente, realizar operaciones particularmente sofisticadas, pero que son capaces de actuar de manera simultánea e independiente.
Supongamos que uno quiere tener un chip que realice una serie de tareas, entre las cuales se encuentran monitorear 15 entradas y:
Si uno tiene un microcontrolador que está haciendo otras cosas, pero puede ahorrar unos microsegundos cada 20 ms para examinar esas entradas y configurar la salida, entonces la mayoría de los circuitos que utiliza el microcontrolador para realizar otras tareas también serán utilizables para realizar la tarea indicada arriba, por lo que se necesitará dedicar muy poca circuitería (aparte de algo de ROM y quizás RAM) a esa tarea. Por otro lado, puede llevar un tiempo entre el momento en que cambia una entrada y el tiempo en que la salida lo refleja correctamente.
Usando Verilog o VHDL, uno podría construir un circuito de hardware que pudiera monitorear continuamente las 15 entradas y realizar el cálculo indicado. Tal dispositivo probablemente podría hacer que la salida produzca una indicación correcta dentro de 100ns, órdenes de magnitud más rápidas que el microcontrolador, pero la cantidad de circuitos dedicados a esa tarea e inutilizables para cualquier otro propósito sería mucho mayor.
fuente