==== Cvičení 2 ====
neručím za správnost, pokud mě doplní, kdo si je jistější budu rád:
=== 1. ===
module KonecnyAutomat(input x, clk, reset,
output [2:0] y);
reg [2:0] state, nextstate;
parameter S0 = 3'b000;
parameter S1 = 3'b001;
parameter S2 = 3'b010;
parameter S3 = 3'b011;
parameter S4 = 3'b100;
always @ (posedge clk, posedge reset)
if (reset) state = S0;
else state = nextstate;
always @(*)
case (state)
S0: if (x) nextstate = S4;
else nextstate = S1;
S1: if (x) nextstate = S0;
else nextstate = S2;
S2: if (x) nextstate = S1;
else nextstate = S3;
S3: if (x) nextstate = S2;
else nextstate = S4;
S4: if (x) nextstate = S3;
else nextstate = S0;
default: nextstate = S0;
endcase
assign y = state;
endmodule
=== 4. ===
module mux2x1(in0, in1, select, out);
input [31:0] in0;
input [31:0] in1;
input select;
output [31:0] out;
assign out = select ? in1 : in0;
endmodule
module mux3x1(in0, in1, in2, select, out);
input [31:0] in0;
input [31:0] in1;
input [31:0] in2;
input [1:0] select;
output [31:0] out;
case (select)
2'b00: assign out = in0;
2'b01: assign out = in1;
2'b10: assign out = in2;
default: assign out = in0;
endcase
endmodule
module sumator(a, b, suma);
input [31:0] a;
input [31:0] b;
output [31:0] suma;
assign suma = a+b;
endmodule
module mul4(in, out);
input [31:0] in;
output [31:0] out;
assign out = 4*in;
endmodule
module compare(a, b, out);
input [31:0] a;
input [31:0] b;
output out;
assign out = (a == b) ? 1 : 0;
endmodule
module extend(
input [15:0] in,
output [31:0] out
);
assign out = { {16{in[15]}}, in };
endmodule
module registr(
input [31:0] in,
input enable,
input reset,
input clk,
output [31:0] out
);
reg [31:0] data = 0;
always @ (posedge clk, posedge reset)
if (reset) data = 0;
else if (enable) data = in;
assign out = data;
endmodule
module pole(
input [4:0] addr0,
input [4:0] addr1,
input [4:0] addr2,
input [31:0] in,
input enable,
input clk,
output [31:0] out0,
output [31:0] out1
);
reg[31:0] regs[0:31];
reg [5:0] i;
initial begin
for (i=0;i<=31;i=i+1) regs[i] = 0; //initialize registers--just so they aren?t cares
end
always @ (posedge clk)
if (enable && addr2 > 0) regs[addr2] = in;
assign out0 = regs[addr0];
assign out1 = regs[addr1];
endmodule
module alu(
input [31:0] srcA,
input [31:0] srcB,
input [2:0] ALUcontrol,
output [31:0] ALUout,
output zero
);
reg[31:0] out=0;
always @(*)
case (ALUcontrol)
3'b010: out = srcA + srcB;
3'b110: out = srcA - srcB;
3'b000: out = srcA & srcB;
3'b001: out = srcA | srcB;
3'b011: out = srcA ^ srcB;
3'b111: out = (srcA < srcB) ? 1 : 0;
default: out = 0;
endcase
assign ALUout = out;
assign zero = (out==0) ? 1 : 0;
endmodule
~~DISCUSSION~~