Using an EEPROM to replace combinational logic

Ben Eater · Beginner ·📐 ML Fundamentals ·9y ago

Key Takeaways

This video demonstrates how to use an EEPROM to replace combinational logic, including programming and reading from the EEPROM, and using it to drive a 7-segment display. The video covers the basics of EEPROMs, including how to hook up power and ground, connect IO pins to LEDs, and program values into the EEPROM.

Full Transcript

there are many kinds of ROM chips or readon memories and ROM could refer to a chip that has some data in it that you can only read and you there's no way to write it or change it so the the chip is manufactured in a way that it has that data in it um but there's other types of ROMs that are programmable and those are called proms or programmable readon memory and those usually give you some way of of programming at once so you get the chip and it's blank and then you can program it once and once you've programmed it then you can't change what's programmed in it but you can read it as much as you want and of course that can be inconvenient so they also make eoms which are erasable programmable readon memories and these usually uh can be erased by exposing them to ultraviolet light so this here is a is an eom and you see there's a little window on the top of the Chip and you can see the the die and so what you can program this and then it's a readon Memory at that point but you can also erase it by exposing the the die here to ultraviolet light so so you need some kind of ultraviolet eraser thing to uh to erase these uh otherwise you know you can also you leave them out in the sun for a few hours uh sometimes that works um which is which is why they also have these little stickers that go over top so they don't accidentally erase themselves so that's a erasable programmable readon memory but the most convenient kind is the electrically erasable programmable readon memory which is what these guys are uh which allows you to program them and then of course they act as a normal readon memory at that point but then you can also erase them and reprogram them electronically without needing to expose them to ultraviolet light or do anything uh special so the 28 c16 that's what I've got here I've got two different 28 c16s this is uh made by Catalyst this one's made by Excel um I also have the data sheet over here for the atml at 28 c16 they're all basically the same so this is 16,000 bits which is organized as 2,8 bit uh words or bytes essentially 2,000 bytes it's a parallel eom so if we take a look on the data sheet at the pinout here this is our pinout comes in a couple different packages we have the plastic dual inline package that's this guy here it's fairly straightforward there's basically eight IO pins so 0 1 2 3 4 5 six seven so eight IO pins that's for our data either they're input if we're programming it and normally they'd be output if we're reading from it and then there's 11 address lines so 0 through seven here and 8 9 and 10 over here and those address lines are used for telling it which bite we want to read or or write if we're writing to it for programming it and other than that pretty straightforward there's ground and and power for powering the thing and then there's a WR enable output enable and Chip enable which we will take a look at in a moment I'll start by hooking up power and ground the next pen I'll hook up is a pin 18 which is the chip enable and I'll hook that to ground and so Chip enable is active l low so when this is low the chip is enabled and we always want the chip to be enabled so we'll just tie that directly to ground next you'll notice there's eight IO lines so IO 0 1 2 3 4 5 6 and 7 I'm going to hook those up to some LEDs so we can uh see what's in the chip so when we we look at a particular address we'll be able to see what data is stored in the chip so I'm going to add some LEDs here that we'll use for looking at what data is in here all right so there's eight LEDs that we'll use for looking at the data now I'll connect the data pins here so io0 uh is pin I'll connect that I'll start connecting those to the LEDs so that's io0 pin 9 going to the first LED pin 10 to the next LED here and pin 11 then io3 I'll connect over here to the other side of these LEDs io4 so I've connect all these IO lines to the LED so we'll be able to see the output of the chip but we need to connect the other side of the LED over here to ground and so I'm connecting these LEDs uh to ground through these 330 ohm resistors and that's important because this uh chip doesn't have any current limiting on its outputs so if we don't have these current limiting resistors here then it's going to drive as much current as it can through the chip through the LED uh potentially damaging both the chip and the LED in the process so we don't want that so we need to do some kind of current limiting so I've got these 330 ohm resistors that are that are going from ground uh through the LED and then into the chip and so the output of the chip will uh will go through the LED into ground and uh these are a little bit asymmetrical because the the ones on this side are going through the LEDs this way and to ground and the ones on this side are going through the LEDs that way and then to ground and so these first uh five LEDs are the other way around so this should allow us to see what's coming out of these IO lines but in order to do that we've got to First tell it what address we want to we want to look at so if we want to read from address zero for example we have to set all these address lines to zero but we want to be able to select which address we're reading from so what I want to do is hook these address lines up to some switches so we can select whichever address we want so I'll put some uh dip switches here that we'll use for setting the address and I'll hook all the address lines up to those switches and so that's the first eight address lines here address Z through address 7 are hooked up through to these switches and when the switches are off we want the address lines to be low so I'm going to tie them low with a uh this is a one 10K resistor I think brown black I think that's orange this is a 10K resistor so I'm going to tie these these all low with these 10K resistors so when the switches are off these will all be tied low through these resistors when we turn the switch on then we want to connect these to 5 Vols so if we hook the other side of the switch to 5 volts then when the switch is on the pin will be high and then when the switch is off then it's it's pulled up by that resistor or pulled down I guess by that resistor to ground so we want the this side of the switches to all be tied to 5 volts and so that should take care of the first eight address lines over here now we've still got address 8 9 and 10 over on this side so I'm going to add another set of switches here and we're going to use the the I guess the the the bottom three of these for address 8 9 and 10 and I'm going to hook them up pretty much the same way and so that's address 8 9 and 10 here 8 9 and 10 hooked up to this side of the switch and so again when these switches are off we want to pull them low so I'll do that with these 10K resistors and then when the switches are on we want them to be pulled high so now we can use these first 11 switches everything but the top one here to set our address and of course 11 bits of address gives us the 2048 248 or two you know approximately 2,000 different memory locations so the only pens we haven't hooked up yet are the write enable and output enable to Output enable is let's see pin 20 and if we set that to low it's active low so if we set that to Low by tying that to ground then that will enable the output which means that whatever address we set here we see the contents down here in the in on the io lines so we can try that we can hook this up to power now so I'm going hook this up to 5 volts and what we see is all ones and so that's at address location zero and if we change this to address one we see all ones if we go to address two we still see all ones address three all ones and you might be noticing a pattern here and that's because when these chips are brand new or they're erased uh they're erased with ones in every location so all ones means the chips is erased and there's there's nothing stored there and that makes sense because we haven't programmed anything here yet so to program stuff that's where the right enable pin comes into play and to understand how that works we're going to have to take a closer look at the data sheet so if we go to page three there's this section about bite right and it says a few things it says you can use a low pulse on the right enable or chip enable input uh with the output enable high and either chip enable or right enable low respectively and that initiates a bite rate so what does that mean well you you could read that a few times and and there's some more details in there it also helps to look uh over on page six there's some timing diagrams and usually the best way to to understand these data sheets is to read them through you know at least a couple times and you know when you're reading it through it may not make sense entirely what's going on but as you see other parts of the data sheet you know you'll start to kind of get a picture of of what's going on and and so here it is helpful to to look at this timing diagram which tells you how to write and and it turns out there's there's two ways you can write you can either write to the chip using the right enable uh controlled option or the chip enable controlled option we're going to go with WR enable controlled and basically what that means is that means that it's the right enable pin going low and then high that controls the right that that tells it when to write data and the way you read these timing diagrams is is you imagine time going from left to right and there's all these different Transitions and things that are going on here and really what they're trying to do is they're trying to show you the the parameters for the timing and all of these parameters are given in this table above and so for example you know there's this uh TW WP which is the time of the right pulse so that's the time from here to here which is the time that the right enable goes low and then comes back up so how long is that pulse well time of right pulse the right pulse width it says the minimum is 100 nond and the maximum is 1,000 NS so that's good to know we have to somehow make sure that we keep that within 100 to 1,000 NCS so that that'll be important to to keep keep an eye on some of these other things are basically telling you when this WR enable goes low that's when it's going to look at the address and when the right enable goes High that's when it's going to look at the data and that's sort of corroborated over here in this description here so it says the the address location is latched on the falling edge of enable the new data is latched on the rising Edge so the address is latched on the falling Edge and the data is latched on the rising Edge and so what this timing diagr is trying to tell us is saying when this falling Edge happens here the address has to be set up prior to that happening and then after that happens the address has to be held for some period of time and so there's a setup time and a hold time for the address same thing for the data when the WR enable goes high again the data has has to be set up for some time prior to that and it has to be held for some time after that so these are all important numbers to to be aware of but you'll notice that like the address setup and address hold the data setup data hold over here so address setup address hold there's a minimum 10 NCS 50 NCS but there is no maximum which is great because we're going to be going pretty slow with this uh so as long as our address is is toggled into our our dip switches here 10 NCS before we try to write we're going to be fine and of course that won't be a problem uh and as long as we hold it you know we don't change the the dip switches within 50 NCS after trying to write then we'll be fine so no worries there same thing with the data you know when when we set the data that we want to write we have to make sure that the data is set up 50 NCS before our write enable goes high no worries that's plenty of time or you know will be much longer than 50 NS uh and we have to hold it for 10 Nan after this goes high so no worries there these minimums not going to be a problem uh the one thing that might be a little bit challenging is this right right pulse has to this pulse has to be somewhere between 100 NCS and 1,000 NCS and that's not a a huge window especially for what we're doing here because you might imagine well this the right enable pin which I think is in here yeah you can just hook that up to a push button and you want to right you push the button the problem is when you push that Buton but you're probably going to be pushing it for more than a th000 nond that's not very that's one one microsc that's not very long and the reality is it's probably okay if it's longer than this uh you know uh but one thing we can do just to just to try to to make it in this window is use a a little RC circuit so a resistor and a capacitor uh to to get this timing right so for example if we use a one nanofarad capacitor and I guess I've got a 680 Ohm resistor 680 ohms * 1 narad is 680 NCS which Falls nicely between here so I've got a 1 nerad capacitor and I've got a 680 Ohm resistor so how do we build an RC circuit that will generate this pulse that is hopefully 680 nond well let's get a button here that's going to trigger our pulse and I'm going to hook my resistor and Capac capacitor here in series with the switch and I'm hook the other side of my switch to ground and so like this over here right at this point here I'm going to have 5 volts right because I've got a resistor connected across there and it's not going to drop any current because there's no current flowing because the the switch is closed nothing's going on if I close the switch then current will flow and now this side of the capacitor will be essentially connected to ground through the capacitor if the capacitor is not charged yet and this will go down to zero immediately but very quickly the capacitor will charge up to 5 Vols and the time that it takes to charge up is dependent on the RC constant here which is you know this is a 1 nanopar capacitor this is a 680 Ohm resistor so it should be 680 NCS which works very nicely when I let go of the switch this will stay high and the capacitor will stay charged because it's not connected to anything else so I'm going to need another resistor here to discharge the capacitor when I let up the switch so I'm just going to put in a uh this is like a 10K resistor and that'll that'll just allow the capacitor to discharge when I'm not pushing the switch so normally right now the capacitor is connected both sides of the capacitor are connected through these resistors to my plus 5 volts here so essentially my capacitor just has this series resistor across it which is discharging it so the capacitor is going to be discharged this side over here is going to be 5 volts because there's no current flowing through this resistor so it's going to be 5 volts on either side when I push this then ground is going to be connected here current is going to flow through the resistor to charge the capacitor so this side of the resistor will be zero but then very quickly Rising as the capacitor charges so this should give me a a negative going Spike when I push the switch and that negative going Spike should be 680 NCS which is what we want and so that will be my right pulse because that's going to WR enable and WR enable is down here believe it's that pin there so we'll connect that over to right enable and so now when I push this button it should give a negative going 680 nond pulse into that right enable pin we can test that if I hook up power and hook up an oscilloscope probe here and we'll look at we'll look at this point here which is going to my right enable when I push the button it goes low and recovers here whereas the capacitor charges and each of these divisions is 500 nond so you can see at this point here this is 500 NCS this is 1,000 NCS here and so we're we're already up uh let's see so Zer volts 1 2 3 4 so we're up over four volts here by the time we get to that th NC so the period of time that this is low is definitely between 100 nond which would be right here and and 1,000 NCS which is over here so this is perfect okay so we have that right pulse there so now how do we actually program this thing so the first thing we want to do is set our output enable to high which means we're not enabling our output anymore uh which means that our our outputs over here are now inputs and so now we can set these inputs to whatever value we want to program and so I'm going to use these little jumpers to set a value here that we want to program into a particular address location and so let's say this is the pattern I want to program and I want to put it in address location zero so I set my address uh to zero when I hit the button here it should now have that programmed into address zero if I want to program something different into address one I can go to address one and I can change these around so I can change to program something different so I just swapped all the bits and we'll put that in address one by hitting our right enable and that gives us our nice six 80ish Nan pulse to write that into address one and we could go ahead and program address 2 3 4 whatever uh but for now we'll just we'll just do those and so now if I want to go back to reading I disconnect all of these because these are no longer going to be inputs these are going to be outputs so I want to make sure those are disconnected and then I go back for and set my output enable from high back to active low so we're now output enable and so now you see in address one we we have this pattern and if I go to address zero we have the other pattern that I programmed and if we go to address two or or three we we still see the all ones because I haven't programmed any of any of those locations so maybe you're thinking this is pretty cool but how can we use it to do something a little bit more practical well you might recall this circuit that we put together in a previous video which basically just takes uh four bits of input over here and lights up a display to show us the number so if it's two or three or four uh or this is C which is heximal for 12 which is this is binary 12 so we have all this logic just to get this display to work well it turns out you can replace any combinational logic circuit with a ROM and so rather than having to design this complicated circuit with all of these Gates and and everything going on here we could replace all of this with a ROM and that's because if you remember where this came from we started with this basic truth table which just describes how the data bits coming in relate to whether the segments are turned on or off well we could actually program this truth table into a ROM and these data bits become the address and then the data output of the ROM becomes these these uh outputs over here so at address 0 we could program in 000000001 at address one the ROM we can program in 1 0 0 1 1 1 one and so forth and then we could put the ROM in the circuit instead of this and instead of these switches feeding the input of this uh fairly comple complicated logic circuit these switches could feed the address of our ROM and then the outputs instead of coming out of the these collection of or Gates and so forth up here those outputs would just come directly out of the ROM so let's give it a try let's set our output enable to high so it's off and let's go to address zero and just start programming so first off we're going to have all zeros but with a one at the end so I'll set that to one and then tie the rest of these to ground and so there we go and I'll program that now we go to address one so that's address one program that we'll go to address two okay so if I didn't make any mistakes which I almost certainly did that should be everything programmed so now I'll disconnect all of my connections here so we're no longer programming and put it back into output enable mode and we see three 1es and three zeros which is what we'd expect to see for 11 one1 as our input which it is so that's a good verification and if I switch to other things I get other outputs but now the real test will be let's try hooking the output of this thing up to a seven segment display so we'll hook the anode here through this 100 ohm resistor to our positive Supply over here and then these bits should go over here and that doesn't look like a zero let's see what did I do wrong oh I got these hooked up backwards so the one on the right here is G and I hooked it up to a so that makes sense these are all backwards yeah there we go so zero we got zero and now let's try try it out well there's one no that's not two but we'll keep going that's three four five six 7 8 9 a there's B C D E and F so it looks like most everything is right but it was what was it two yeah two is wrong so two let's see what did I do so two should be 0 0 1 0 0 1 0 so 0 0 1 0 0 1 0 so I got that bit off by one so let me try to fix that that looks like a two and real quick we can just check all the other numbers just to make sure zero one 2 3 4 5 6 7 8 9 A B C D E and F there we go so not super fun to program it using uh little jumper wires like this but certainly a lot more fun than uh designing this whole thing and trying to build this thing and certainly a lot more flexible too and you could probably start to imagine how we could use a couple of these for each digit to do a you know decimal display or or actually display uh something more than just a single hexadecimal digit for four bits but we'll get to that in in future videos uh the the thing I want to cover in the next video is actually a much faster way to program these without having to set all these jumpers because you can imagine that gets pretty tedious once you get you know 256 or more values into here what I want to do in the next video is build a nice programmer for these eom chips and that's going to be especially useful because we're going to be using a number of these chips both in the output display as well as in the control logic of our computer

