A
angjohn
Guest
Følgende kode er skrevet med Verilog:
/ / CU
modul Controlunit (Z, restarte, CMP, opcode, CLK);
output [14:0] Z;
wire [14:0] Z;
input reset;
input CMP;
input [7:0] opcode;
input CLK;/ / intern FSM staten erklæringer, PS = nåværende status, NS = neste tilstand
reg [4:0] PS;
wire [4:0] NS;/ / stat kodinger
parameter S0 = 5'b00000;
parameter S1 = 5'b00001;
parameter S2 = 5'b00010;
parameter S3 = 5'b00011;
parameter S4 = 5'b00100;
parameter S5 = 5'b00101;
parameter S6 = 5'b00110;
parameter S7 = 5'b00111;
parameter S8 = 5'b01000;
parameter S9 = 5'b01001;
parameter S10 = 5'b01010;
parameter S11 = 5'b01011;
parameter S12 = 5'b01100;
parameter S13 = 5'b01101;
parameter S14 = 5'b01110;
parameter S15 = 5'b01111;
parameter S16 = 5'b10000;
parameter S17 = 5'b10001;
parameter S18 = 5'b10010;
parameter S19 = 5'b10011;
wire [1:0] a;
wire [1:0] b;
wire c;
wire d;
wire [3:0] e;
tildele en = opcode [7:6];
tildele b = opcode [5:4];
tildele c = opcode [3];
tildele d = opcode [2];
tildele e = opcode [7:4];/ / combinational logikk
function [19:0] FSM;
input [1:0] fsm_a;
input [1:0] fsm_b;
input fsm_c;
input fsm_d;
input [3:0] fsm_e;
input [4:0] fsm_PS;
input fsm_CMP;
reg [14:0] fsm_Z;
reg [4:0] fsm_NS;
begynne
case (fsm_PS)
S0:
begynne
fsm_NS = S1;
fsm_Z = 15'b010000000000000;
slutt
S1:
begynne
fsm_NS = S2;
fsm_Z = 15'b000000000000000;
slutt
S2:
begynne
fsm_Z = 15'b101000000000000;
if (fsm_a == 2'b00 | fsm_a == 2'b01)
begynne
fsm_NS = S3;
slutt
else if (fsm_a == 2'b10)
begynne
fsm_NS = S10;
slutt
else if (fsm_a == 2'b11)
begynne
fsm_NS = S19;
slutt
slutt
S3:
begynne
fsm_Z = 15'b000000000000000;
case (fsm_e)
4'b0000:
begynne
fsm_NS = S4;
slutt
4'b0001:
begynne
fsm_NS = S5;
slutt
4'b0010:
begynne
fsm_NS = S6;
slutt
4'b0011:
begynne
fsm_NS = S7;
slutt
4'b0100:
begynne
fsm_NS = S8;
slutt
default:
begynne
fsm_NS = S9;
slutt
endcase
slutt
S4:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001000;
slutt
ellers
begynne
fsm_Z = 15'b000000001001000;
slutt
slutt
S5:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001001;
slutt
ellers
begynne
fsm_Z = 15'b000000001100001;
slutt
slutt
S6:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001010;
slutt
ellers
begynne
fsm_Z = 15'b000000001001010;
slutt
slutt
S7:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001011;
slutt
ellers
begynne
fsm_Z = 15'b000000001001011;
slutt
slutt
S8:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010000100;
slutt
ellers
begynne
fsm_Z = 15'b000000001100100;
slutt
slutt
S9:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010000101;
slutt
ellers
begynne
fsm_Z = 15'b000000001100101;
slutt
slutt
S10:
begynne
fsm_Z = 15'b000000000000110;
fsm_NS = S11;
slutt
S11:
begynne
fsm_Z = 15'b001000100000110;
case (fsm_b)
2'b00:
begynne
fsm_NS = S12;
slutt
2'b01:
begynne
fsm_NS = S15;
slutt
2'b10:
begynne
fsm_NS = S17;
slutt
default:
begynne
fsm_NS = S18;
slutt
endcase
slutt
S12:
begynne
hvis fsm_d (== 1'b0)
begynne
fsm_NS = S14;
fsm_Z = 15'b000000000000110;
slutt
ellers
begynne
fsm_Z = 15'b000010000000110;
fsm_NS = S13;
slutt
slutt
S13:
begynne
fsm_NS = S14;
fsm_Z = 15'b000010100000110;
slutt
S14:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010010110;
slutt
ellers
begynne
fsm_Z = 15'b000000001010110;
slutt
slutt
S15:
begynne
fsm_NS = S16;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000011000000110;
slutt
ellers
begynne
fsm_Z = 15'b000011000100110;
slutt
slutt
S16:
begynne
fsm_NS = S1;
fsm_Z = 15'b000010000000110;
slutt
S17:
begynne
fsm_NS = S1;
fsm_Z = 15'b000100000010110;
slutt
S18:
begynne
fsm_NS = S1;
hvis fsm_CMP (== 1'b1)
begynne
fsm_Z = 15'b000100000010110;
slutt
ellers
begynne
fsm_Z = 15'b000000000000000;
slutt
slutt
S19:
begynne
fsm_NS = S1;
fsm_Z = 15'b000000000000000;
slutt
endcase
FSM = (fsm_Z, fsm_NS);
slutt
endfunction/ / revurdere combinational logikken når opcode eller nåværende status endringer
tildele (Z, NS) = FSM (a, b, c, d, e, PS, CMP);/ / klokke staten flip flop
alltid @ (negedge CLK)
begynne
if (reset == 1'b1)
PS = S0;
ellers
PS = NS;
slutt
endmoduleTakk for hjelpen!!
/ / CU
modul Controlunit (Z, restarte, CMP, opcode, CLK);
output [14:0] Z;
wire [14:0] Z;
input reset;
input CMP;
input [7:0] opcode;
input CLK;/ / intern FSM staten erklæringer, PS = nåværende status, NS = neste tilstand
reg [4:0] PS;
wire [4:0] NS;/ / stat kodinger
parameter S0 = 5'b00000;
parameter S1 = 5'b00001;
parameter S2 = 5'b00010;
parameter S3 = 5'b00011;
parameter S4 = 5'b00100;
parameter S5 = 5'b00101;
parameter S6 = 5'b00110;
parameter S7 = 5'b00111;
parameter S8 = 5'b01000;
parameter S9 = 5'b01001;
parameter S10 = 5'b01010;
parameter S11 = 5'b01011;
parameter S12 = 5'b01100;
parameter S13 = 5'b01101;
parameter S14 = 5'b01110;
parameter S15 = 5'b01111;
parameter S16 = 5'b10000;
parameter S17 = 5'b10001;
parameter S18 = 5'b10010;
parameter S19 = 5'b10011;
wire [1:0] a;
wire [1:0] b;
wire c;
wire d;
wire [3:0] e;
tildele en = opcode [7:6];
tildele b = opcode [5:4];
tildele c = opcode [3];
tildele d = opcode [2];
tildele e = opcode [7:4];/ / combinational logikk
function [19:0] FSM;
input [1:0] fsm_a;
input [1:0] fsm_b;
input fsm_c;
input fsm_d;
input [3:0] fsm_e;
input [4:0] fsm_PS;
input fsm_CMP;
reg [14:0] fsm_Z;
reg [4:0] fsm_NS;
begynne
case (fsm_PS)
S0:
begynne
fsm_NS = S1;
fsm_Z = 15'b010000000000000;
slutt
S1:
begynne
fsm_NS = S2;
fsm_Z = 15'b000000000000000;
slutt
S2:
begynne
fsm_Z = 15'b101000000000000;
if (fsm_a == 2'b00 | fsm_a == 2'b01)
begynne
fsm_NS = S3;
slutt
else if (fsm_a == 2'b10)
begynne
fsm_NS = S10;
slutt
else if (fsm_a == 2'b11)
begynne
fsm_NS = S19;
slutt
slutt
S3:
begynne
fsm_Z = 15'b000000000000000;
case (fsm_e)
4'b0000:
begynne
fsm_NS = S4;
slutt
4'b0001:
begynne
fsm_NS = S5;
slutt
4'b0010:
begynne
fsm_NS = S6;
slutt
4'b0011:
begynne
fsm_NS = S7;
slutt
4'b0100:
begynne
fsm_NS = S8;
slutt
default:
begynne
fsm_NS = S9;
slutt
endcase
slutt
S4:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001000;
slutt
ellers
begynne
fsm_Z = 15'b000000001001000;
slutt
slutt
S5:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001001;
slutt
ellers
begynne
fsm_Z = 15'b000000001100001;
slutt
slutt
S6:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001010;
slutt
ellers
begynne
fsm_Z = 15'b000000001001010;
slutt
slutt
S7:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010001011;
slutt
ellers
begynne
fsm_Z = 15'b000000001001011;
slutt
slutt
S8:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010000100;
slutt
ellers
begynne
fsm_Z = 15'b000000001100100;
slutt
slutt
S9:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010000101;
slutt
ellers
begynne
fsm_Z = 15'b000000001100101;
slutt
slutt
S10:
begynne
fsm_Z = 15'b000000000000110;
fsm_NS = S11;
slutt
S11:
begynne
fsm_Z = 15'b001000100000110;
case (fsm_b)
2'b00:
begynne
fsm_NS = S12;
slutt
2'b01:
begynne
fsm_NS = S15;
slutt
2'b10:
begynne
fsm_NS = S17;
slutt
default:
begynne
fsm_NS = S18;
slutt
endcase
slutt
S12:
begynne
hvis fsm_d (== 1'b0)
begynne
fsm_NS = S14;
fsm_Z = 15'b000000000000110;
slutt
ellers
begynne
fsm_Z = 15'b000010000000110;
fsm_NS = S13;
slutt
slutt
S13:
begynne
fsm_NS = S14;
fsm_Z = 15'b000010100000110;
slutt
S14:
begynne
fsm_NS = S1;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000000010010110;
slutt
ellers
begynne
fsm_Z = 15'b000000001010110;
slutt
slutt
S15:
begynne
fsm_NS = S16;
if (fsm_c == 1'b0)
begynne
fsm_Z = 15'b000011000000110;
slutt
ellers
begynne
fsm_Z = 15'b000011000100110;
slutt
slutt
S16:
begynne
fsm_NS = S1;
fsm_Z = 15'b000010000000110;
slutt
S17:
begynne
fsm_NS = S1;
fsm_Z = 15'b000100000010110;
slutt
S18:
begynne
fsm_NS = S1;
hvis fsm_CMP (== 1'b1)
begynne
fsm_Z = 15'b000100000010110;
slutt
ellers
begynne
fsm_Z = 15'b000000000000000;
slutt
slutt
S19:
begynne
fsm_NS = S1;
fsm_Z = 15'b000000000000000;
slutt
endcase
FSM = (fsm_Z, fsm_NS);
slutt
endfunction/ / revurdere combinational logikken når opcode eller nåværende status endringer
tildele (Z, NS) = FSM (a, b, c, d, e, PS, CMP);/ / klokke staten flip flop
alltid @ (negedge CLK)
begynne
if (reset == 1'b1)
PS = S0;
ellers
PS = NS;
slutt
endmoduleTakk for hjelpen!!