diff --git a/ws2009/math I/exercise/uebung01.pdf b/ws2009/math I/exercise/uebung01.pdf new file mode 100644 index 00000000..e1d88f2c Binary files /dev/null and b/ws2009/math I/exercise/uebung01.pdf differ diff --git a/ws2009/math I/exercise/uebung01L.pdf b/ws2009/math I/exercise/uebung01L.pdf new file mode 100644 index 00000000..d6c4b6f9 Binary files /dev/null and b/ws2009/math I/exercise/uebung01L.pdf differ diff --git a/ws2009/math I/exercise/uebung02.pdf b/ws2009/math I/exercise/uebung02.pdf new file mode 100644 index 00000000..e85df406 Binary files /dev/null and b/ws2009/math I/exercise/uebung02.pdf differ diff --git a/ws2009/math I/exercise/uebung02L.pdf b/ws2009/math I/exercise/uebung02L.pdf new file mode 100644 index 00000000..46a1d98e Binary files /dev/null and b/ws2009/math I/exercise/uebung02L.pdf differ diff --git a/ws2009/math I/exercise/uebung03.pdf b/ws2009/math I/exercise/uebung03.pdf new file mode 100644 index 00000000..db4afe8f Binary files /dev/null and b/ws2009/math I/exercise/uebung03.pdf differ diff --git a/ws2009/math I/exercise/uebung03L.pdf b/ws2009/math I/exercise/uebung03L.pdf new file mode 100644 index 00000000..2b28ee09 Binary files /dev/null and b/ws2009/math I/exercise/uebung03L.pdf differ diff --git a/ws2009/math I/exercise/uebung04.pdf b/ws2009/math I/exercise/uebung04.pdf new file mode 100644 index 00000000..bafbf47b Binary files /dev/null and b/ws2009/math I/exercise/uebung04.pdf differ diff --git a/ws2009/math I/exercise/uebung04L.pdf b/ws2009/math I/exercise/uebung04L.pdf new file mode 100644 index 00000000..8f09b804 Binary files /dev/null and b/ws2009/math I/exercise/uebung04L.pdf differ diff --git a/ws2009/math I/exercise/uebung05.pdf b/ws2009/math I/exercise/uebung05.pdf new file mode 100644 index 00000000..bfb0292e Binary files /dev/null and b/ws2009/math I/exercise/uebung05.pdf differ diff --git a/ws2009/math I/exercise/uebung05L.pdf b/ws2009/math I/exercise/uebung05L.pdf new file mode 100644 index 00000000..382b0ee6 Binary files /dev/null and b/ws2009/math I/exercise/uebung05L.pdf differ diff --git a/ws2009/math I/exercise/uebung06.pdf b/ws2009/math I/exercise/uebung06.pdf new file mode 100644 index 00000000..b7e32adf Binary files /dev/null and b/ws2009/math I/exercise/uebung06.pdf differ diff --git a/ws2009/math I/exercise/uebung06L.pdf b/ws2009/math I/exercise/uebung06L.pdf new file mode 100644 index 00000000..a021e197 Binary files /dev/null and b/ws2009/math I/exercise/uebung06L.pdf differ diff --git a/ws2009/math I/exercise/uebung07.pdf b/ws2009/math I/exercise/uebung07.pdf new file mode 100644 index 00000000..02b87cf1 Binary files /dev/null and b/ws2009/math I/exercise/uebung07.pdf differ diff --git a/ws2009/math I/exercise/uebung07L.pdf b/ws2009/math I/exercise/uebung07L.pdf new file mode 100644 index 00000000..37233f4c Binary files /dev/null and b/ws2009/math I/exercise/uebung07L.pdf differ diff --git a/ws2009/math I/exercise/uebung08.pdf b/ws2009/math I/exercise/uebung08.pdf new file mode 100644 index 00000000..1de9c499 Binary files /dev/null and b/ws2009/math I/exercise/uebung08.pdf differ diff --git a/ws2009/math I/exercise/uebung08L.pdf b/ws2009/math I/exercise/uebung08L.pdf new file mode 100644 index 00000000..9e89f4ca Binary files /dev/null and b/ws2009/math I/exercise/uebung08L.pdf differ diff --git a/ws2009/math I/exercise/uebung09.pdf b/ws2009/math I/exercise/uebung09.pdf new file mode 100644 index 00000000..47a4dea0 Binary files /dev/null and b/ws2009/math I/exercise/uebung09.pdf differ diff --git a/ws2009/math I/exercise/uebung09L.pdf b/ws2009/math I/exercise/uebung09L.pdf new file mode 100644 index 00000000..6f2d40f0 Binary files /dev/null and b/ws2009/math I/exercise/uebung09L.pdf differ diff --git a/ws2009/math I/exercise/uebung10.pdf b/ws2009/math I/exercise/uebung10.pdf new file mode 100644 index 00000000..43155094 Binary files /dev/null and b/ws2009/math I/exercise/uebung10.pdf differ diff --git a/ws2009/math I/exercise/uebung10L.pdf b/ws2009/math I/exercise/uebung10L.pdf new file mode 100644 index 00000000..03f42267 Binary files /dev/null and b/ws2009/math I/exercise/uebung10L.pdf differ diff --git a/ws2009/math I/exercise/uebung11.pdf b/ws2009/math I/exercise/uebung11.pdf new file mode 100644 index 00000000..8595fca5 Binary files /dev/null and b/ws2009/math I/exercise/uebung11.pdf differ diff --git a/ws2009/math I/exercise/uebung11L.pdf b/ws2009/math I/exercise/uebung11L.pdf new file mode 100644 index 00000000..7f0a5377 Binary files /dev/null and b/ws2009/math I/exercise/uebung11L.pdf differ diff --git a/ws2009/math I/exercise/uebung12.pdf b/ws2009/math I/exercise/uebung12.pdf new file mode 100644 index 00000000..85ed5c96 Binary files /dev/null and b/ws2009/math I/exercise/uebung12.pdf differ diff --git a/ws2009/math I/exercise/uebung12L.pdf b/ws2009/math I/exercise/uebung12L.pdf new file mode 100644 index 00000000..07ef3835 Binary files /dev/null and b/ws2009/math I/exercise/uebung12L.pdf differ diff --git a/ws2009/math I/exercise/uebung13L.pdf b/ws2009/math I/exercise/uebung13L.pdf new file mode 100644 index 00000000..be6cea10 Binary files /dev/null and b/ws2009/math I/exercise/uebung13L.pdf differ diff --git a/ws2009/math I/exercise/uebung14L.pdf b/ws2009/math I/exercise/uebung14L.pdf new file mode 100644 index 00000000..5b1d5c8b Binary files /dev/null and b/ws2009/math I/exercise/uebung14L.pdf differ diff --git a/ws2009/math I/exercise/uebung15.pdf b/ws2009/math I/exercise/uebung15.pdf new file mode 100644 index 00000000..88ab54da Binary files /dev/null and b/ws2009/math I/exercise/uebung15.pdf differ diff --git a/ws2009/math I/exercise/uebung15L.pdf b/ws2009/math I/exercise/uebung15L.pdf new file mode 100644 index 00000000..e2738de3 Binary files /dev/null and b/ws2009/math I/exercise/uebung15L.pdf differ diff --git a/ws2009/math I/script/Klausurstatistik.pdf b/ws2009/math I/script/Klausurstatistik.pdf new file mode 100644 index 00000000..7248fab7 Binary files /dev/null and b/ws2009/math I/script/Klausurstatistik.pdf differ diff --git a/ws2009/math I/script/Skript.pdf b/ws2009/math I/script/Skript.pdf new file mode 100644 index 00000000..1e898b81 Binary files /dev/null and b/ws2009/math I/script/Skript.pdf differ diff --git a/ws2009/math I/script/Skript_neueVersion.pdf b/ws2009/math I/script/Skript_neueVersion.pdf new file mode 100644 index 00000000..bbd2ca61 Binary files /dev/null and b/ws2009/math I/script/Skript_neueVersion.pdf differ diff --git a/ws2009/math I/script/infoblatt.pdf b/ws2009/math I/script/infoblatt.pdf new file mode 100644 index 00000000..763b7c5a Binary files /dev/null and b/ws2009/math I/script/infoblatt.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb01.pdf b/ws2009/tgdi/exercise/Ueb01.pdf new file mode 100644 index 00000000..9ffca746 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb01.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb01_lsg.pdf b/ws2009/tgdi/exercise/Ueb01_lsg.pdf new file mode 100644 index 00000000..54ba49d3 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb01_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb02.pdf b/ws2009/tgdi/exercise/Ueb02.pdf new file mode 100644 index 00000000..3b1fe6f5 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb02.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb02_lsg.pdf b/ws2009/tgdi/exercise/Ueb02_lsg.pdf new file mode 100644 index 00000000..0c8fb75c Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb02_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb03.pdf b/ws2009/tgdi/exercise/Ueb03.pdf new file mode 100644 index 00000000..2db5094f Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb03.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb03_lsg.pdf b/ws2009/tgdi/exercise/Ueb03_lsg.pdf new file mode 100644 index 00000000..6d2c2dc4 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb03_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb04.pdf b/ws2009/tgdi/exercise/Ueb04.pdf new file mode 100644 index 00000000..3cdb08f8 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb04.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb04_lsg.pdf b/ws2009/tgdi/exercise/Ueb04_lsg.pdf new file mode 100644 index 00000000..3a799ac7 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb04_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb05.pdf b/ws2009/tgdi/exercise/Ueb05.pdf new file mode 100644 index 00000000..7bcb158e Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb05.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb05_lsg.pdf b/ws2009/tgdi/exercise/Ueb05_lsg.pdf new file mode 100644 index 00000000..e40a8ec7 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb05_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb06.pdf b/ws2009/tgdi/exercise/Ueb06.pdf new file mode 100644 index 00000000..6049dd5a Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb06.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb06_lsg.pdf b/ws2009/tgdi/exercise/Ueb06_lsg.pdf new file mode 100644 index 00000000..74544be1 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb06_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb07.pdf b/ws2009/tgdi/exercise/Ueb07.pdf new file mode 100644 index 00000000..780cc023 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb07.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb07_lsg.pdf b/ws2009/tgdi/exercise/Ueb07_lsg.pdf new file mode 100644 index 00000000..37c5995f Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb07_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb08.pdf b/ws2009/tgdi/exercise/Ueb08.pdf new file mode 100644 index 00000000..6b2417e2 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb08.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb08_lsg.pdf b/ws2009/tgdi/exercise/Ueb08_lsg.pdf new file mode 100644 index 00000000..dfb8a465 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb08_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb08_lsg_grp.pdf b/ws2009/tgdi/exercise/Ueb08_lsg_grp.pdf new file mode 100644 index 00000000..56e4138a Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb08_lsg_grp.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb09.pdf b/ws2009/tgdi/exercise/Ueb09.pdf new file mode 100644 index 00000000..c4644855 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb09.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb09_lsg.pdf b/ws2009/tgdi/exercise/Ueb09_lsg.pdf new file mode 100644 index 00000000..7d22e55d Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb09_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb10.pdf b/ws2009/tgdi/exercise/Ueb10.pdf new file mode 100644 index 00000000..84e59053 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb10.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb10_lsg.pdf b/ws2009/tgdi/exercise/Ueb10_lsg.pdf new file mode 100644 index 00000000..becf388a Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb10_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb11.pdf b/ws2009/tgdi/exercise/Ueb11.pdf new file mode 100644 index 00000000..26116d9b Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb11.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb11_lsg.pdf b/ws2009/tgdi/exercise/Ueb11_lsg.pdf new file mode 100644 index 00000000..780e0da6 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb11_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb12.pdf b/ws2009/tgdi/exercise/Ueb12.pdf new file mode 100644 index 00000000..7bba28a4 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb12.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb12_lsg.pdf b/ws2009/tgdi/exercise/Ueb12_lsg.pdf new file mode 100644 index 00000000..47737e48 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb12_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb13.pdf b/ws2009/tgdi/exercise/Ueb13.pdf new file mode 100644 index 00000000..08373d2a Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb13.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb13_lsg.pdf b/ws2009/tgdi/exercise/Ueb13_lsg.pdf new file mode 100644 index 00000000..e9ce8138 Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb13_lsg.pdf differ diff --git a/ws2009/tgdi/exercise/Ueb14.pdf b/ws2009/tgdi/exercise/Ueb14.pdf new file mode 100644 index 00000000..50a12a8b Binary files /dev/null and b/ws2009/tgdi/exercise/Ueb14.pdf differ diff --git a/ws2009/tgdi/exercise/h06/h06.txt b/ws2009/tgdi/exercise/h06/h06.txt new file mode 100644 index 00000000..6baaa675 --- /dev/null +++ b/ws2009/tgdi/exercise/h06/h06.txt @@ -0,0 +1,55 @@ +module somemod (input a,b,c + output y) + + asign y = (~a | b) & c; + +endmudule + +module somemod2 (input a,b,c + output y) + + wire n1,n2 + NOT not1(n1,a) + OR or2(n2,n1,b) + AND and2(y,n2,c) + +endmudule + +module counter (input clk, enable, sreset, areset, set, [3:0] value + parameter max=15 + output reg[3:0] y) + + initial y = 0 + + always @ (posedge clk, posendge areset) + begin + + if(areset) y <= 0 + else if(sreset) + y <= 0; + else if(set) + y <= value + else if(enable) + if(y>max) + y <= 0 + y <= y + 1 ; + + end + +endmodule + + + +module testbenchcounter (input clk) + + wire enable,sreset,areset,set, [3:0]value + + initial enable = 0 sreset = 0, areset = 0, set = 0, [3:0]value = 0 + + counter c[.max = 5](clk,enable,sreset,areset,set, [3:0]value); + + #7 asign sreset = 0; + #1 asign sreset = 1; + #3 + +endmodule \ No newline at end of file diff --git a/ws2009/tgdi/exercise/h07/multiplexer.txt b/ws2009/tgdi/exercise/h07/multiplexer.txt new file mode 100644 index 00000000..52ca373b --- /dev/null +++ b/ws2009/tgdi/exercise/h07/multiplexer.txt @@ -0,0 +1,26 @@ +module mux8 #(parameters bitwidth = 3) + (input [2:0] select, + input [bitwidth-1:0]in0,in1,in2,in3,in4,in5,in6,in7, + output reg [bitwidth-1:0]out); + + always @ (*) + case ( select ) + 1 : out = in1; + 2 : out = in2; + 3 : out = in3; + 4 : out = in4; + 5 : out = in5; + 6 : out = in6; + 7 : out = in7; + + default: out = in1; + endcase + +endmodule + +module h7_2(input A,B,C + output y); + + mux8 #(1) mux(1'b1,1'b0,1'b0,1'b1,1'b1,1'b1,1'b0,1'b0,{a,b,c},y) + +endmodule \ No newline at end of file diff --git a/ws2009/tgdi/exercise/h08/automat.txt b/ws2009/tgdi/exercise/h08/automat.txt new file mode 100644 index 00000000..4a45c8d1 --- /dev/null +++ b/ws2009/tgdi/exercise/h08/automat.txt @@ -0,0 +1,108 @@ +module aut1 (input d, + input clk, + input reset, + output y); + + reg state, nextstate; + + parameter s0 = 2'b00; + parameter s1 = 2'b01; + parameter s2 = 2'b10; + + //state + always @ (posedge clk,posedge reset) + begin + if (reset) state <= s0; + else state <= nextstate; + end + + //next stages + always @ (*) + case(sate) + s0: if(d) nextstate = s1; else nextstate = s0; + s1: if(d) nextstate = s2; else nextstate = s1; + s2: if(d) nextstate = s1; else nextstate = s0; + default: nextstate = s0 + endcase + + //output logic + assign y = (state == s2); +endmodule + +module aut2 (input d, + input clk, + input reset, + output y) + + reg state,nextstate + + parameter s0 = 1'b0; + parameter s1 = 1'b1; + + //state register + always @ (posedge clk, posedge reset) + if (reset) state <= s0; + else state <= nextstate; + + //nextstage + always @ (*) + case(state) + s0: if(d) nextstate = s1; else nextstate = s0; + s1: if(d) nextstate = s0; else nextstate = s0; + default: nextstate = s0 + endcase + + //output + assign y = (d & state == s1); + +endmodule + +module test(); + + wire clk; + wire reset; + wire d; + wire y1; + wire y2 + + aut1 a( d,clk,reset,y1); + aut2 b( d,clk,reset,y2); + + initial + begin + d = 0 + + #10 + reset = 1; + #10 + reset = 0; + + #10 + d = 1; + #10 + d = 1; + #10 + d = 1; + #10 + d = 0; + #10 + d = 0; + #10 + d = 0; + #10 + d = 1; + #10 + d = 0; + #10 + d = 1; + end + + always + begin + clk = 0; #5 clk = 1 + $display("aut1 = "+y1+" aut2 = "+y2) + end + + + +endmodule \ No newline at end of file diff --git a/ws2009/tgdi/exercise/klausur1.pdf b/ws2009/tgdi/exercise/klausur1.pdf new file mode 100644 index 00000000..18412188 Binary files /dev/null and b/ws2009/tgdi/exercise/klausur1.pdf differ diff --git a/ws2009/tgdi/practical/Praktikum.pdf b/ws2009/tgdi/practical/Praktikum.pdf new file mode 100644 index 00000000..b9100bbe Binary files /dev/null and b/ws2009/tgdi/practical/Praktikum.pdf differ diff --git a/ws2009/tgdi/practical/mips/det.s b/ws2009/tgdi/practical/mips/det.s new file mode 100644 index 00000000..77567da5 --- /dev/null +++ b/ws2009/tgdi/practical/mips/det.s @@ -0,0 +1,242 @@ +#TGDI-Praktikum WS 09/10 +#Berechnung der Determinante einer 3x3 bzw. 4x4 Matrix + +.data + +dim: +.word 3 +#.word 4 + +matrix: +#3x3-Matrix +.word 3, 4, 5, 9, 4, 9, 1, 2, 2 +#.word 1, 2, 3, 4, 5, 6, 7, 8, 9 +#4x4-Matrix +#.word 3, 4, 5, 9, 4, 9, 1, 2, 2, 1, 3, 5, 7, 9, 3, 5 +#.word 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 + +det: .asciiz "Die Determinante ist: " +############################################################################### + +.text + +main: +################################### +################################### +#Hier soll das Programm stehen +#Das Ergebnis muss am Ende in $s6 stehen. + +# +# (c) Jana Becher, Ulf Gebhardt 2010 +# +# Dieses Programm wurde in Java geschrieben und dann +# händisch übersetzt. Der Java-Algorithmus wird beigelegt. +# +# Dieses Programm kann von nXn Matrizen die Determinante bestimmen, +# Allerdings sollte n <= 2^31 sein und die enthaltenen Zahlen in der Matrix +# sollten folgende bedingungen erfüllen: max(a1*a2*...*an) <= 2^31, wobei a1 +# bis an beliebige Zahlen aus der Matrix sind. +# + + + lw $a0, dim #load dimension + la $a1, matrix #load matrix-startadress + jal calcdet #calc determinante + addi $s6, $v0, 0 #write result to $s6 + j ende #ende + +#pow(integer,integer) = integer +# +#$a0 = number; +#$a1 = exp; +#$v0 = number^exp +#Comment: +#Java: Math.pow +#keep it withoin 32bit -> using mul +# +pow: addi $t0, $0, 0 #load 0 in $t0 + ble $a1, $t0, powrecdone #$a1 <= 0 + sw $ra, 0($sp) #sichere $ra + addi $sp, $sp, 4 #stackpointer + 1 + addi $a1, $a1, -1 #$a1 -= 1 + jal pow #jump in pow + addi $sp, $sp -4 #stackpointer - 1 + lw $ra, 0($sp) #sichere $ra zurück + mul $v0,$a0, $v0 #$v0 = number($a0) * pow($v0) + jr $ra #jumpback + + powrecdone: addi $v0, $0, 1 #result = 1 + jr $ra #jumpback + +#calcnewmatrix(integer,integer,address) = address, size +# +#$a0 = pos in Matrix +#$a1 = size of matrix +#$a2 = address of matrix +#$v0 = address of new matrix (on stack) +#$v1 = size of matrix on stack (negative -> add to $sp) +#Comment: +#new matrix lives on Stack, but stackpointer is not increased - do it if you need the object +# +calcnewmatrix: #create new matrix with (size-1)*(size-1) and store size in $v1, address =$sp + addi $t0, $a1, -1 #$t0= size-1 + mul $t0, $t0, $t0 #$t0= (size-1)(size-1) + addi $t1, $0, 4 #$t1= bytes in 1 word + mul $t0, $t0, $t1 #$t0= bytesperword*arraysize + addi $v1, $t0, 0 #result $v1 = $t0 = arraysize in bytes on stack + + #forA + addi $t0, $0, 1 #$t0=counter for forA = i starts with 1 + forA: bge $t0, $a1, cnmjb #exit calcnewmatrix: cnmjb + + addi $t1, $0, 0 #$t1=counter for forB = j starts with 0 + forB: bge $t1, $a1, forBDone #exit forB -> forA: forBDone + + beq $t1, $a0, forBSkip #if(pos == j) skip one cycle + + addi $t2, $t1, 0 #tempvar $t2 = j + blt $t2, $a0, forBCalc #if(j($t2) < pos($a0)) start calc + addi $t2, $t2, -1 #else $t2 -= 1 + + forBCalc: addi $t7, $0, 4 #byteofset of an integer in $t7 + + #oldmatrixpos + mul $t3, $t0, $a1 #$t3=i*size + add $t3, $t3, $t1 #$t3=i*size+j = posinmatrix + mul $t3, $t3, $t7 #$t3=byteoffset*posinmatrix + add $t3, $t3, $a2 #$t3=matrixadress+byteoffset*posinmatrix + + #newmatrixoffset + addi $t4, $t0, -1 #$t4=i-1 + addi $t5, $a1, -1 #$t5=size-1 + mul $t4, $t4, $t5 #$t4=(i-1)*(size-1) + add $t4, $t4, $t2 #$t4=(i-1)*(size-1) + j(-1 if pos is already skipped) =posinmatrix + mul $t4, $t4, $t7 #$t4=byteoffset*posinmatrix + add $t4, $t4, $sp #$t4=newmatrixadress($sp)+byteoffset*posinmatrix + + #load value of old matrix + lw $t5, 0($t3) #$t5=oldmatrix[$t3] + + #store word in new matrix + sw $t5, 0($t4) #newmatrix[$t4] = $t5 + + forBSkip: #skip forB Calculation needed for j==pos + #forB: j++ and forjumpback + addi $t1, $t1, 1 #j++ + j forB #forB Jumpback + + forBDone: #Dummy to jump out of ForB and continue with ForA + + #forA: i++ and forjumpback + addi $t0, $t0,1 #i++ + j forA #forA Jumpback + + #calcnewmatrixjumpback + cnmjb: addi $v0, $sp, 0 #result=$sp=newmatrixadress #add $v0 to $sp to keep dataobject + jr $ra #jump back + +#calcdet(integer,address) = integer +# +#$a0 = size of matrix(dimension) +#$a1 = address of matrix +#$v0 = determinante of matrix +#Comment: +#size is in most cases the dimension of the matrix not the actual size, which is (dim*dim) +calcdet: #Rec-Anchor and Result + addi $t0, $0, 1 #load 1 in $t0 + beq $a0, $t0, recanchor #check size + addi $t5, $0, 0 #set result to 0 + + #for1 + addi $t0, $0, 0 #countervar $t0 for for1 -> countervar=i + for1: bge $t0, $a0, cdjb #if i >= size -> cdjb #Rescursion Anchor + + #sichere vars + sw $ra, 0($sp) #sichere $ra + sw $t5, 4($sp) #sichere result + sw $t0, 8($sp) #sichere for-counter + sw $a0, 12($sp) #sichere param0 + sw $a1, 16($sp) #sichere param1 + addi $sp, $sp, 20 #stackpointer - 5 #stack +5 + + #pow(-1,forcounter) -> t2 + addi $a0, $0, -1 #number = -1 + add $a1, $0, $t0 #exp = for-counter + jal pow #calc pow + + #sichere result + sw $v0, 0($sp) #sichere result nach stack + addi $sp, $sp, 4 #stackpointer - 1 #stack +1 + + #CalcNewMatrix + lw $t0, -16($sp) #load for-counter=i + addi $a0, $t0, 0 #pos = i + lw $t7, -12($sp) #load $a0=size + addi $a1, $t7, 0 #size + lw $t7, -8($sp) #load $a1=matrixaddress + addi $a2, $t7, 0 #matrix + jal calcnewmatrix #calcnewmatrix -> newmatrix=$v0 + addi $t6, $sp, 0 #$t6 = store $sp before matrix and size is added! - makes it simple + add $sp, $sp, $v1 #Matrix is on Stack now, keep it by increasing stackpointer #stack +$v1 + sw $v1, 0($sp) #Store size of Matrix@Stack to delete it afterwards + sw $t6, 4($sp) #Store old $sp + addi $sp, $sp, 8 #1word on Stack reserved #stack +2 + + #CalcDet - Recursion ($t3) + lw $t7, -12($t6) #load $a0=size #Oldstackpointer $t6 + addi $a0, $t7, -1 #size -1 + addi $a1, $v0, 0 #matrixaddress from calcnewmatrix + jal calcdet #calcdet of new matrix + addi $t3, $v0, 0 #Save result from calcdet in $t3 + + #restore vars/cleanup + addi $sp, $sp, -4 #1word - stored sp #stack -1 + lw $t7, 0($sp) #load old sp + addi $sp, $t7, 0 #free memory used for matrix and matrixsize #stack -$v1 -1 + addi $sp, $sp, -24 #stackpointer - 6 #stack -6 + lw $ra, 0($sp) #sichere $ra + lw $t5, 4($sp) #sichere result + lw $t0, 8($sp) #sichere for-counter + lw $a0, 12($sp) #sichere param0 + lw $a1, 16($sp) #sichere param1 + lw $t1, 20($sp) #result aus pow + + #Get Matrix@pos i + addi $t7, $0, 4 #bytesize of word -> $t7 + mul $t7, $t0, $t7 #matrixposcalc: i*byteoffset + add $t7, $t7, $a1 #get actual matrixpos + lw $t2, 0($t7) #loadmatrix content @ pos forcounter + + #calc result #tempvar = $t7 + mul $t7, $t1, $t2 #pow*matrix@posi + mul $t7, $t7, $t3 #pow*matrixpos@posi*submatrix + add $t5, $t5, $t7 #add to result + + #for: i++ and forjumpback + addi $t0,$t0, 1 # +1 to counter + j for1 #jump to for again + + #cdjb = calcdetjumpback + cdjb: addi $v0, $t5, 0 #set result + jr $ra #jump back + + recanchor: lw $v0, 0($a1) #return matrix[0] + jr $ra #jump back +################################### +################################### + +ende: +#Ausgabe + +la $a0 det +li $v0 4 +syscall + +move $a0, $s6 +li $v0, 1 +syscall + +################################### +#Ende +li $v0, 10 +syscall diff --git a/ws2009/tgdi/practical/verilog/Praktikum.gise b/ws2009/tgdi/practical/verilog/Praktikum.gise new file mode 100644 index 00000000..61112c5b --- /dev/null +++ b/ws2009/tgdi/practical/verilog/Praktikum.gise @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + 11.1 + + + + + + + + diff --git a/ws2009/tgdi/practical/verilog/Praktikum.ise b/ws2009/tgdi/practical/verilog/Praktikum.ise new file mode 100644 index 00000000..862ea8fa Binary files /dev/null and b/ws2009/tgdi/practical/verilog/Praktikum.ise differ diff --git a/ws2009/tgdi/practical/verilog/Praktikum.xise b/ws2009/tgdi/practical/verilog/Praktikum.xise new file mode 100644 index 00000000..72db22e9 --- /dev/null +++ b/ws2009/tgdi/practical/verilog/Praktikum.xise @@ -0,0 +1,331 @@ + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/ws2009/tgdi/practical/verilog/alu32.v b/ws2009/tgdi/practical/verilog/alu32.v new file mode 100644 index 00000000..0fde3304 --- /dev/null +++ b/ws2009/tgdi/practical/verilog/alu32.v @@ -0,0 +1,41 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: Sarah Harris +// +// Create Date: 21:26:58 02/14/2006 +// Design Name: +// Module Name: alu32 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module alu( input [31:0] A, B, input [2:0] F, + output reg [31:0] Y, output Zero); + + wire [31:0] S, Bout; + + assign Bout = F[2] ? ~B : B; + assign S = A + Bout + F[2]; + + always @ ( * ) + case (F[1:0]) + 2'b00: Y <= A & Bout; + 2'b01: Y <= A | Bout; + 2'b10: Y <= S; + 2'b11: Y <= S[31]; + endcase + + assign Zero = (Y == 32'b0); +// assign Overflow = A[31]& Bout[31] & ~Y[31] | +// ~A[31] & ~Bout[31] & Y[31]; + +endmodule diff --git a/ws2009/tgdi/practical/verilog/divider.v b/ws2009/tgdi/practical/verilog/divider.v new file mode 100644 index 00000000..9c50fd4b --- /dev/null +++ b/ws2009/tgdi/practical/verilog/divider.v @@ -0,0 +1,28 @@ +`timescale 1ns / 1ps +//Praktikum TGDI WS 09/10 +//Taktteiler +//100108 TW: Initial Version +//100114 TW: SIM-Switch eingebaut + +module divider(input clkin, + output clkout); + +//zur Synthese auskommentieren +`define SIM 1 + + +//Zaehler +reg [25:0] count; + +`ifdef SIM +assign clkout = count[2]; +`else +assign clkout = count[25]; +`endif + +initial count = 0; + +always @(posedge clkin) begin + count <= count + 1; +end +endmodule diff --git a/ws2009/tgdi/practical/verilog/fpu.v b/ws2009/tgdi/practical/verilog/fpu.v new file mode 100644 index 00000000..ed9cda3f --- /dev/null +++ b/ws2009/tgdi/practical/verilog/fpu.v @@ -0,0 +1,261 @@ +`timescale 1ns / 1ps +//Praktikum TGDI WS 09/10 +//In dieser Datei soll die FPU implementiert werden. +//Diese Datei bitte als Lsung einschicken. + +module fpu( + input clk, //Takt + input reset, //Reset-Signal + input[31:0] instruction, //aktueller Befehl + input[31:0] mem_readdata, //Lesedaten vom Speicher zum Registersatz (fuer lwc1) + output[31:0] mem_writedata, //Schreibdaten vom Registersatz (Port 1) an Speicher (fuer swc1) + + input regdst, //Gibt an, welcher Teil des Befehls als Adresse fuer den Write Port + //des FPU-Registersatzes verwendet wird + //0: Zielregister aus dem FP-Befehl + //1: instruction[20:16] (lwc1, swc1) + input fpuregwritemux, //Gibt an, woher die Daten am Write Port des Registersatzes stammen + //0: Daten ist Ergebnis aus FPU + //1: Daten aus Speicher + + input fpu_regwrite //Write_enable des FPU-Registersatzes +); + + wire [31:0] mem_data1, mem_data2; + wire [31:0] res_add, res_sub, res_mult; + wire [31:0] dummy_1; + + wire notwrite; + + assign notwrite = 0; + + //lese daten aus fpu-memory + float_memory RAM( clk, + notwrite, + instruction[15:11], instruction[20:16], instruction[10:6], //2xquellregister,1xZiel + mem_readdata, //does not write! + mem_data1, mem_data2); + + //calculate values + float_add adder(mem_data1,mem_data2,res_add); + float_sub subber(mem_data1,mem_data2,res_sub); + float_mult multer(mem_data1,mem_data2,res_mult); + + reg [31:0] result; + wire [31:0] swc1_res; + + always@(*) + begin + //float-berechnung + case(instruction[5:0]) //Funktion, wleche aufgerufen wird + 6'b000000 : result = res_add; //addition + 6'b000001 : result = res_sub; //subtraktion + 6'b000010 : result = res_mult; //multiplikation + default: result = res_add; //default = addieren + endcase + + if(regdst & fpuregwritemux & fpu_regwrite) //lwc1-befehl + result = mem_readdata; //ergebnis = eingegebene daten + end + + //schreibe memory -> bei swc1-befehl oder wenn float-berechnung durchgeführt wurde! + float_memory write_mem( clk, + fpu_regwrite, + instruction[15:11], instruction[20:16], instruction[10:6], + result, + swc1_res,dummy_1); //lese daten aus speicher + + //Output: entweder result bei float/lwc1 oder swc1_res bei swc1 + assign mem_writedata = (regdst & !fpuregwritemux & !fpu_regwrite)/*swc1*/ ? swc1_res : result /*float / lwc1*/; + +endmodule + +//Registersatz +module float_memory( + input clk, //Clock + input write_enable, //schreibe ja/nein + input [4:0] read_addr1, read_addr2, write_addr, //lese und schreibaddressen + input [31:0] write_data, //daten zum schreiben + output[31:0] read_data1,read_data2 //ausgelesene daten + ); + + //Speicher + reg [31:0] RAM[31:0]; + + //schreiben + always@(posedge clk) + if(write_enable & write_addr != 0) + RAM[write_addr] <= write_data; + + //lesen + assign read_data1 = RAM[read_addr1]; + assign read_data2 = RAM[read_addr2]; + +endmodule + +//Float-Multiplikator +module float_mult( + input [31:0] read_data1,read_data2, //Arbeitsdaten + output [31:0] result); //achtung, rundet die Zahl + + wire vz1; + wire [10:0] exp1; + reg [20:0] mant1; + + wire vz2; + wire [10:0] exp2; + reg [20:0] mant2; + + reg [10:0] shiftamount; + + reg [10:0] new_exp; + reg new_vz; + reg [41:0] new_mant; + + //assigns + //teile read_data1 auf in vz1, exp1 + assign vz1 = read_data1[31]; + assign exp1 = read_data1[30:20]; + //teile read_data2 auf in vz2, exp2 + assign vz2 = read_data2[31]; + assign exp2 = read_data2[30:20]; + + //always + always@(*) + begin + //mantisse um 1 erweitern + mant1[20] = 1; + mant1[19:0] = read_data1[19:0]; + //mantisse um 1 erweitern + mant2[20] = 1; + mant2[19:0] = read_data2[19:0]; + + //exponent + new_exp = exp1 + (exp2 - 1023); //nur 1x bias! (11 bit deshalb bias=1023) + + //vorzeichen + if(vz1 == vz2) + new_vz = 0; //+ + else + new_vz = 1; //- + + //mantisse + new_mant = mant1 * mant2; //auf 42 bit gemapt + + //shift back -> jetzt steht die erste 1 in der 21 stelle = new_mant[20] + if(new_mant[41] == 1) //höchstes bit ist gesetzt? + begin + new_mant = new_mant >> 20; //schifte um 20 + new_exp = new_exp + 20; //addiere 20 auf den exp + end else + begin + new_mant = new_mant >> 19; //oberstes bit ist nicht gesetzt = zweithöchstes bit ist gesetzt, shifte um 19 + new_exp = new_exp + 19; //addiere 19 auf exp + end + end + + assign result[31] = new_vz; //neues vorzeichen + assign result[30:20] = new_exp; //neuer exponent + assign result[19:0] = new_mant[19:0]; //neue mantisse + +endmodule + +//Addierer +module float_add( + input [31:0] read_data1, read_data2, //Arbeitsdaten + output [31:0] result); //Ergebniss + + wire vz1; + wire [10:0] exp1; + reg [20:0] mant1; + + wire vz2; + wire [10:0] exp2; + reg [20:0] mant2; + + reg [10:0] shiftamount; + + reg [10:0] new_exp; + reg new_vz; + reg [21:0] new_mant; + + //assigns + //teile read_data1 auf in vz1, exp1 + assign vz1 = read_data1[31]; + assign exp1 = read_data1[30:20]; + //teile read_data2 auf in vz2, exp2 + assign vz2 = read_data2[31]; + assign exp2 = read_data2[30:20]; + + //always + always@(*) + begin + //mantisse um 1 erweitern + mant1[20] = 1; + mant1[19:0] = read_data1[19:0]; + //mantisse um 1 erweitern + mant2[20] = 1; + mant2[19:0] = read_data2[19:0]; + + //exponentenvergleich, new_exp = größerer exp, shifte kleinere Zahl + if(exp1 >= exp2) + begin + shiftamount = exp1 - exp2; + mant2 = mant2 >> shiftamount[10:0]; + new_exp = exp1; + end else + begin + shiftamount[10:0] = exp2 - exp1; + mant1 = mant1 >> shiftamount[10:0]; + new_exp = exp2; + end + + //vorzeichen + if(mant1 >= mant2) + begin + new_vz = vz1; + end else + begin + new_vz = vz2; + end + + if(vz1 == vz2) //vorzeichen sind gleich + begin + new_mant[21:0] = mant1 + mant2; //addiere + end else + begin + if(vz1 > vz2) //read_data1 ist negativ + begin + new_mant[21:0] = mant2 - mant1; + end else //read_data2 ist negativ + begin + new_mant[21:0] = mant1 - mant2; + end + end + + if(new_mant[21] == 1) //übertrag -> zurückshiften + begin + new_mant = new_mant >> 1; + new_exp = new_exp + 1; + end + end + + //zusammen bauen + assign result[31] = new_vz; + assign result[30:20] = new_exp; + assign result[19:0] = new_mant[19:0]; +endmodule + +//subtrahierer +module float_sub( + input[31:0] read_data1, read_data2, //Arbeitsdaten + output [31:0] result); //Ergebniss + + wire [31:0] data2; + + assign data2[30:0] = read_data2[30:0]; + assign data2[31] = (read_data2[31] == 1) ? 0 : 1; //vertausche vorzeichen von read_data2 + + //Addiere read_data1 und read_data2(mit geändertem vorzeichen) + float_add add(read_data1, data2,result); +endmodule diff --git a/ws2009/tgdi/practical/verilog/memfile1.dat b/ws2009/tgdi/practical/verilog/memfile1.dat new file mode 100644 index 00000000..04f3d25f --- /dev/null +++ b/ws2009/tgdi/practical/verilog/memfile1.dat @@ -0,0 +1,64 @@ +c4020000 +c4010004 +460208c0 +e4030000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 \ No newline at end of file diff --git a/ws2009/tgdi/practical/verilog/memfiledata.dat b/ws2009/tgdi/practical/verilog/memfiledata.dat new file mode 100644 index 00000000..173bddda --- /dev/null +++ b/ws2009/tgdi/practical/verilog/memfiledata.dat @@ -0,0 +1,64 @@ +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 \ No newline at end of file diff --git a/ws2009/tgdi/practical/verilog/mipsmem.v b/ws2009/tgdi/practical/verilog/mipsmem.v new file mode 100644 index 00000000..55d26e8b --- /dev/null +++ b/ws2009/tgdi/practical/verilog/mipsmem.v @@ -0,0 +1,42 @@ +//------------------------------------------------ +// mipsmem.v +// David_Harris@hmc.edu 23 October 2005 +// External memories used by MIPS processors +//------------------------------------------------ + + +module dmem(input clk, we, + input [31:0] a, wd, + output [31:0] rd); + + reg [31:0] RAM[63:0]; + + initial + begin + $readmemh("memfiledata.dat",RAM); + end + + always @(posedge clk) + if (we) + RAM[a[6:2]] <= wd; + + assign rd = RAM[a[6:2]]; // word aligned + +endmodule + +//Instruction-Memory +//ROM +module imem(input [5:0] a, + output [31:0] rd); + + reg [31:0] RAM[63:0]; + + initial + begin + $readmemh("memfile1.dat",RAM); + end + + assign rd = RAM[a]; // word aligned +endmodule + + diff --git a/ws2009/tgdi/practical/verilog/mipsparts.v b/ws2009/tgdi/practical/verilog/mipsparts.v new file mode 100644 index 00000000..bda1ed8e --- /dev/null +++ b/ws2009/tgdi/practical/verilog/mipsparts.v @@ -0,0 +1,76 @@ +//------------------------------------------------ +// mipsparts.v +// David_Harris@hmc.edu 23 October 2005 +// Components used in MIPS processor +//------------------------------------------------ + + +module regfile(input clk, + input we3, + input [4:0] ra1, ra2, wa3, + input [31:0] wd3, + output [31:0] rd1, rd2); + + reg [31:0] rfi[31:0]; + + + // three ported register file + // read two ports combinationally + // write third port on rising edge of clock + // register 0 hardwired to 0 + + always @(posedge clk) + if (we3) rfi[wa3] <= wd3; + + assign rd1 = (ra1 != 0) ? rfi[ra1] : 0; + assign rd2 = (ra2 != 0) ? rfi[ra2] : 0; +endmodule + +module adder(input [31:0] a, b, + output [31:0] y); + + assign y = a + b; +endmodule + +module sl2(input [31:0] a, + output [31:0] y); + + // shift left by 2 + assign y = {a[29:0], 2'b00}; +endmodule + +module signext(input [15:0] a, + output [31:0] y); + + assign y = {{16{a[15]}}, a}; +endmodule + +module flopr #(parameter WIDTH = 8) + (input clk, reset, + input [WIDTH-1:0] d, + output reg [WIDTH-1:0] q); + + always @(posedge clk, posedge reset) + if (reset) q <= 0; + else q <= d; +endmodule + +module flopenr #(parameter WIDTH = 8) + (input clk, reset, + input en, + input [WIDTH-1:0] d, + output reg [WIDTH-1:0] q); + + always @(posedge clk, posedge reset) + if (reset) q <= 0; + else if (en) q <= d; +endmodule + +module mux2 #(parameter WIDTH = 8) + (input [WIDTH-1:0] d0, d1, + input s, + output [WIDTH-1:0] y); + + assign y = s ? d1 : d0; +endmodule + diff --git a/ws2009/tgdi/practical/verilog/mipssingle.v b/ws2009/tgdi/practical/verilog/mipssingle.v new file mode 100644 index 00000000..12d676ca --- /dev/null +++ b/ws2009/tgdi/practical/verilog/mipssingle.v @@ -0,0 +1,183 @@ +`timescale 1ns / 1ps +//Praktikum TGDI WS 09/10 +//Taktteiler +//100108 TW: Initial Version, Codevorlage aus Lehrbuch erweitert + +//------------------------------------------------ +// mipssingle.v +// David_Harris@hmc.edu 23 October 2005 +// Single-cycle MIPS processor +//------------------------------------------------ + +// single-cycle MIPS processor +module mips(input clk, reset, + output [31:0] pc, + input [31:0] instr, + output memwrite, + output [31:0] aluout, writedata, + input [31:0] readdata); + + wire memtoreg, branch, + alusrc, regdst, regwrite, jump; + wire [2:0] alucontrol; + wire datamemorywritemux_s; + wire fpu_regwrite_ctrl,fpuregisterwritemux; + + controller c(instr[31:26], instr[5:0], + memtoreg, memwrite, branch, + alusrc, regdst, regwrite, jump, + alucontrol,datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux); + datapath dp(clk, reset, memtoreg, branch, + alusrc, regdst, regwrite, jump, + alucontrol, + pc, instr, + aluout, writedata, readdata,datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux); +endmodule + +module controller(input [5:0] op, funct, + output memtoreg, memwrite, + output branch, alusrc, + output regdst, regwrite, + output jump, + output [2:0] alucontrol, + output datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux); + + wire [1:0] aluop; + + maindec md(op, memtoreg, memwrite, branch, + alusrc, regdst, regwrite, jump, + aluop,datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux); + aludec ad(funct, aluop, alucontrol); +endmodule + +module maindec(input [5:0] op, + output memtoreg, memwrite, + output branch, alusrc, + output regdst, regwrite, + output jump, + output [1:0] aluop, + output datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux); + + reg [11:0] controls; + + assign {regwrite, regdst, alusrc, + branch, memwrite, + memtoreg, jump, aluop,datamemorywritemux_s,fpu_regwrite_ctrl,fpuregisterwritemux} = controls; + + always @( * ) + case(op) + 6'b000000: controls <= 12'b110000010000; //Rtyp + 6'b100011: controls <= 12'b101001000000; //LW + 6'b101011: controls <= 12'b001010000000; //SW + 6'b000100: controls <= 12'b000100001000; //BEQ + 6'b001000: controls <= 12'b101000000000; //ADDI + 6'b000010: controls <= 12'b000000100000; //J + 6'b110001: controls <= 12'b011001000011; //lwc1 + 6'b111001: controls <= 12'b011010000100; //swc1 + 6'b010001: controls <= 12'b000000000010; //Floating-Point + default: controls <= 12'bxxxxxxxxx; //??? + endcase +endmodule + +module aludec(input [5:0] funct, + input [1:0] aluop, + output reg [2:0] alucontrol); + + always @( * ) + case(aluop) + 2'b00: alucontrol <= 3'b010; // add + 2'b01: alucontrol <= 3'b110; // sub + default: case(funct) // RTYPE + 6'b100000: alucontrol <= 3'b010; // ADD + 6'b100010: alucontrol <= 3'b110; // SUB + 6'b100100: alucontrol <= 3'b000; // AND + 6'b100101: alucontrol <= 3'b001; // OR + 6'b101010: alucontrol <= 3'b111; // SLT + default: alucontrol <= 3'bxxx; // ??? + endcase + endcase +endmodule + +module datapath(input clk, reset, + input memtoreg, branch, + input alusrc, regdst, + input regwrite, jump, + input [2:0] alucontrol, + output [31:0] pc, + input [31:0] instr, + output [31:0] aluout, writedata, + input [31:0] readdata, + + input datamemorywritemux_s, + input fpu_regwrite_ctrl, + input fpuregisterwritemux_s); + + wire [4:0] writereg; + wire zero, pcsrc; + wire [31:0] pcnext, pcnextbr, pcplus4, pcbranch; + wire [31:0] pcjump; + wire [31:0] immext, immextsh; + wire [31:0] srca, srcb; + wire [31:0] result; + + //TW + wire [31:0] writedata_rf; + // + + // next PC logic + assign pcsrc = branch & zero; + assign pcjump = {pcplus4[31:28], instr[25:0], 2'b00}; + + flopr #(32) pcreg(clk, reset, pcnext, pc); + adder pcadd1(pc, 32'b100, pcplus4); + sl2 immsh(immext, immextsh); + adder pcadd2(pcplus4, immextsh, pcbranch); + mux2 #(32) pcbrmux(pcplus4, pcbranch, pcsrc, + pcnextbr); + mux2 #(32) pcmux(pcnextbr, pcjump, jump, + pcnext); + + + // register file logic + regfile rf(clk, regwrite, instr[25:21], + instr[20:16], writereg, + result, srca, writedata_rf); + mux2 #(5) wrmux(instr[20:16], instr[15:11], + regdst, writereg); + mux2 #(32) resmux(aluout, readdata, + memtoreg, result); + signext se(instr[15:0], immext); + + // ALU logic + mux2 #(32) srcbmux(writedata, immext, alusrc, + srcb); + alu alu32(srca, srcb, alucontrol, + aluout, zero); + + //Begin TW + //---------------------------------------------------------------------------- + wire [31:0] fpu_result; + + //Mux vor DataMem, Ergebnis aus Reg oder FPU_Reg? + mux2 #(32) datamemorywritemux ( + .d0(writedata_rf), + .d1(fpu_result), + .s(datamemorywritemux_s), + .y(writedata) + ); + + //Instanziierung der FPU + ///////////////////////////////////// + fpu myFPU ( + .clk(clk), + .reset(reset), + .instruction(instr), + .mem_readdata(readdata), + .regdst(regdst), + .fpuregwritemux(fpuregisterwritemux_s), + .fpu_regwrite(fpu_regwrite_ctrl), + .mem_writedata(fpu_result) + ); + /////////////////////////////////////// + +endmodule diff --git a/ws2009/tgdi/practical/verilog/mipstest.v b/ws2009/tgdi/practical/verilog/mipstest.v new file mode 100644 index 00000000..1613aa09 --- /dev/null +++ b/ws2009/tgdi/practical/verilog/mipstest.v @@ -0,0 +1,29 @@ +`timescale 1ns / 1ps +//Praktikum TGDI WS 09/10 +//Testbench +//100108 TW: Initial Version + +module testbench(); + + reg clk; + reg reset; + + wire [7:0] leds; + + // insstantiate device to be tested + top dut(clk, reset, leds); + + // Reset + initial + begin + reset <= 1; # 22; reset <= 0; + end + + // Takt + always + begin + clk <= 1; # 5; clk <= 0; # 5; + end + +endmodule + diff --git a/ws2009/tgdi/practical/verilog/s3esk_startup.ucf b/ws2009/tgdi/practical/verilog/s3esk_startup.ucf new file mode 100644 index 00000000..f6368dac --- /dev/null +++ b/ws2009/tgdi/practical/verilog/s3esk_startup.ucf @@ -0,0 +1,76 @@ +# Constraints for reference design 's3esk_startup'. +# +# Revision C of the Spartan-3E Starter Kit. +# +# Ken Chapman - Xilinx Ltd - January 2006 +# +# Revised 16th February 2006 +# +# Period constraint for 50MHz operation +# +NET "clk" PERIOD = 20.0ns HIGH 50%; +# +# soldered 50MHz Clock. +# +NET "clk" LOC = "C9" | IOSTANDARD = LVTTL; +# +# +# Simple LEDs +# Require only 3.5mA. +# +NET "led<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +NET "led<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4; +# +# +# LCD display +# Very slow so can use lowest drive strength. +# +#NET "lcd_rs" LOC = "L18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_rw" LOC = "L17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_e" LOC = "M18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_d<4>" LOC = "R15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_d<5>" LOC = "R16" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_d<6>" LOC = "P17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "lcd_d<7>" LOC = "M15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +# +# Strata Flash (need to disable to use LCD display) +# +#NET "strataflash_oe" LOC = "C18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "strataflash_ce" LOC = "D16" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +#NET "strataflash_we" LOC = "D17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; +## +## +## Simple switches +## Pull UP resistors used to stop floating condition during switching. +## +#NET "switch<0>" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP; +#NET "switch<1>" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP; +#NET "switch<2>" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP; +#NET "switch<3>" LOC = "N17" | IOSTANDARD = LVTTL | PULLUP; +## +## +## Press buttons +## Must have pull DOWN resistors to provide Low when not pressed. +## +#NET "btn_north" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN; +#NET "btn_east" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN; +#NET "btn_south" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN; +#NET "btn_west" LOC = "D18" | IOSTANDARD = LVTTL | PULLDOWN; +## +## Rotary encoder. +## Rotation contacts require pull UP resistors to provide High level. +## Press contact requires pull DOWN resistor to provide Low when not pressed.. +## +#NET "rotary_a" LOC = "K18" | IOSTANDARD = LVTTL | PULLUP; +#NET "rotary_b" LOC = "G18" | IOSTANDARD = LVTTL | PULLUP; +#NET "rotary_press" LOC = "V16" | IOSTANDARD = LVTTL | PULLDOWN; +# +# +# End of File +# diff --git a/ws2009/tgdi/practical/verilog/top.v b/ws2009/tgdi/practical/verilog/top.v new file mode 100644 index 00000000..4af82eee --- /dev/null +++ b/ws2009/tgdi/practical/verilog/top.v @@ -0,0 +1,55 @@ +`timescale 1ns / 1ps +//Praktikum TGDI WS 09/10 +//Toplevel Modul +//100108 TW: Initial Version + +module top(input clk, reset, + output [7:0] led); + + + wire [31:0] aluout, writedata, readdata; + wire memwrite; + wire [31:0] pc, instr; + + //LEDs belegen und Signale zusammen-ORen, damit sie nicht wegopimiert werden + assign led[0] = (|aluout | |writedata | |readdata | |memwrite); + assign led[1] = 0; + + //PC auf LEDs legen zur Kontrolle + assign led[7:2] = pc[7:2]; + + //50 MHZ-Takt teilen + wire clkout; + divider taktteiler ( + .clkin(clk), + .clkout(clkout) + ); + + //MIPS-CPU instanziieren + mips myMIPS ( + .clk(clkout), + .reset(reset), + .pc(pc), + .instr(instr), + .memwrite(memwrite), + .aluout(aluout), + .writedata(writedata), + .readdata(readdata) + ); + + //Instruction-Speicher + imem imem ( + .a(pc[7:2]), + .rd(instr) + ); + + //Datenspeicher + dmem dmem( + .clk(clkout), + .we(memwrite), + .a(aluout), + .wd(writedata), + .rd(readdata) + ); + +endmodule diff --git a/ws2009/tgdi/script/Kapitel01.pdf b/ws2009/tgdi/script/Kapitel01.pdf new file mode 100644 index 00000000..b8e6eaac Binary files /dev/null and b/ws2009/tgdi/script/Kapitel01.pdf differ diff --git a/ws2009/tgdi/script/Kapitel02v1.pdf b/ws2009/tgdi/script/Kapitel02v1.pdf new file mode 100644 index 00000000..7b6e1848 Binary files /dev/null and b/ws2009/tgdi/script/Kapitel02v1.pdf differ diff --git a/ws2009/tgdi/script/Kapitel02v2.pdf b/ws2009/tgdi/script/Kapitel02v2.pdf new file mode 100644 index 00000000..ed58bcdf Binary files /dev/null and b/ws2009/tgdi/script/Kapitel02v2.pdf differ diff --git a/ws2009/tgdi/script/Kapitel03v1.pdf b/ws2009/tgdi/script/Kapitel03v1.pdf new file mode 100644 index 00000000..90be764f Binary files /dev/null and b/ws2009/tgdi/script/Kapitel03v1.pdf differ diff --git a/ws2009/tgdi/script/Kapitel03v2.pdf b/ws2009/tgdi/script/Kapitel03v2.pdf new file mode 100644 index 00000000..6bd2a24a Binary files /dev/null and b/ws2009/tgdi/script/Kapitel03v2.pdf differ diff --git a/ws2009/tgdi/script/Kapitel04v1.pdf b/ws2009/tgdi/script/Kapitel04v1.pdf new file mode 100644 index 00000000..9baebec4 Binary files /dev/null and b/ws2009/tgdi/script/Kapitel04v1.pdf differ diff --git a/ws2009/tgdi/script/Kapitel05v1.pdf b/ws2009/tgdi/script/Kapitel05v1.pdf new file mode 100644 index 00000000..50077f76 Binary files /dev/null and b/ws2009/tgdi/script/Kapitel05v1.pdf differ diff --git a/ws2009/tgdi/script/Kapitel06v0.pdf b/ws2009/tgdi/script/Kapitel06v0.pdf new file mode 100644 index 00000000..93ee3ae3 Binary files /dev/null and b/ws2009/tgdi/script/Kapitel06v0.pdf differ diff --git a/ws2009/tgdi/script/Kapitel07v0.pdf b/ws2009/tgdi/script/Kapitel07v0.pdf new file mode 100644 index 00000000..731b417f Binary files /dev/null and b/ws2009/tgdi/script/Kapitel07v0.pdf differ diff --git a/ws2009/tgdi/script/Kapitel08v0-Teil1.pdf b/ws2009/tgdi/script/Kapitel08v0-Teil1.pdf new file mode 100644 index 00000000..5b22dcdd Binary files /dev/null and b/ws2009/tgdi/script/Kapitel08v0-Teil1.pdf differ diff --git a/ws2009/tgdi/script/TGDI09-Orga.pdf b/ws2009/tgdi/script/TGDI09-Orga.pdf new file mode 100644 index 00000000..2a9e49b1 Binary files /dev/null and b/ws2009/tgdi/script/TGDI09-Orga.pdf differ diff --git a/ws2009/tgdi/script/VerilogUebersicht.pdf b/ws2009/tgdi/script/VerilogUebersicht.pdf new file mode 100644 index 00000000..cd6ec7d7 Binary files /dev/null and b/ws2009/tgdi/script/VerilogUebersicht.pdf differ diff --git a/ws2009/tgdi/script/befehlssatz_mips.pdf b/ws2009/tgdi/script/befehlssatz_mips.pdf new file mode 100644 index 00000000..7a050272 Binary files /dev/null and b/ws2009/tgdi/script/befehlssatz_mips.pdf differ diff --git a/ws2009/tgdi/script/cpus2009ahk0.pdf b/ws2009/tgdi/script/cpus2009ahk0.pdf new file mode 100644 index 00000000..84198951 Binary files /dev/null and b/ws2009/tgdi/script/cpus2009ahk0.pdf differ diff --git a/ws2009/tgdi/script/ise11.pdf b/ws2009/tgdi/script/ise11.pdf new file mode 100644 index 00000000..d3d80b9a Binary files /dev/null and b/ws2009/tgdi/script/ise11.pdf differ