Original Description

In this video, we'll wire up an EEPROM (28C16) so we can read its contents. We'll also take a look at the data sheet to learn how to program it, and try programming some values. Finally, we'll see how the EEPROM can be used to replace any combinational logic circuit such as the 7-segment decoder from the previous video (https://youtu.be/7zffjsXqATg) Support me on Patreon: https://www.patreon.com/beneater You can get all the components used in this video from any online electronic components distributor for a few dollars. Complete parts list (everything in this video): - 1x 28C16 EEPROM - 8x LEDs - 8x 330Ω resistors - 1x 8-position DIP switch - 1x 4-position DIP switch - 12x 10kΩ resistors - 1x 100nF capacitor - 1x 680Ω resistor - 1x momentary tact switch - 1x Common Anode 7-segment display - 1x 100Ω resistor
Watch on YouTube ↗ (saves to browser)
Sign in to unlock AI tutor explanation · ⚡30

Playlist

Uploads from Ben Eater · Ben Eater · 23 of 60

1 KA 60 Minutes Sep 2013 rerun (10x speed)
KA 60 Minutes Sep 2013 rerun (10x speed)
Ben Eater
2 Frame formats | Networking tutorial (6 of 13)
Frame formats | Networking tutorial (6 of 13)
Ben Eater
3 TCP: Transmission control protocol | Networking tutorial (12 of 13)
TCP: Transmission control protocol | Networking tutorial (12 of 13)
Ben Eater
4 Clock synchronization and Manchester coding | Networking tutorial (3 of 13)
Clock synchronization and Manchester coding | Networking tutorial (3 of 13)
Ben Eater
5 TCP connection walkthrough | Networking tutorial (13 of 13)
TCP connection walkthrough | Networking tutorial (13 of 13)
Ben Eater
6 Lower layers of the OSI model | Networking tutorial (7 of 13)
Lower layers of the OSI model | Networking tutorial (7 of 13)
Ben Eater
7 Hop-by-hop routing | Networking tutorial (11 of 13)
Hop-by-hop routing | Networking tutorial (11 of 13)
Ben Eater
8 Sending digital information over a wire | Networking tutorial (1 of 13)
Sending digital information over a wire | Networking tutorial (1 of 13)
Ben Eater
9 ARP: Mapping between IP and Ethernet | Networking tutorial (9 of 13)
ARP: Mapping between IP and Ethernet | Networking tutorial (9 of 13)
Ben Eater
10 Analyzing actual Ethernet encoding | Networking tutorial (4 of 13)
Analyzing actual Ethernet encoding | Networking tutorial (4 of 13)
Ben Eater
11 Intro to fiber optics and RF encoding | Networking tutorial (2 of 13)
Intro to fiber optics and RF encoding | Networking tutorial (2 of 13)
Ben Eater
12 The Internet Protocol | Networking tutorial (8 of 13)
The Internet Protocol | Networking tutorial (8 of 13)
Ben Eater
13 Looking at ARP and ping packets | Networking tutorial (10 of 13)
Looking at ARP and ping packets | Networking tutorial (10 of 13)
Ben Eater
14 The importance of framing | Networking tutorial (5 of 13)
The importance of framing | Networking tutorial (5 of 13)
Ben Eater
15 Programming my 8-bit breadboard computer
Programming my 8-bit breadboard computer
Ben Eater
16 Programming Fibonacci on a breadboard computer
Programming Fibonacci on a breadboard computer
Ben Eater
17 Connecting to a mystery signal | Digital electronics (4 of 10)
Connecting to a mystery signal | Digital electronics (4 of 10)
Ben Eater
18 Using a transistor to solve our problem | Digital electronics (8 of 10)
Using a transistor to solve our problem | Digital electronics (8 of 10)
Ben Eater
19 Inverting the signal with a transistor | Digital electronics (9 of 10)
Inverting the signal with a transistor | Digital electronics (9 of 10)
Ben Eater
20 8-bit computer update
8-bit computer update
Ben Eater
21 Bus architecture and how register transfers work - 8 bit register - Part 1
Bus architecture and how register transfers work - 8 bit register - Part 1
Ben Eater
22 RAM module build - part 2
RAM module build - part 2
Ben Eater
Using an EEPROM to replace combinational logic
Using an EEPROM to replace combinational logic
Ben Eater
24 Build an Arduino EEPROM programmer
Build an Arduino EEPROM programmer
Ben Eater
25 Build an 8-bit decimal display for our 8-bit computer
Build an 8-bit decimal display for our 8-bit computer
Ben Eater
26 8-bit CPU control logic: Part 2
8-bit CPU control logic: Part 2
Ben Eater
27 Reprogramming CPU microcode with an Arduino
Reprogramming CPU microcode with an Arduino
Ben Eater
28 Update and PODCAST ANNOUNCEMENT!
Update and PODCAST ANNOUNCEMENT!
Ben Eater
29 The case against Net Neutrality?
The case against Net Neutrality?
Ben Eater
30 Making a computer Turing complete
Making a computer Turing complete
Ben Eater
31 CPU flags register
CPU flags register
Ben Eater
32 Conditional jump instructions
Conditional jump instructions
Ben Eater
33 “Hello, world” from scratch on a 6502 — Part 1
“Hello, world” from scratch on a 6502 — Part 1
Ben Eater
34 What is a stack and how does it work? — 6502 part 5
What is a stack and how does it work? — 6502 part 5
Ben Eater
35 RAM and bus timing — 6502 part 6
RAM and bus timing — 6502 part 6
Ben Eater
36 Subroutine calls, now with RAM — 6502 part 7
Subroutine calls, now with RAM — 6502 part 7
Ben Eater
37 Why build an entire computer on breadboards?
Why build an entire computer on breadboards?
Ben Eater
38 How assembly language loops work
How assembly language loops work
Ben Eater
39 Binary to decimal can’t be that hard, right?
Binary to decimal can’t be that hard, right?
Ben Eater
40 Hardware interrupts
Hardware interrupts
Ben Eater
41 What is error correction? Hamming codes in hardware
What is error correction? Hamming codes in hardware
Ben Eater
42 Installing the world’s worst video card
Installing the world’s worst video card
Ben Eater
43 World's worst video card gets better?
World's worst video card gets better?
Ben Eater
44 Breadboarding tips
Breadboarding tips
Ben Eater
45 So how does a PS/2 keyboard interface work?
So how does a PS/2 keyboard interface work?
Ben Eater
46 Keyboard interface hardware
Keyboard interface hardware
Ben Eater
47 Keyboard interface software
Keyboard interface software
Ben Eater
48 How does a USB keyboard work?
How does a USB keyboard work?
Ben Eater
49 How does USB device discovery work?
How does USB device discovery work?
Ben Eater
50 How does n-key rollover work?
How does n-key rollover work?
Ben Eater
51 SPI: The serial peripheral interface
SPI: The serial peripheral interface
Ben Eater
52 Why was Facebook down for five hours?
Why was Facebook down for five hours?
Ben Eater
53 How do hardware timers work?
How do hardware timers work?
Ben Eater
54 The RS-232 protocol
The RS-232 protocol
Ben Eater
55 Hacking a weird TV censoring device
Hacking a weird TV censoring device
Ben Eater
56 Let's build a voltage multiplier!
Let's build a voltage multiplier!
Ben Eater
57 6502 serial interface
6502 serial interface
Ben Eater
58 RS232 interface with the 6551 UART
RS232 interface with the 6551 UART
Ben Eater
59 Fixing a hardware bug in software (65C51 UART)
Fixing a hardware bug in software (65C51 UART)
Ben Eater
60 Running Apple 1 software on a breadboard computer (Wozmon)
Running Apple 1 software on a breadboard computer (Wozmon)
Ben Eater

