Skip to content

Commit df706fa

Browse files
committed
Initial commit
0 parents  commit df706fa

13 files changed

+506
-0
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/.bsp
2+
/.idea
3+
/build
4+
/project
5+
/target
6+
/test_run_dir

Makefile

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
TOP = Top
3+
BUILD_DIR = build
4+
5+
PART = xc7a35tcpg236-1
6+
CONFIG_PART = xc7a35t_0
7+
8+
SRCS = $(wildcard src/main/scala/*.scala) $(wildcard src/main/scala/**/*.scala)
9+
BLACKBOXES =
10+
BLACKBOXTARGETS = $(addprefix $(BUILD_DIR)/, $(BLACKBOXES))
11+
12+
VIVADO_ARGS = -nojournal -log $(BUILD_DIR)/vivado.log -tempDir $(BUILD_DIR)
13+
14+
TEST_FILE ?= test.txt
15+
K ?= 4
16+
17+
all: gen synth
18+
gen: $(BUILD_DIR)/$(TOP).v
19+
synth: $(BUILD_DIR)/$(TOP).bit
20+
21+
clean:
22+
rm -rf $(BUILD_DIR)
23+
24+
$(BUILD_DIR)/$(TOP).v: $(SRCS)
25+
@mkdir -p $(@D)
26+
sbt "runMain $(TOP) --target-dir $(BUILD_DIR) --test-file $(TEST_FILE) --k $(K)"
27+
28+
$(BUILD_DIR)/$(TOP).bit: $(BUILD_DIR)/$(TOP).v pinout.xdc $(BUILD_DIR)/synth.tcl
29+
vivado $(VIVADO_ARGS) -mode batch -source $(BUILD_DIR)/synth.tcl
30+
@rm -rf usage_statistics_webtalk.html usage_statistics_webtalk.xml
31+
32+
download: $(BUILD_DIR)/$(TOP).bit $(BUILD_DIR)/config.tcl
33+
vivado $(VIVADO_ARGS) -mode batch -source $(BUILD_DIR)/config.tcl
34+
@rm -rf .Xil usage_statistics_webtalk.html usage_statistics_webtalk.xml webtalk.jou webtalk.log
35+
36+
$(BUILD_DIR)/synth.tcl: $(BLACKBOXTARGETS) $(BUILD_DIR)/$(TOP).v
37+
echo "\
38+
read_verilog [ glob $(BUILD_DIR)/$(TOP).v $(BLACKBOXTARGETS) ]\n\
39+
read_xdc ./pinout.xdc\n\
40+
synth_design -top $(TOP) -part $(PART)\n\
41+
opt_design\n\
42+
place_design\n\
43+
route_design\n\
44+
report_timing_summary -file $(BUILD_DIR)/sta.rpt\n\
45+
report_utilization -file $(BUILD_DIR)/util.rpt\n\
46+
write_bitstream $(BUILD_DIR)/$(TOP).bit -force" > $(BUILD_DIR)/synth.tcl
47+
48+
$(BUILD_DIR)/config.tcl:
49+
echo "\
50+
open_hw_manager \n\
51+
connect_hw_server -allow_non_jtag \n\
52+
open_hw_target \n\
53+
current_hw_device [get_hw_devices $(CONFIG_PART)] \n\
54+
refresh_hw_device -update_hw_probes false [lindex [get_hw_devices $(CONFIG_PART)] 0] \n\
55+
set_property PROBES.FILE {} [get_hw_devices $(CONFIG_PART)] \n\
56+
set_property FULL_PROBES.FILE {} [get_hw_devices $(CONFIG_PART)] \n\
57+
set_property PROGRAM.FILE {./$(BUILD_DIR)/$(TOP).bit} [get_hw_devices $(CONFIG_PART)] \n\
58+
program_hw_devices [get_hw_devices $(CONFIG_PART)] \n\
59+
refresh_hw_device [lindex [get_hw_devices $(CONFIG_PART)] 0] \n\
60+
close_hw_manager" > $(BUILD_DIR)/config.tcl

