Habilidades de operación de ancho de bits de Verilog ---- empalme y truncamiento

En el desarrollo de FPGA, a menudo puede estar involucrada la intercepción de ancho de bits, por ejemplo, una señal define una señal A [15: 0], en el uso real, a veces solo es necesario interceptar los 8 bits superiores, entonces es A [15: 8 ], o interceptar los 8 bits inferiores A[7:0]. Este es el escenario de uso más común y no supone ningún problema para un ingeniero de FPGA principiante. Este artículo presenta principalmente varios escenarios prácticos pero ligeramente impopulares relacionados con operaciones de ancho de bits.

1. Copiar y empalmar

    Empalmar significa empalmar varios datos de ancho de bits cortos en datos de ancho de bits más grandes. Por ejemplo: A = 4'h5 B = 4'hA; empalmar A y B es {A,B} = 8'h5A. Esta es la operación de empalme más común, pero ¿qué pasa si necesitamos unir A y B repetidamente 32 veces? ¿No parece un poco estúpido escribir 32 {A,B} repetidamente? Verilog también toma en consideración este escenario y proporciona un uso de empalme de copia, de la siguiente manera:

C = {32{A,B}} ;
等效为
C= {
   
   {A,B},{A,B},......,{A,B}} //共32次

Símbolos de empalme de dos capas, el número fuera del símbolo de empalme interno representa el número de copias; tome {A, B} en su conjunto y repita el empalme 32 veces;

Si se define 32 como parámetro, el código será más intuitivo y fácil de mantener. Cabe señalar que el número de copias aquí debe ser constante y no puede ser un registro/cable variable;
 

parameter    copy_num  = 8'd32 ;

assign C = {copy_num{A,B}};

2. Empalme por turnos

    El empalme de desplazamiento es un método que se utiliza a menudo como registro de desplazamiento;

   Supongamos que los requisitos son los siguientes: para encontrar el segmento de codificación fijo 4'b1011 de la secuencia en serie de entrada, los datos en serie deben convertirse a paralelo. El método de implementación más directo puede ser:

always@(posedge clk)begin
    A[0] <= Din ;
    A[1] <= A[0] ;
    A[2] <= A[1] ;
    A[3] <= A[2] ;
end

No hay problema con escribir de esta manera. Cuando realizo la detección de bordes o el procesamiento de dominios de reloj cruzado, y solo necesito almacenar en caché de 2 a 3 clk, tiendo a usarlo directamente.

Pero cuando el ancho de bits de este registro de desplazamiento es demasiado grande, por ejemplo, más de 10 o más, escribir de esta manera hará que el código se infle. ¿Existe una mejor opción en este momento?

Por supuesto, el empalme por turnos es una mejor opción:

向左移位
always@(posedge clk)begin
    A[3:0] <= {A[2:0],Din};
end
向右移位
always@(posedge clk)begin
    A[3:0] <= {Din,A[3:1]};
end

3. Intercepción de bits

Según el estándar IEEE Verilog, el truncamiento del ancho de bits del vector se divide en selección de bits y selección de bloques.

La interceptación bit a bit puede ser un método más utilizado por la mayoría de las personas, por lo que no entraré en detalles aquí;

A[15:0]
截取高8位:
B = A[15:8]

Aquí nos centramos en el modo Part-Select, como se muestra en la figura anterior:

En otras palabras, el modo de selección parcial tiene dos expresiones clave: base_expr y width_expr; un operador clave +: o -:

En pocas palabras, base_expr es la dirección base, width_expr es el ancho, use "+:" o "-:" para controlar la dirección;

Entre ellos, la dirección base puede ser una variable, pero el ancho debe ser una constante entera positiva.

Debido a esta característica de selección parcial, es muy sencillo dividir una señal de ancho de bits largo en múltiples señales de ancho de bits pequeño, como por ejemplo:

// part-select实现
reg [255:0]  A;
//现需要将A拆分成 16 个 16bit的信号,我们可以这样做
reg [15:0] B[15:0] ;
integer i;
for(i=0;i<=15;i<=i+1)begin
    assign B[i] = A[i*16 +: 16] ; 
end

Si fuera el método tradicional sería así:

// part-select实现
reg [255:0]  A;
//现需要将A拆分成 16 个 16bit的信号,我们可以这样做
reg [15:0] B[15:0] ;

assign B[0] = A[15:0] ;
assign B[1] = A[31:16] ; 
assign B[2] = A[47:32] ; 
....
assign B[15] = A[255:240] ;  

Compare los dos métodos y juzgue por los aspectos del volumen de escritura del código, la legibilidad y la capacidad de mantenimiento.

Además, los circuitos implementados por los dos métodos son exactamente iguales, lo que no significa que el uso de este método "oportunista" aumentará la carga de la implementación del circuito.

Supongo que te gusta

Origin blog.csdn.net/ypcan/article/details/131270127
Recomendado
Clasificación