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)
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 //模块结束
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
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
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: