Beruflich Dokumente
Kultur Dokumente
Remainder
(Quotient)
64 bits
Datapath Unit
Shift Left
Control
Write
Control Unit
10
Division Algorithm
Step
0
1.1
1.2
1.3b
2.2
2.3b
3.2
3.3a
4.2
4.3a
Remainder
0000 0111
0000 1110
1110 1110
0001 1100
1111 1100
0011 1000
0001 1000
0011 0001
0001 0001
0010 0011
0001 0011
Div.
0010
3a. Shift
Remainder to left,
setting new
rightmost bit to 1
Remainder < 0
Test
Remainder
32nd
repetition?
Yes: 32 repetitions
Done. Shift left half of Remainder right 1 bit
11
12
else begin
case ({Q[0], Q_1})
2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q};
2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q};
default: {A, Q, Q_1} <= {A[7], A, Q};
endcase
count <= count + 1'b1;
Instantiate an adder for addition
end
a subtractor for subtraction
end
This is not an acceptable design
alu adder (sum, A, M, 1'b0);
alu subtracter (difference, A, ~M, 1'b1);
assign prod = {A, Q};
assign busy = (count < 8);
We want a datapath
endmodule
and a control unit to
perform signed multiplication
module alu(out, a, b, cin);
based on Booths algorithm.
output [7:0] out;
input [7:0] a;
The same data path can be
input [7:0] b;
used for division by changing
input cin;
the control unit
assign out = a + b + cin;
endmodule
13
14
15
else
case (state)
S1: if (Enter) begin
if (Equal) state = S2;
else state = ERR;
end
else state = S1;
S2: if (Enter) begin
if (Equal) state = S3;
else state = ERR;
end
else state = S2;
S3: if (Enter) begin
if (Equal) state = OPEN;
else state = ERR;
end
else state = S3;
OPEN: state = OPEN;
ERR: state = ERR;
endcase
end
endmodule
16
D1 D2 D3 D4 D5 D6 D7 D8
Encoded Data:
H1 H2 D1 H4 D2 D3 D4 H8 D5 D6 D7 D8
18
19
20
assign outVector = {m3, m5, m6, m7, m9, m10, m11, m12};
endmodule
21
module testHam();
reg [1:8] original;
wire [1:8] regenerated;
wire [1:12] encoded, messedUp;
integer seed;
initial begin
seed = 1;
forever begin
original = $random (seed);
#1
$display ("original=%h, encoded=%h, messed=%h, regen=%h",
original, encoded, messedUp, regenerated);
end
end
hamEncode hIn (original, encoded);
hamDecode hOut (messedUp, regenerated);
assign messedUp = encoded ^ 12'b 0000_0010_0000;
endmodule
22
Ready: sim
original=00, encoded=000, messed=020,
original=38, encoded=078, messed=058,
original=86, encoded=606, messed=626,
original=5c, encoded=8ac, messed=88c,
original=ce, encoded=79e, messed=7be,
original=c7, encoded=e97, messed=eb7,
original=c6, encoded=f86, messed=fa6,
original=f3, encoded=2e3, messed=2c3,
original=c3, encoded=a83, messed=aa3,
original=5f, encoded=5af, messed=58f,
original=47, encoded=097, messed=0b7,
original=89, encoded=709, messed=729,
original=7e, encoded=1fe, messed=1de,
original=45, encoded=c85, messed=ca5,
original=5d, encoded=9bd, messed=99d,
original=91, encoded=231, messed=211,
original=6e, encoded=cde, messed=cfe,
original=8f, encoded=f0f, messed=f2f,
original=3c, encoded=46c, messed=44c,
regen=00
regen=38
regen=86
regen=5c
regen=ce
regen=c7
regen=c6
regen=f3
regen=c3
regen=5f
regen=47
regen=89
regen=7e
regen=45
regen=5d
regen=91
regen=6e
regen=8f
regen=3c
23
I[1:0]
00
xx
Description
dog wag
dog barks x times
01
01
00
xx
cat wag
cat meows x times
10
xx
11
11
xx
00
24
module petshop;
event GO;
//Opens the petshop.
parameter
mem_size = 'h0400; //1K of memory
parameter
PC_init = 'h0000;
//Start executing at 0x0000
reg[3:0] M [0:mem_size-1];
reg[7:0] PC;
reg[3:0] I;
reg[3:0] x;
25
26
2:
case(`arg)
0: $display("The lizard turns brown.");
1: $display("The lizard turns red.");
2: $display("The lizard turns green.");
3: $display("The lizard turns yellow.");
endcase
3: case(`arg)
0: begin
$display("the pet shop is now closing.");
$finish;
end
1: $display ("One!");
2: $display ("Two!");
3: $display ("Three!");
endcase
endcase
end
end
endmodule
27
module start;
initial
begin
//$readmemh("petmem", petshop.M);
//$readmemh is not avaiable in Silos Evaluation copy
petshop.M['h0] = 4'b0000;
petshop.M['h1] = 4'b0011;
petshop.M['h2] = 4'b0101;
petshop.M['h3] = 4'b1111;
petshop.M['h4] = 4'b1111;
File:petmem
petshop.M['h5] = 4'b1101;
@0
petshop.M['h6] = 4'b0100;
@1
petshop.M['h7] = 4'b1010;
@2
petshop.M['h8] = 4'b1000;
@3
petshop.M['h9] = 4'b1110;
@4
petshop.M['hA] = 4'b1100;
@5
-> petshop.GO;
@6
end
@7
@8
endmodule
@9
@A
0
3
5
F
F
D
4
A
8
E
C
28
29