Diseño de multiplicador de hardware EDA (Quartus II) -8 bits

Objetivo:

1. Aprenda a diseñar un multiplicador de 8 bits aplicando el principio de desplazamiento y suma.

2. Comprender las ventajas del principio de cambio y suma para formar un multiplicador y el circuito con la misma función diseñado directamente con un circuito lógico combinacional.

Método de diseño:

Método 1: (Use el signo de multiplicación para lograr la multiplicación)

module chengfaqi(a,b,dout);
input [7:0] a,b;
output [15:0] dout;
assign dout=a*b;
endmodule

Forma de onda de simulación:

Método 2: (La multiplicación se logra cambiando y sumando)

module cfq_ywxj_1(a,b,dout);
input[7:0] a,b;
output reg[15:0] dout;
reg[7:0] a_buf,b_buf;
reg[3:0] i;
always@(*)
begin
	a_buf<=a;
	b_buf<=b;
	dout=0;
	for(i=0;i<8;i=i+1)
	if(a_buf[i]) dout=dout+(b_buf<<i);//移位相加逻辑
end
endmodule

Forma de onda de simulación:

Experimente el contenido

Cuerpo principal (cambio y adición, circuito secuencial)

Diagrama esquemático lógico del multiplicador de 8 bits
Forma de onda de simulación del multiplicador de adición de bits de 8 cambios

explique

La multiplicación se puede realizar mediante el principio de cambio y suma artículo por artículo. Por ejemplo, el primer método es un multiplicador de tipo suma de desplazamiento de 8 bits basado en la estructura de tiempo. Comenzando desde el bit más bajo del multiplicando, si es 1, el multiplicador se desplaza hacia la izquierda y se suma a la suma anterior; si es 0, se suma a todos los ceros después de desplazarse hacia la izquierda hasta el bit más alto del multiplicando. El principio de funcionamiento de este multiplicador puede verse claramente en el diagrama de circuito lógico mostrado en la figura 1 y el diagrama de tiempo de la operación de multiplicación. Para comprender mejor su principio de funcionamiento, no se agrega ningún circuito de control en la Figura 1. En el diagrama de forma de onda de tiempo de desplazamiento, el flanco ascendente de la señal LD ​​tiene dos funciones, es decir, el módulo sreg16 se borra a 0 y el multiplicando A [7..0] se carga en el registro de desplazamiento shift8; su nivel bajo es se utiliza como señal de habilitación de multiplicación. CLK es la señal de reloj. Después de que el multiplicando se carga en el registro de desplazamiento a la derecha de 8 bits shift8, con cada latido del reloj, el bit más bajo está en el frente, y se desplaza del bit bajo al bit alto uno por uno . Cuando es 1, se enciende el multiplicador de 1 bit y el multiplicador de 8 bits B [7..0] ingresa al sumador de 8 bits en el mismo tiempo, y se agrega a los 8 bits superiores bloqueados en sreg16. la última vez, y la suma está en la próxima. El flanco ascendente del tic del reloj se bloquea en este pestillo. Y cuando el bit desplazado del multiplicando es 0, el addarith es toda la salida 0. De manera recíproca, hasta después de 8 pulsos de reloj, el producto final aparece completamente en el puerto sreg16.

Diseño de multiplicador de 1 bit

Razón de diseño: cada bit de A debe multiplicarse por cada bit de B
 (1) Después de 7 ciclos de reloj, el registro de desplazamiento de 8 bits genera en serie cada bit de A, de menor a mayor secuencialmente

 always@(posedge clk or posedge load)
        begin
            if(load) reg8<=A;

          else reg8[6:0]<=reg8[7:1];
        end
        assign qb=reg8[0];

(2) Un bit de A y cada bit de B se multiplican, usando una instrucción de bucle for

para (i = 0; i <= 7; i = i + 4'b1) dout
           [i] <= B [i] & abin;

Implicando conocimiento gramatical: declaración de bucle (para declaración)

El formato de sintaxis de la instrucción for:

    para ( expresión inicial de fijación del valor; condición expresión control; control variable expresión de valor añadido)
         comienzan
          bucle estructura declaración cuerpo;
         extremo

Si el valor de "variable de control de la expresión de valor añadido" no cambia con el bucle, o el número de bucles es demasiado grande, para síntesis Todo conducirá a fallas en el diseño.

 3) Cambiar y agregar

