Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    emard
    @emard
    youre'welcome, I also added to MANUAL.md of ulx3s about the AD/DA modules. They costed $20 but now are expensive near 60$
    @pnru_gitlab https://github.com/emard/ulx3s-misc/tree/master/examples/rtc/i2c_master/proj here is small RTC i2c master example. It will display seconds on LEDs as BCD and full date/time on st7789 mini display.
    Paul Ruiz
    @pnru_gitlab

    Looked into early RTC chips. The first one seems to have been the OKI MSM5832, which was used on a few S-100 boards around 1980. It has an awkward 4 bit interface though. If I get around to a new SBC I will probably use the MM58167. The software interface is always the same: a bank of byte registers with the time / alarm / config data (and sometimes 50-100 bytes of nvram).

    @emard I am not sure which chip the ULX3S uses. The crowd supply page says MCP7940 but the schematic refers to the PCF8523. Both seem to have the same "bank of registers interface, though. If you can provide me with a verilog module that connects to the RTC chip and offers a bus interface similar to that of MM58167 to the CPU, I will integrate it with the Mini Cortex and write the Unix driver for it. I am not bothered if the registers don't match in number or meaning with the MM58167.

    It would be fun to have shutdown -r working on a V6 :^)

    Sometimes life is simpler than first imagined. I realized that 9600 Baud is about 1000 characters per second and the Cortex cannot keep up with even that. Luckily nobody types that fast. I did the change to the rom to set the half-bit timer to 4 clocks but the FTDI does not accept that - too far off. Then I also tweaked the internal clock of the 9902 by changing the divider from 25 to 27. Now it works fine at 115200. Just don't type at that speed.
    Paul Ruiz
    @pnru_gitlab
    The rom change is this:
    0460 0142 0009 0004 0012 0004 0023 0004 // 0x0080 // baud 115200
    0046 0004 008d 0004 0119 0004 02a4 0004 // 0x0090 // baud 115200
    7fff 0004 0d0a 4552 524f 5220 000d 0a45 // 0x00a0 // baud 115200
    emard
    @emard
    It is MCP7940N used now. Early v1.7 boards had PCF8523 but it was unreliable, forgetting time and MCP is cheaper and better. It has documented bug that setting time registers must be verified by read and retried until desired value is read there. The verilog module is here https://github.com/emard/ulx3s-misc/tree/master/examples/rtc/i2c_master/proj however it only reads RTC. RTC will start "ticking" after it has been initialized and for this we have esp32 and ntp: https://github.com/emard/ulx3s-misc/tree/master/examples/rtc/micropython-mcp7940n
    Verilog module can write also but I haven't implemented some "gui" for user friendly setup
    OH I see the comment refers to old PCF :)
    emard
    @emard
    It's speed of VCC fall time and MCP datasheet is in Note1 not "100%" shure how fast can it fall for reliable switchover to battery so I keep refering to PCF datasheet which "knows"
    emard
    @emard
    I can verify that your divider 27 and above ROM patch make cortex work at 115200. I promise I won't type faster than 1000 cps
    If I'm asked, this patch can go to mainstream :)
    Kristin Davidson
    @aphistic
    @emard thanks for the recommendation on the female headers for the SD1331 display! I wouldn't have thought of that but it makes so much sense. :)
    Kristin Davidson
    @aphistic
    @lawrie thanks for the insights on risc-v on ulx3s. :) i was thinking of following the linux-on-litex-vexriscv because i want to work on a hobby OS for risc-v in rust and thought it would be a good place to start because it comes with things like an MMU and other hardware. I don't mind learning new things (on the contrary!), though, so if it's better for me to start with something less involved and build something simpler to start with i could do that. for the usb to jtag programmer, do you have one you'd recommend? i've done some preliminary searching in the past but so far i've only gotten an stlink-v3mini and jlink edu mini, not a jtag device. i don't mind paying more than normal for a hobbyist for one but it is still a hobby, so i'm looking for something that's not too expensive. i think i'm jumping in the deep end here (my experience is software dev with a focus/interest in systems) so i'm still trying to learn what all a jtag, uart and the like do.
    Kristin Davidson
    @aphistic
    oh, and for the headers being soldered on the ulx3s I was trying to figure out the best way to do it. Should I have two rows on each side pointing "up" (fpga side), "down" (opposite fpa side) or one row on each side going both "up" and "down" so it can be used with either a bread board or some male-female jump wires... or even a row of female headers to use male-male jump wires?
    Lawrie Griffiths
    @lawrie
    @aphistic It is VexRiscv (written in SpinalHDL) which supports the MMU. LiteX is a collection of peripherals written in migen that talk to the risc-v cpu via a wishbone bus. Litex used to support a lot more peripherals than were supported by SpinalHDL but SpinalHDL with SaxonSoc is catching up fast.
    There are projects that support Rust using litex on the the Ulx3s board, such as http://pepijndevos.nl/2020/08/04/a-rust-hal-for-your-litex-fpga-soc.html
    There are pure SpinalHDL examples on an ECP5 board such as https://craigjb.com/2020/01/22/ecp5/. (That is not on a Ulx3s but porting is probably not hard).
    Lawrie Griffiths
    @lawrie
    If you are new to FPGAs you need to decide which HDLs to learn such as Verilog, VHDL, SystemVerilog, SpinalHDL, Migen, nMigen, Chisel. Or you may be interested more in the software side and want to build SoCs from a library of existing components.
    I have not tried Rust on an FPGA. I don't currently use Migen or nMigen, and I have delayed using LiteX as it uses the older Migen and I don't really want to learn both python HDLs. I believe it is in the LiteX roadmap to move to nMigen, but that may take a while.
    Lawrie Griffiths
    @lawrie
    I don't often use JTAG with my FPGA projects as there are usually better alternatives. When I did I mainly used the Lychee Tang programmer - https://www.aliexpress.com/i/4000042458146.html?spm=2114.12057483.0.0.38051d79Az7DT9
    But that is not the best supported one.
    emard
    @emard
    @aphistic I would recommend soldering MALE pins pointing DOWN. It is "compatible" with 3D printed plastic box. Standard IDE 40-pin cable can be used to connect and this cable you can either cut or recrimp to fit different modules. For protobard it needs some "inventions" perhaps obtaining male-female 1-row adapters or making flat cable to protoboard adapter by soldering male header to male IC sockets.
    @emard best programmer is to obtain FT2232 or FT4232 breakout board. It doesn't need to be exactly named JTAG programmer, but this FT2232 chip is all that is needed. try to optimize price and find some board with EEPROM onboard so you can program USB ID to make it be "recognized" as something vendor specific. Lattice and xilinx and all tools support natively FT2232 programmers. Im not sure is altera still living in stone age with some usb-8051 chips
    Lawrie Griffiths
    @lawrie
    @aphistic I tend to solder 90 degree female headers to my Ulx3s boards, as they work best with Pmods, but it depends what project you have in mind.
    emard
    @emard
    To have GP/GN not be swapped from "default" design, Either solder 90° FEMALE headers on top side of board (nice for PMODs directly) or straight 0° MALE pins down on bottom side of board. PMODs can also plug to other end of flat cable and pinout will be identical as if 90° was soldered onboard.
    Lawrie Griffiths
    @lawrie
    I have just tried nmigen on the Ulx3s and getting it working was a pain, but I now have a blinky.
    My first mistake was installing the m-labs version which I got when I googled nmigen. That version is out of date and did not support the Ulx3s. So I uninstalled that.
    emard
    @emard
    Wow I know installation is terrible but great. I have tried "Silice" (the one for DOOM engine). The installation is not needed, just one exe file which works everywhere and blinky quickly
    Lawrie Griffiths
    @lawrie
    I am using Ubuntu 20.04, so I need to use pip3 not pip. (You can't get python2 pip on 20.04 easily).
    The installation instructions for nmgen-boards says "Todo", so I installed it like the m_labs version said.
    I changed the blinky example to use ULX3S_85F_Platform and ran that. It complained that tool {} was missing.
    It seemed that it needed OpenFpgaLoader for upload, so I installed that, and then the blinky worked.
    Lawrie Griffiths
    @lawrie
    So this is the nmigen blinky:
    from nmigen import *
    from nmigen_boards.ulx3s import *
    
    
    class Blinky(Elaboratable):
        def elaborate(self, platform):
            led   = platform.request("led", 0)
            timer = Signal(26)
    
            m = Module()
            m.d.sync += timer.eq(timer + 1)
            m.d.comb += led.o.eq(timer[-1])
            return m
    
    
    if __name__ == "__main__":
        platform = ULX3S_85F_Platform()
        platform.build(Blinky(), do_program=True)
    emard
    @emard
    Wow, very pythonic :)
    @pnru_gitlab did you get RTC working? i2c bridge example I have recommended to set RTC time but it works only if compiled with diamond and not compiled with trellis, some bidirectional issues we have. Not initialized RTC will not start ticking.
    Lawrie Griffiths
    @lawrie
    There are some Ulx3s nmigen examples here - https://github.com/GuzTech/ulx3s-nmigen-examples
    emard
    @emard
    Hey they also have OLED examples!
    They also pythonized ecp5pll.py :)
    Lawrie Griffiths
    @lawrie
    The DVI example put a pattern on my screen. I assume the Oled example is for the SSD1331. I need to find that.
    emard
    @emard
    Yes example seems to be for SSD1331. I have generalized the spi_display core to fit for several displays SSD1331/1351/1306 and SST7789
    Lawrie Griffiths
    @lawrie
    I have a pattern on the SSD1331 now.
    Those @GuzTech examples are very recent - just 7 days ago.
    emard
    @emard
    Wonderful work is done there to make programmers work easier. Probably he didnt knew (or I have hidden too much spi_display which replaces ssd1331-only driver). But kudos for porting ecp5pll.py that is difficult stuff to port
    I don't know if that is possible but like to have possibility for nmigenator (like verilator), the interpreter that will only from given nmigen code produce signals, skipping translation to verilog. It can then allow introspection using python to use hi-level language to track down bugs
    Lawrie Griffiths
    @lawrie
    Another interesting project written in nmigen, which now runs on the Ulx3s is Luna - https://github.com/greatscottgadgets/luna
    emard
    @emard
    Yes this project is great! I think LUNA should already have ulx3s board, Goran told me something. For USB sniffing, here's shopping lists in the manual https://github.com/emard/ulx3s/blob/master/doc/MANUAL.md#us2-connector-as-otg-ps2-or-sniffer I have all parts and it works for kbd/mouse
    emard
    @emard
    I see I have to refresh ebay links changed
    Paul Ruiz
    @pnru_gitlab
    @emard did you get RTC working? Uhm.. haven't tried really - sorry. The way I understand the example is that it demonstrates an i2c controller reading a responder. What I need is a module that hides the i2c completely and exposes a retro RTC chip interface, both read and write (a bit like the spi_ide module does). Moving from the example to what I need requires a deep dive into i2c and the RTC chip - I do not want to do that deep dive at this point in time.