A
angjohn
Guest
šis kodas yra parašytas naudojant Verilog:
/ / CU
modulis Controlunit (Z, atstatyti, CMP, kodas operacijos, CLK);
išvesties [14:0] Z;
viela [14:0] Z;
sąnaudų iš naujo;
įvesties SS;
įvedimo [7:0] kodas operacijos;
įvesties CLK;/ / vidaus FMV valstybės pareiškimus, PS = Dabartinė būklė, N = šalia valstybės
reg [4:0] PS;
viela [4:0] N;/ / Valstybės kodavimas
parametras S0 = 5'b00000;
parametras S1 = 5'b00001;
parametras S2 = 5'b00010;
parametras P3 = 5'b00011;
parametras P4 = 5'b00100;
parametras P5 = 5'b00101;
parametras S6 = 5'b00110;
parametras S7 = 5'b00111;
parametras P8 = 5'b01000;
parametras P9 = 5'b01001;
parametras P10 = 5'b01010;
parametras S11 = 5'b01011;
parametras S12 = 5'b01100;
parametras S13 = 5'b01101;
parametras S14 = 5'b01110;
parametras S15 = 5'b01111;
parametras S16 = 5'b10000;
parametras S17 = 5'b10001;
parametras S18 = 5'b10010;
parametras S19 = 5'b10011;
viela [1:0] a;
viela [1:0] B;
viela c;
viela d;
viela [3:0] e;
priskirti = kodas operacijos [7:6];
priskirti b = kodas operacijos [5:4];
priskirti c = kodas operacijos [3];
skirti d = kodas operacijos [2];
priskirti e = kodas operacijos [7:4];/ / įvairių logika
funkcija [19:0] FMV;
įvedimo [1:0] fsm_a;
įvedimo [1:0] fsm_b;
įvesties fsm_c;
įvesties fsm_d;
įvedimo [3:0] fsm_e;
įvedimo [4:0] fsm_PS;
įvesties fsm_CMP;
reg [14:0] fsm_Z;
reg [4:0] fsm_NS;
pradėti
atveju (fsm_PS)
S0:
pradėti
fsm_NS = s1;
fsm_Z = 15'b010000000000000;
pabaiga
S1:
pradėti
fsm_NS = S2;
fsm_Z = 15'b000000000000000;
pabaiga
S2:
pradėti
fsm_Z = 15'b101000000000000;
jei (fsm_a == 2'b00 | fsm_a == 2'b01)
pradėti
fsm_NS = P3;
pabaiga
else if (fsm_a == 2'b10)
pradėti
fsm_NS = P10;
pabaiga
else if (fsm_a == 2'b11)
pradėti
fsm_NS = S19;
pabaiga
pabaiga
S3:
pradėti
fsm_Z = 15'b000000000000000;
atveju (fsm_e)
4'b0000:
pradėti
fsm_NS = S4;
pabaiga
4'b0001:
pradėti
fsm_NS = P5;
pabaiga
4'b0010:
pradėti
fsm_NS = P6;
pabaiga
4'b0011:
pradėti
fsm_NS = S7;
pabaiga
4'b0100:
pradėti
fsm_NS = P8;
pabaiga
Numatyta:
pradėti
fsm_NS = P9;
pabaiga
endcase
pabaiga
S4:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001000;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001000;
pabaiga
pabaiga
S5:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001001;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100001;
pabaiga
pabaiga
P6:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001010;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001010;
pabaiga
pabaiga
P7:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001011;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001011;
pabaiga
pabaiga
P8:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010000100;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100100;
pabaiga
pabaiga
P9:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010000101;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100101;
pabaiga
pabaiga
P10:
pradėti
fsm_Z = 15'b000000000000110;
fsm_NS = S11;
pabaiga
S11:
pradėti
fsm_Z = 15'b001000100000110;
atveju (fsm_b)
2'b00:
pradėti
fsm_NS = S12;
pabaiga
2'b01:
pradėti
fsm_NS = S15;
pabaiga
2'b10:
pradėti
fsm_NS = S17;
pabaiga
Numatyta:
pradėti
fsm_NS = S18;
pabaiga
endcase
pabaiga
S12:
pradėti
jei (fsm_d == 1'b0)
pradėti
fsm_NS = S14;
fsm_Z = 15'b000000000000110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000010000000110;
fsm_NS = S13;
pabaiga
pabaiga
S13:
pradėti
fsm_NS = S14;
fsm_Z = 15'b000010100000110;
pabaiga
S14:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010010110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001010110;
pabaiga
pabaiga
S15:
pradėti
fsm_NS = S16;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000011000000110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000011000100110;
pabaiga
pabaiga
S16:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000010000000110;
pabaiga
S17:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000100000010110;
pabaiga
S18:
pradėti
fsm_NS = s1;
jei (fsm_CMP == 1'b1)
pradėti
fsm_Z = 15'b000100000010110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000000000000;
pabaiga
pabaiga
S19:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000000000000000;
pabaiga
endcase
FMV = (fsm_Z, fsm_NS);
pabaiga
endfunction/ / reevaluate įvairių logika kai kodas operacijos arba Dabartinė būklė pakeitimai
priskirti (Z, NS) = FMV (a, b, c, d, e, PS, SS);/ / clock valstybės flip flop
visada @ (negedge CLK)
pradėti
jei (naujo == 1'b1)
PS = S0;
kitas
PS = N;
pabaiga
endmoduleačiū už pagalbą!
/ / CU
modulis Controlunit (Z, atstatyti, CMP, kodas operacijos, CLK);
išvesties [14:0] Z;
viela [14:0] Z;
sąnaudų iš naujo;
įvesties SS;
įvedimo [7:0] kodas operacijos;
įvesties CLK;/ / vidaus FMV valstybės pareiškimus, PS = Dabartinė būklė, N = šalia valstybės
reg [4:0] PS;
viela [4:0] N;/ / Valstybės kodavimas
parametras S0 = 5'b00000;
parametras S1 = 5'b00001;
parametras S2 = 5'b00010;
parametras P3 = 5'b00011;
parametras P4 = 5'b00100;
parametras P5 = 5'b00101;
parametras S6 = 5'b00110;
parametras S7 = 5'b00111;
parametras P8 = 5'b01000;
parametras P9 = 5'b01001;
parametras P10 = 5'b01010;
parametras S11 = 5'b01011;
parametras S12 = 5'b01100;
parametras S13 = 5'b01101;
parametras S14 = 5'b01110;
parametras S15 = 5'b01111;
parametras S16 = 5'b10000;
parametras S17 = 5'b10001;
parametras S18 = 5'b10010;
parametras S19 = 5'b10011;
viela [1:0] a;
viela [1:0] B;
viela c;
viela d;
viela [3:0] e;
priskirti = kodas operacijos [7:6];
priskirti b = kodas operacijos [5:4];
priskirti c = kodas operacijos [3];
skirti d = kodas operacijos [2];
priskirti e = kodas operacijos [7:4];/ / įvairių logika
funkcija [19:0] FMV;
įvedimo [1:0] fsm_a;
įvedimo [1:0] fsm_b;
įvesties fsm_c;
įvesties fsm_d;
įvedimo [3:0] fsm_e;
įvedimo [4:0] fsm_PS;
įvesties fsm_CMP;
reg [14:0] fsm_Z;
reg [4:0] fsm_NS;
pradėti
atveju (fsm_PS)
S0:
pradėti
fsm_NS = s1;
fsm_Z = 15'b010000000000000;
pabaiga
S1:
pradėti
fsm_NS = S2;
fsm_Z = 15'b000000000000000;
pabaiga
S2:
pradėti
fsm_Z = 15'b101000000000000;
jei (fsm_a == 2'b00 | fsm_a == 2'b01)
pradėti
fsm_NS = P3;
pabaiga
else if (fsm_a == 2'b10)
pradėti
fsm_NS = P10;
pabaiga
else if (fsm_a == 2'b11)
pradėti
fsm_NS = S19;
pabaiga
pabaiga
S3:
pradėti
fsm_Z = 15'b000000000000000;
atveju (fsm_e)
4'b0000:
pradėti
fsm_NS = S4;
pabaiga
4'b0001:
pradėti
fsm_NS = P5;
pabaiga
4'b0010:
pradėti
fsm_NS = P6;
pabaiga
4'b0011:
pradėti
fsm_NS = S7;
pabaiga
4'b0100:
pradėti
fsm_NS = P8;
pabaiga
Numatyta:
pradėti
fsm_NS = P9;
pabaiga
endcase
pabaiga
S4:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001000;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001000;
pabaiga
pabaiga
S5:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001001;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100001;
pabaiga
pabaiga
P6:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001010;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001010;
pabaiga
pabaiga
P7:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010001011;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001001011;
pabaiga
pabaiga
P8:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010000100;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100100;
pabaiga
pabaiga
P9:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010000101;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001100101;
pabaiga
pabaiga
P10:
pradėti
fsm_Z = 15'b000000000000110;
fsm_NS = S11;
pabaiga
S11:
pradėti
fsm_Z = 15'b001000100000110;
atveju (fsm_b)
2'b00:
pradėti
fsm_NS = S12;
pabaiga
2'b01:
pradėti
fsm_NS = S15;
pabaiga
2'b10:
pradėti
fsm_NS = S17;
pabaiga
Numatyta:
pradėti
fsm_NS = S18;
pabaiga
endcase
pabaiga
S12:
pradėti
jei (fsm_d == 1'b0)
pradėti
fsm_NS = S14;
fsm_Z = 15'b000000000000110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000010000000110;
fsm_NS = S13;
pabaiga
pabaiga
S13:
pradėti
fsm_NS = S14;
fsm_Z = 15'b000010100000110;
pabaiga
S14:
pradėti
fsm_NS = s1;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000000010010110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000001010110;
pabaiga
pabaiga
S15:
pradėti
fsm_NS = S16;
jei (fsm_c == 1'b0)
pradėti
fsm_Z = 15'b000011000000110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000011000100110;
pabaiga
pabaiga
S16:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000010000000110;
pabaiga
S17:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000100000010110;
pabaiga
S18:
pradėti
fsm_NS = s1;
jei (fsm_CMP == 1'b1)
pradėti
fsm_Z = 15'b000100000010110;
pabaiga
kitas
pradėti
fsm_Z = 15'b000000000000000;
pabaiga
pabaiga
S19:
pradėti
fsm_NS = s1;
fsm_Z = 15'b000000000000000;
pabaiga
endcase
FMV = (fsm_Z, fsm_NS);
pabaiga
endfunction/ / reevaluate įvairių logika kai kodas operacijos arba Dabartinė būklė pakeitimai
priskirti (Z, NS) = FMV (a, b, c, d, e, PS, SS);/ / clock valstybės flip flop
visada @ (negedge CLK)
pradėti
jei (naujo == 1'b1)
PS = S0;
kitas
PS = N;
pabaiga
endmoduleačiū už pagalbą!