This video teaches how to use an EEPROM to replace combinational logic, including programming and reading from the EEPROM, and using it to drive a 7-segment display. The video covers the basics of EEPROMs and digital logic, and demonstrates how to build a simple digital circuit.

Key Takeaways
  1. Hook up power and ground to the EEPROM
  2. Connect IO pins to LEDs
  3. Program values into the EEPROM
  4. Build an RC circuit to generate a pulse
  5. Use the EEPROM to drive a 7-segment display
  6. Program a truth table into a ROM
  7. Hook up the ROM to a display with jumper wires
💡 EEPROMs can be used to replace combinational logic, and can be programmed to store truth tables and other digital logic functions.

Related Reads

📰
Embedding Machine Learning with Computational Fluid Dynamics simulations: a possible marriage?
Learn how to combine machine learning with Computational Fluid Dynamics simulations for enhanced turbulence modeling
Medium · Machine Learning
📰
The Day Jacobian and Hessian Matrices Changed How I Think About Knowledge
Learn how Jacobian and Hessian matrices can change your perspective on knowledge and its applications in machine learning
Medium · AI
📰
Reliability-First Patch Embedding: Designing and Testing the Foundation of a Vision Transformer
Learn to design and test reliable patch embedding for Vision Transformers, a crucial step before attention layers can operate
Medium · Machine Learning
📰
How to Master C++
Master C++ with a clear roadmap for computer science students, improving coding skills and career prospects
Medium · Programming
Up next
AI Glossary Explained | Epoch, Overfitting, Hallucination & More | Part 2 | Tamil | Karthik's Show
Karthik's Show
Watch →