(1) Registro de desplazamiento de 16 bits El bit alto se desplaza a la izquierda a su vez significa que el bit bajo se desplaza al bit alto a la derecha sucesivamente

     En comparación con el producto de A [i] * B, el producto de A [i-1] * B se desplaza un bit hacia la derecha.
             reg16 [6: 0] <= reg16 [7: 1];
             q [15: 7] <= d [8: 0]

(2) sumador binario de 8 bits

    A [i-1] * B + A [i] * B
         (Para A [i-1] * B, mueva 1 bit a la derecha y agregue A [i] * B)
            d [8: 0] <= q [ 15: 8] + B [7: 0]

Cada parte del módulo:

1) registro de desplazamiento de 8 bits

module shift8(clk,load,A,qb);			//8位移位寄存器
input clk,load;							//输入时钟、载路信号
input[7:0] A;								//输入8位二进制数值A
output qb;									//输出
reg[7:0] reg8;								//8位二进制寄存器
always@(posedge clk or posedge load)//	检测敏感信号,时钟信号上升沿或载路信号上升沿
begin
	if(load) reg8<=A;						//如果载路信号为1,则将A值赋给寄存器reg8
	else reg8[6:0]<=reg8[7:1];			//否则,将reg8中的数据向右移一位
end
assign qb=reg8[0];						//将寄存器中的最低位,赋给qb进行输出
endmodule									//模块结束
	
Forma de onda de simulación

2) multiplicador de 1 bit

module andarith(abin,B,dout);//1位乘法器,与门
input abin;
input[7:0] B;
output reg[7:0] dout;
reg[3:0] i;
always@(*)
begin
	for(i=0;i<=7;i=i+4'b1)
	dout[i]<=B[i]&abin;
end
endmodule
Forma de onda de simulación

3) sumador de 8 bits

module adder8(cin,A,B,S,cout);//8位加法器
input cin;
input[7:0] A,B;
output[7:0] S;
output cout;
assign {cout,S}=cin+A+B;
endmodule
Forma de onda de simulación

4) registro de desplazamiento de 16 bits

 

module sreg16(clk,clr,d,q);			//16位移位寄存器
input clk,clr;								//输入时钟和复位信号
input[8:0] d;								//输出9位二进制数值
output[15:0] q;							//输出16位二进制数值
reg[15:0] reg16;							//16位二进制寄存器
always@(posedge clk or posedge clr) //时钟和复位信号的上升沿有效
begin 
	if(clr)  reg16<=16'b0;				//如果复位信号为1,则将寄存器内容全部清零
	else 
	begin reg16[6:0]<=reg16[7:1];		//否则,向右移1位
			reg16[15:7]<=d;				//将输入的值,赋给寄存器的高9位
	end
end
assign q=reg16;							//输出寄存器中的值
endmodule									//模块结束			
	

Cavar:

5) controlador

 

module arictl(clk,start,ariend,clkout,rstall,cnt4);
input clk,start;
output reg ariend,clkout;
output rstall;
output reg[3:0] cnt4;
always@(posedge clk or posedge start)
begin 
		if(start) cnt4<=4'b0;
		else if(cnt4<4'b1000) cnt4<=cnt4+4'b1;
end
always@(*)
begin 
	if(~start)
		if((cnt4<4'b1000)&(cnt4>=4'b0001)) begin clkout<=clk;ariend<=1'b0;end
		else if(cnt4==4'b0000) begin clkout<=1'b0;ariend<=1'b0;end
		else begin clkout<=1'b1;ariend<=1'b1;end
		else begin clkout<=1'b0;ariend<=1'b0;end
end
assign rstall=start;
endmodule

Resumen y análisis:

 

 

Supongo que te gusta

Origin blog.csdn.net/XZ_ROU/article/details/114133712
Recomendado
Clasificación