Para el desarrollo de este laboratorio, usted deberá contar con una instalación de liteX, ya sea de forma nativa o mediante una máquina virtual. En la wiki de este repositorio se tiene una serie de guías que lo ayudaran a tener ya sea una maquina virtual con liteX o un contenedor de docker con liteX.
En este laboratorio usted implementará un filtro FIR (Finite Impulse Response) empleando lenguaje ensamblador para RV32I. Dicho filtro se ejecutará en un sistema en chip (SoC), creado con LiteX, y en el cual se tendrá un core de RISC-V.
Un filtro FIR se define matemáticamente como:
lo cual se puede expresar alternativamente como:
Como se observa de las anteriores ecuaciones, el cálculo de la salida
Para el filtro a implementar, considere que los coeficientes
Para la implementación de su programa, deberá guiarse con código de ejemplo que le es provisto en este repositorio. Deberá crear una archivo en C, fir.c (y su correspondiente fir.h) que le permita capturar del usuario 10 muestras (entradas) a ser filtradas, así como desplegar el correspondiente resultado. Por ejemplo, se espera recibir una entrada como se muestra a continuación. El resultado obtenido se deberá mostrar como se ejemplifica.
lab1> fir
[3,4,2,-3,-5,0,2,7,5,1]
Resultado
[3,-2,3,-1,2,1,-5,10,-8,8]Las funcionalidades que implemente en dicho fir.c solamente serán para la captura y preparación de los datos que se procesarán con el filtro que será implementado en lenguaje ensamblador.
El programa en lenguaje ensamblador deberá recibir una muestra a la vez y ser capaz de almacenar hasta 4 muestras anteriores para poder realizar el filtrado de manera apropiada. Debido a que el filtro implica la suma de las entradas escaladas por los coeficientes, y que usted se debe limitar al uso de las instrucciones del ISA RV32I, deberá implementar una forma eficiente para realizar la multiplicación, considerando que las entradas y los coeficientes son enteros con signo.
Hint: El siguiente fragmento de código ilustra, desde la perspectiva de C, la entrada y la salida a su programa para el filtro que deberá implementar en lenguaje ensamblador.
int fir(int xn) {
...
return yn;
}Evalúe su implementación del filtro para al menos los siguientes casos:
[0,1,2,1,0,-1,-2,-1,0,1]
[-4,5,2,0,3,-3,1,4,2,-7]
[0,0,0,1,0,0,0,0,0,0]
[0,1,2,3,4,0,1,2,3,4]
y agregué acá los resultados obtenidos para estos conjuntos de datos de entrada.
[]
[]
[]
[]
Empleando LiteX, usted podrá construir un SoC para ejecutar el código desarrollar. Empleando:
litex_sim --integrated-main-ram-size=0x10000 --cpu-type=vexriscv --no-compile-gatewarepodrá crearlo. Como producto de este comando, se producirá una carpeta build, la cuál deberemos referenciar al compilar el código.
En la carpeta lab1 de este repositorio se encuentra el código de referencia a utilizar y modificar. En dicha carpera usted deberá agregar su código fuente, tanto .c/.h como .S. Además, deberá modificar el Makefile para asegurarse de que su código se compile y quede dentro del .bin.
OBJECTS="helloc.o add_asm.o add.o fir_asm.o fir.o crt0.o main.o"Una vez realizadas las modificaciones necesarias, desde la carpeta lab1 podrá ejecutar un script de Python que se encargará de disparar la compilación
./lab1.py --build-path=../build/simPara cargar el .bin generado y que se ejecute en el SoC, usted deberá ejecutar:
litex_sim --integrated-main-ram-size=0x10000 --cpu-type=vexriscv --ram-init=./lab1/lab1.binEste laboratorio se evaluará con la siguiente rúbrica
| Rubro | % | C | EP | D | NP |
|---|---|---|---|---|---|
fir_asm.S produce el resultado correcto |
50 | ||||
Integración en main.c |
30 | ||||
| Uso de repositorio | 20 |
C: Completo,
EP: En progreso (
- El uso del repositorio implica que existan contribuciones de todos los miembros del equipo. El último commit debe registrarte antes de las 23:59 del miércoles 15 de marzo de 2023.