aboutsummaryrefslogtreecommitdiff
path: root/src/UART.bs
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-05-05 22:30:50 -0500
committerNathan Ringo <nathan@remexre.com>2024-05-05 22:30:50 -0500
commitf9b73dc7b93bbf60f5b2281a5056c4339e049388 (patch)
tree5325a2e6ee78bb36179c5b2b4c56da806214e426 /src/UART.bs
parent0874c7f1852145c3ae62f1e28dc10c0c89d78b45 (diff)
triyng a uart from scratch... not yet working...
Diffstat (limited to 'src/UART.bs')
-rw-r--r--src/UART.bs101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/UART.bs b/src/UART.bs
new file mode 100644
index 0000000..f837949
--- /dev/null
+++ b/src/UART.bs
@@ -0,0 +1,101 @@
+package UART where
+
+import GetPut
+import Util
+
+interface Clock =
+ clk :: Bool
+
+defaultClock :: Clock
+defaultClock =
+ interface Clock
+ clk = True
+
+mkDivider :: Integer -> Clock -> Module Clock
+mkDivider divisor clockIn =
+ module
+ count <- mkReg 0
+
+ rules
+ "increment_divider": when clockIn.clk ==> do
+ if count == fromInteger divisor then do
+ count := 0
+ else
+ count := count + 1
+
+ interface Clock
+ clk = count == 0
+
+interface ShiftRegister =
+ get :: Get (Bit 1)
+ put :: Put (Bit 1)
+
+mkShiftRegister :: Module ShiftRegister
+mkShiftRegister =
+ module
+ reg :: Reg (Bit 8) <- mkReg 0
+
+ interface ShiftRegister
+ get = interface Get
+ get = return 0
+ put = interface Put
+ put bit = do
+ return ()
+
+-- An 8n1 UART.
+interface UART =
+ -- The RX pin.
+ rxPin :: Bit 1 -> Action
+ -- The TX pin.
+ txPin :: Bit 1
+
+ -- Reads a byte from the UART.
+ rxByte :: Get (Bit 8)
+ -- Writes a byte to the UART.
+ txByte :: Put (Bit 8)
+
+mkUART :: Integer -> Module UART
+mkUART baudDivisor =
+ module
+ baud <- mkDivider baudDivisor defaultClock
+
+ count :: Reg (Bit 4) <- mkReg 0
+ rules
+ "increment_count": when baud.clk ==> do
+ count := count + 1
+
+ let start = 0
+ d0 = 1
+ d1 = 0
+ d2 = 0
+ d3 = 0
+ d4 = 1
+ d5 = 0
+ d6 = 0
+ d7 = 0
+ stop = 1
+
+ interface UART
+ rxPin _bit = when_ baud.clk $ do
+ return () -- TODO
+ txPin = case count of
+ 0 -> start
+ 1 -> d0
+ 2 -> d1
+ 3 -> d2
+ 4 -> d3
+ 5 -> d4
+ 6 -> d5
+ 7 -> d6
+ 8 -> d7
+ 9 -> stop
+ _ -> 1
+
+ rxByte = interface Get
+ get = return 0 when False
+ txByte = interface Put
+ put _ = do
+ -- TODO
+ return ()
+
+-- vim: set ft=haskell :