Unità firmware
PC
module PC(//uscite :
// tutti i beta
bx, by, bq, bor, boq, brdy, back,
// tutti gli alpha
akx, akq,
// ingressi:
rdy, segno, clock);
output bx, by, bq, bor, boq, brdy, back;
output akx, akq;
input rdy, segno, clock;
wire nuovostato;
OmegaPC ompc(bx, by, bq, bor, boq, brdy, back,
akx, akq,
rdy, segno,
stato);
SigmaPC sipc(nuovostato,
stato,
rdy, segno);
registro #(1) s(stato,nuovostato,1'b1,clock);
endmodule
OmegaPC
module OmegaPC(// tutti i beta
bx, by, bq, bor, boq, brdy, back,
// tutti gli alpha
akx, akq,
// gli ingressi dalla PO
rdy, segno,
// stato interno
stato);
output bx, by, bq, bor, boq, brdy, back;
output akx, akq;
input rdy, segno, stato;
assign #2 bx = (rdy & (~stato)) | (~segno & stato);
assign #2 by = (rdy & (~stato));
assign #2 bq = (rdy & (~stato)) | (~segno & stato);
assign #2 bor = (segno & stato);
assign #2 boq = (segno & stato);
assign #2 brdy = (segno & stato);
assign #2 back = (segno & stato);
assign #2 akx = (~segno & stato);
assign #2 akq = (~segno & stato);
endmodule
SigmaPC
module SigmaPC(output sprimo,
input stato,
input rdy,
input segno);
assign #2 sprimo = (~stato & rdy) | (stato & ~segno);
endmodule
PO
module PO(rdy, segno, // uscite verso la PC
// uscite dai registri di interfaccia
lror, lroq, lrack,
// ingressi dalla PC
back, brdy, bx, by, bq, bor, boq, akx, akq,
// ingresso clock
clock,
// ingressi verso i registri di interfaccia
linx, liny, lrdyin
);
parameter N = 32;
output rdy;
output segno;
output [N-1:0] lror;
output [N-1:0] lroq;
output lrack;
input back, brdy, bx, by, bq;
input bor, boq, akx, akq, clock;
input [N-1:0] linx;
input [N-1:0] liny;
input lrdyin;
reg [N-1:0] const0;
initial
begin
const0 = 0;
end
// indicatori a transizione di livello
ack ackout(lrack, back, clock);
rdy rdyin (rdy,lrdyin,brdy,clock);
wire [N-1:0] inx2x;
wire [N-1:0] iny2y;
wire [N-1:0] x2ror;
wire [N-1:0] q2roq;
wire [N-1:0] kx2x;
wire [N-1:0] y2alumeno;
wire [N-1:0] aluinc2q;
wire [N-1:0] rq2roq;
wire [N-1:0] alumeno2kx;
wire [N-1:0] aluinc2kq;
wire [N-1:0] kq2q;
// registri di ingresso
registro #(N) rinx(inx2x,linx,1'b1,clock);
registro #(N) riny(iny2y,liny,1'b1,clock);
// registri in uscita
registro #(N) outr(lror,x2ror,bor,clock);
registro #(N) outq(lroq,rq2roq,boq,clock);
// registri interni
registro #(N) rx(x2ror,kx2x,bx,clock);
registro #(N) ry(y2alumeno,iny2y,by,clock);
registro #(N) rq(rq2roq,kq2q,bq,clock);
// alu
alumeno #(N) alu1(alumeno2kx,segno,x2ror,y2alumeno);
aluinc #(N) alu2(aluinc2kq,rq2roq);
// commutatori
k2 #(N) kkx(kx2x,inx2x,alumeno2kx,akx);
k2 #(N) kkq(kq2q,const0,aluinc2kq,akq);
endmodule
Unità firmware
module UF(lack, lor, loq,
clock,
lrdy,linx,liny);
parameter N = 4;
// output verso il mondo esterno
output lack;
output [N-1:0] lor;
output [N-1:0] loq;
// input dal mondo esterno
input clock;
input lrdy;
input [N-1:0] linx;
input [N-1:0] liny;
// input alla PO dalla PC
wire back, brdy, bx, by, bq, bor, boq;
wire akx, akq;
// input alla PC dalla PO
wire rdy, segno;
PC #(4) partecontrollo(bx, by, bq, bor, boq, brdy, back,
akx, akq,
rdy, segno, clock);
PO #(4) parteoperativa(rdy, segno,
lor, loq, lack,
back, brdy, bx, by, bq, bor, boq,
akx, akq,
clock,
linx, liny, lrdy);
endmodule