Bit-banging es cuando un componente de hardware o módulo UART o USART no está disponible o no se utiliza.
Básicamente significa que el software necesita atender cada bit posiblemente a través de un bucle, comparación de contadores o interrupción.
Usar una macro-célula de registro de desplazamiento o un componente externo no es verdadero bit-banging a menos que el software esté proporcionando al menos el reloj o las condiciones de inicio/fin, si un temporizador de hardware está impulsando un registro de desplazamiento has creado una ART rudimentaria (receptor transmisor asíncrono), agrega más código VHDL y obtienes un UART (pero si consideras que el VHDL es código entonces es bit-banging).
EDITAR:
Después de reflexionar más a fondo necesito hacer una aclaración adicional. El bit-banging es diferente de lo que puede ser otro tipo debido al hecho de que se hace un bit a la vez en lugar de un byte (o palabra) a la vez. Esto significa que el software tiene que realizar múltiples operaciones de comunicación correspondientes al trabajo realizado para cada bit con posibles sobrecargas adicionales para bits de inicio y parada o cambios de estado dependiendo del formato/protocolo. Esto convierte al registro de desplazamiento en lo contrario al bit-banging porque es el componente de circuito que podrá sacar múltiples bits sin supervisión. Una situación incierta sería usar un registro de desplazamiento para mover los datos pero generando los flancos de reloj en el software. Esto probablemente seguiría siendo bit-banging debido al hecho de que el software tiene que atender el (reloj del) movimiento de datos en una base de bit a bit (incluso con el registro de desplazamiento de datos).
Si configuras un periférico ART, UART, USART, SPI, I2C, etc. y luego envías un byte (o palabra) y los datos se mueven (o entran) sin más asistencia de software eso NO sería Bit-banging.