build.sbt

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
3+
scalaVersion := "2.12.13"
4+
5+
scalacOptions ++= Seq(
6+
"-deprecation",
7+
"-feature",
8+
"-unchecked",
9+
"-language:reflectiveCalls",
10+
)
11+
12+
resolvers ++= Seq(
13+
Resolver.sonatypeRepo("snapshots"),
14+
Resolver.sonatypeRepo("releases")
15+
)
16+
17+
val chiselVersion = "3.5.0"
18+
addCompilerPlugin("edu.berkeley.cs" %% "chisel3-plugin" % chiselVersion cross CrossVersion.full)
19+
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % chiselVersion
20+
libraryDependencies += "edu.berkeley.cs" %% "chisel-iotesters" % "2.5.0"
21+
libraryDependencies += "edu.berkeley.cs" %% "chiseltest" % "0.5.0"

pinout.xdc

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
set_property IOSTANDARD LVCMOS33 [get_ports *]
2+
3+
set_property CONFIG_VOLTAGE 3.3 [current_design]
4+
set_property CFGBVS VCCO [current_design]
5+
6+
## Clock signal
7+
set_property PACKAGE_PIN W5 [get_ports {clock}]
8+
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clock}]
9+
10+
## Switches
11+
#set_property PACKAGE_PIN V17 [get_ports {sw[0]}]
12+
#set_property PACKAGE_PIN V16 [get_ports {sw[1]}]
13+
#set_property PACKAGE_PIN W16 [get_ports {sw[2]}]
14+
#set_property PACKAGE_PIN W17 [get_ports {sw[3]}]
15+
#set_property PACKAGE_PIN W15 [get_ports {sw[4]}]
16+
#set_property PACKAGE_PIN V15 [get_ports {sw[5]}]
17+
#set_property PACKAGE_PIN W14 [get_ports {sw[6]}]
18+
#set_property PACKAGE_PIN W13 [get_ports {sw[7]}]
19+
#set_property PACKAGE_PIN V2 [get_ports {sw[8]}]
20+
#set_property PACKAGE_PIN T3 [get_ports {sw[9]}]
21+
#set_property PACKAGE_PIN T2 [get_ports {sw[10]}]
22+
#set_property PACKAGE_PIN R3 [get_ports {sw[11]}]
23+
#set_property PACKAGE_PIN W2 [get_ports {sw[12]}]
24+
#set_property PACKAGE_PIN U1 [get_ports {sw[13]}]
25+
#set_property PACKAGE_PIN T1 [get_ports {sw[14]}]
26+
#set_property PACKAGE_PIN R2 [get_ports {sw[15]}]
27+
28+
29+
## LEDs
30+
set_property PACKAGE_PIN U16 [get_ports {io_value[0]}]
31+
set_property PACKAGE_PIN E19 [get_ports {io_value[1]}]
32+
set_property PACKAGE_PIN U19 [get_ports {io_value[2]}]
33+
set_property PACKAGE_PIN V19 [get_ports {io_value[3]}]
34+
set_property PACKAGE_PIN W18 [get_ports {io_value[4]}]
35+
#set_property PACKAGE_PIN U15 [get_ports {led[5]}]
36+
#set_property PACKAGE_PIN U14 [get_ports {led[6]}]
37+
#set_property PACKAGE_PIN V14 [get_ports {led[7]}]
38+
#set_property PACKAGE_PIN V13 [get_ports {led[8]}]
39+
#set_property PACKAGE_PIN V3 [get_ports {led[9]}]
40+
#set_property PACKAGE_PIN W3 [get_ports {led[10]}]
41+
#set_property PACKAGE_PIN U3 [get_ports {led[11]}]
42+
#set_property PACKAGE_PIN P3 [get_ports {led[12]}]
43+
#set_property PACKAGE_PIN N3 [get_ports {led[13]}]
44+
#set_property PACKAGE_PIN P1 [get_ports {led[14]}]
45+
#set_property PACKAGE_PIN L1 [get_ports {led[15]}]
46+
47+
48+
##Buttons
49+
#set_property PACKAGE_PIN U18 [get_ports btnC]
50+
#set_property PACKAGE_PIN T18 [get_ports btnU]
51+
#set_property PACKAGE_PIN W19 [get_ports btnL]
52+
#set_property PACKAGE_PIN T17 [get_ports btnR]
53+
#set_property PACKAGE_PIN U17 [get_ports btnD]
54+
55+
56+
##7 segment display
57+
#set_property PACKAGE_PIN W7 [get_ports {seg[0]}]
58+
#set_property PACKAGE_PIN W6 [get_ports {seg[1]}]
59+
#set_property PACKAGE_PIN U8 [get_ports {seg[2]}]
60+
#set_property PACKAGE_PIN V8 [get_ports {seg[3]}]
61+
#set_property PACKAGE_PIN U5 [get_ports {seg[4]}]
62+
#set_property PACKAGE_PIN V5 [get_ports {seg[5]}]
63+
#set_property PACKAGE_PIN U7 [get_ports {seg[6]}]
64+
#set_property PACKAGE_PIN V7 [get_ports {dp}]
65+
#set_property PACKAGE_PIN U2 [get_ports {an[0]}]
66+
#set_property PACKAGE_PIN U4 [get_ports {an[1]}]
67+
#set_property PACKAGE_PIN V4 [get_ports {an[2]}]
68+
#set_property PACKAGE_PIN W4 [get_ports {an[3]}]
69+
70+
71+
##VGA Connector
72+
#set_property PACKAGE_PIN G19 [get_ports {vgaRed[0]}]
73+
#set_property PACKAGE_PIN H19 [get_ports {vgaRed[1]}]
74+
#set_property PACKAGE_PIN J19 [get_ports {vgaRed[2]}]
75+
#set_property PACKAGE_PIN N19 [get_ports {vgaRed[3]}]
76+
#set_property PACKAGE_PIN N18 [get_ports {vgaBlue[0]}]
77+
#set_property PACKAGE_PIN L18 [get_ports {vgaBlue[1]}]
78+
#set_property PACKAGE_PIN K18 [get_ports {vgaBlue[2]}]
79+
#set_property PACKAGE_PIN J18 [get_ports {vgaBlue[3]}]
80+
#set_property PACKAGE_PIN J17 [get_ports {vgaGreen[0]}]
81+
#set_property PACKAGE_PIN H17 [get_ports {vgaGreen[1]}]
82+
#set_property PACKAGE_PIN G17 [get_ports {vgaGreen[2]}]
83+
#set_property PACKAGE_PIN D17 [get_ports {vgaGreen[3]}]
84+
#set_property PACKAGE_PIN P19 [get_ports {Hsync}]
85+
#set_property PACKAGE_PIN R19 [get_ports {Vsync}]
86+
87+
88+
##USB-RS232 Interface
89+
#set_property PACKAGE_PIN B18 [get_ports {RsRx}]
90+
#set_property PACKAGE_PIN A18 [get_ports {RsTx}]
91+
92+
93+
##USB HID (PS/2)
94+
#set_property PACKAGE_PIN C17 [get_ports PS2Clk]
95+
#set_property PULLUP true [get_ports PS2Clk]
96+
#set_property PACKAGE_PIN B17 [get_ports PS2Data]
97+
#set_property PULLUP true [get_ports PS2Data]
98+
99+
100+
##Pmod Header JA
101+
#set_property PACKAGE_PIN J1 [get_ports {JA[0]}]
102+
#set_property PACKAGE_PIN L2 [get_ports {JA[1]}]
103+
#set_property PACKAGE_PIN J2 [get_ports {JA[2]}]
104+
#set_property PACKAGE_PIN G2 [get_ports {JA[3]}]
105+
#set_property PACKAGE_PIN H1 [get_ports {JA[4]}]
106+
#set_property PACKAGE_PIN K2 [get_ports {JA[5]}]
107+
#set_property PACKAGE_PIN H2 [get_ports {JA[6]}]
108+
#set_property PACKAGE_PIN G3 [get_ports {JA[7]}]
109+
110+
111+
##Pmod Header JB
112+
set_property PACKAGE_PIN A14 [get_ports {io_go}]
113+
set_property PACKAGE_PIN A16 [get_ports {reset}]
114+
#set_property PACKAGE_PIN B15 [get_ports {JB[2]}]
115+
#set_property PACKAGE_PIN B16 [get_ports {JB[3]}]
116+
#set_property PACKAGE_PIN A15 [get_ports {JB[4]}]
117+
#set_property PACKAGE_PIN A17 [get_ports {JB[5]}]
118+
#set_property PACKAGE_PIN C15 [get_ports {JB[6]}]
119+
#set_property PACKAGE_PIN C16 [get_ports {JB[7]}]
120+
121+
122+
##Pmod Header JC
123+
#set_property PACKAGE_PIN K17 [get_ports {JC[0]}]
124+
#set_property PACKAGE_PIN M18 [get_ports {JC[1]}]
125+
#set_property PACKAGE_PIN N17 [get_ports {JC[2]}]
126+
#set_property PACKAGE_PIN P18 [get_ports {JC[3]}]
127+
#set_property PACKAGE_PIN L17 [get_ports {JC[4]}]
128+
#set_property PACKAGE_PIN M19 [get_ports {JC[5]}]
129+
#set_property PACKAGE_PIN P17 [get_ports {JC[6]}]
130+
#set_property PACKAGE_PIN R18 [get_ports {JC[7]}]

src/main/scala/HeapSorter.scala

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import chisel3._
2+
3+
4+
class HeapSorter extends Module {
5+
6+
val io = IO(new Bundle {
7+
8+
})
9+
10+
}

src/main/scala/Heapifier.scala

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import Types.MemoryIO
2+
import chisel3._
3+
import chisel3.experimental.ChiselEnum
4+
import chisel3.util._
5+
import Heapifier.State
6+
7+
object Heapifier {
8+
9+
object State extends ChiselEnum {
10+
val Idle, ReceiveParent, ReceiveLeftChild, ReceiveRightChildAndCompare, RequestLeftChild = Value
11+
}
12+
13+
}
14+
15+
class Heapifier(heapSize: Int) extends Module {
16+
17+
val io = IO(new Bundle {
18+
val memory = Flipped(new MemoryIO)
19+
val request = Flipped(Decoupled(new Bundle {
20+
val index = UInt(log2Ceil(heapSize).W)
21+
}))
22+
})
23+
io.memory := 0.U.asTypeOf(io.memory)
24+
25+
def leftChildIndex(x: UInt): UInt = (x << 1).asUInt
26+
def rightChildIndex(x: UInt): UInt = (x << 1).asUInt + 1.U
27+
28+
val stateReg = RegInit(State.Idle)
29+
30+
31+
val indexReg = Reg(UInt(log2Ceil(heapSize).W))
32+
val parentReg = Reg(UInt(32.W))
33+
val leftChildReg = Reg(UInt(32.W))
34+
val rightChild = WireDefault(io.memory.readValue)
35+
val captureLargest = WireDefault(0.B)
36+
val largest = RegEnable(Max(leftChildReg, rightChild, parentReg), captureLargest)
37+
val largestIsParent = largest.index === 0.U
38+
val nextParent = indexReg + largest.index
39+
40+
switch(stateReg) {
41+
is(State.Idle) {
42+
io.request.ready := 1.B
43+
indexReg := io.request.bits.index
44+
io.memory.readAddress := io.request.bits.index
45+
when(io.request.valid) {
46+
stateReg := State.ReceiveParent
47+
}
48+
}
49+
is(State.ReceiveParent) {
50+
parentReg := io.memory.readValue
51+
52+
io.memory.readAddress := leftChildIndex(indexReg)
53+
54+
stateReg := State.ReceiveLeftChild
55+
}
56+
is(State.ReceiveLeftChild) {
57+
58+
leftChildReg := io.memory.readValue
59+
60+
io.memory.readAddress := rightChildIndex(indexReg)
61+
62+
stateReg := State.ReceiveRightChildAndCompare
63+
}
64+
is(State.ReceiveRightChildAndCompare) {
65+
captureLargest := 1.B
66+
67+
stateReg := State.RequestLeftChild
68+
}
69+
is(State.RequestLeftChild) {
70+
71+
io.memory.writeAddress := indexReg
72+
io.memory.writeValue := largest.item
73+
io.memory.writeEnable := !largestIsParent
74+
75+
io.memory.readAddress := leftChildIndex(nextParent)
76+
77+
indexReg := nextParent
78+
parentReg := largest.item
79+
80+
stateReg := Mux(largestIsParent, State.Idle, State.ReceiveLeftChild)
81+
82+
}
83+
}
84+
85+
86+
}

src/main/scala/Max.scala

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
import chisel3._
3+
4+
object Max {
5+
6+
object Indexed {
7+
def fromTuple(init: (UInt,Int)): Indexed = {
8+
val w = Wire(new Indexed)
9+
w.item := init._1
10+
w.index := init._2.U
11+
w
12+
}
13+
}
14+
class Indexed extends Bundle {
15+
val item = UInt(32.W)
16+
val index = UInt()
17+
}
18+
19+
def apply(values: UInt*): Indexed =
20+
VecInit(values.zipWithIndex.map(Indexed.fromTuple)).reduceTree { (left,right) =>
21+
Mux(left.item > right.item, left, right)
22+
}
23+
24+
}

0 commit comments

Comments
 (0)