6502.org Forum  Projects  Code  Documents  Tools  Forum
It is currently Fri Nov 22, 2024 9:51 pm

All times are UTC




Post new topic Reply to topic  [ 217 posts ]  Go to page Previous  1 ... 11, 12, 13, 14, 15  Next
Author Message
 Post subject: Re: 65VM02
PostPosted: Mon Jun 05, 2017 11:04 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
BigDumbDinosaur wrote:
barrym95838 wrote:
BigDumbDinosaur wrote:
... So much for the idea of the 65VM02 being generally useful. You're basically designing a Forth-specific processor.

Now we just need to convince everyone that Forth is generally useful, and all is once again right in the universe. :D

You'll never convince me. :D

I gave up on trying to proselytize programmers on Forth 30 years ago.

I have said a dozen times that the 65VM02 is intended to support any language, not just Forth. The instructions I mentioned that treat YA as a 16-bit register-pair should be useful in any context.

I doubt that BDD has read my document. He is just contradicting everything that I say.

BDD: I'm not trying to convince you to care about the 65VM02 --- you obviously think it is a stupid idea --- why don't you just ignore it?


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Tue Jun 06, 2017 5:49 am 
Offline
User avatar

Joined: Thu Dec 11, 2008 1:28 pm
Posts: 10986
Location: England
I agree, Hugh, there's no benefit in hearing from people who are not interested in a topic. It would be polite and respectful of them to ignore the topic.


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Tue Jun 06, 2017 6:23 am 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
Hugh Aguilar wrote:
GARTHWILSON wrote:
In Forth, (ZP,X) is used to point to memory locations whose addresses are on the data stack, since the programmer won't know ahead of time where the top of the stack will be when the particular code is run. Storing, retrieving, or RMW instructions to locations whose addresses are on the data stack are all game. X is the stack pointer.

In my current design, I am assuming that a split-stack is used. This means that you have one stack for low bytes and one stack for high bytes, both indexed by X (I got this idea from ISYS Forth on the Apple-IIc that my cross-compiler was compatible with). The advantage here is that only one INX is needed to drop a 16-bit value from the data-stack, and one DEX to make room for a new 16-bit value.

I'm thinking now however, that I might change this and go with a combined stack in which the low and high byte are juxtaposed.

Well, I changed the design (attached). I now have a lot of new instructions that support YA as a 16-bit register-pair. The 65c02 has always been weak at handling 16-bit data, but I don't want to upgrade to 16-bit registers as Michael Morris did with his M65c02 design. Instead, I keep the same registers but support 16-bit data in YA. This means that the Forth compiler will now use a combined stack, with the low and high bytes juxtaposed, rather than the split-stack that I had before. Almost every program uses 16-bit data of some kind, so the YA instructions aren't specific to Forth --- they should be useful in C, Pascal, etc. --- they would be useful in assembly-language too, although I don't foresee anybody programming entire programs on the 65VM02 in assembly-language.

This is the list of all new instructions:
Code:
These are the new instructions (none affect the flags unless explicitly described as doing so):
JVM page            jump through the pointer located at (page*$100 OR 2*A) --- the page value has to be even
OPY                 load Y with (IP) in the first far-bank, then increment IP
OPA                 load A with (IP) in the first far-bank, then increment IP
OPYA                effectively: OPY OPA
INIP                increment IP --- mostly used in conditional branches that don't branch
EXIP                exchange IP with YA
YIP                 add the signed value in Y to IP
FLDA (direct),Y     load A through a 3-byte pointer with a value in far-memory, setting the N Z flags
FSTA (direct),Y     store A through a 3-byte pointer to far-memory
LLY                 load Y with the offset to the bottom value of the return-stack from the page boundary
AAS                 add A to S
EXAD                exchange A and D
EXA (direct),Y      exchange A with value at (direct),Y and set the N Z flags according to the new value in A
DINX                add 2 to X                      effectively the same as: INX INX
DDEX                subtract 2 from X               effectively the same as: DEX DEX
PHYA                push YA to the return-stack     effectively the same as: PHA PHY
PLYA                pull YA from the return-stack   effectively the same as: PLY PHA
NGYA                negate YA and set the N Z flags according to the new value in YA
ADYA direct         add YA to value at direct-page variable and set the N Z flags according to the new value in YA
ADYA direct,X       add YA to value at direct,X and set the N Z flags according to the new value in YA
EXYA direct,X       exchange YA with value at direct,X and set the N Z flags according to the new value in YA
LDYA direct         load YA from the direct-page variable
STYA direct         store YA to the direct-page variable
LDYA direct,X       load YA from the direct-page indexed by X
STYA direct,X       store YA to the direct-page indexed by X
LDYA (direct,X)     load YA indirectly from an array of direct-page pointers indexed by X
STYA (direct,X)     store YA indirectly to an array of direct-page pointers indexed by X
TST                 test YA, setting the N and Z flags (appropriate for the whole 16-bit value)
MUL                 multiply A by Y unsigned, leaving the product in YA
SGN                 sign-extend A into YA (set A to -1 or 0), setting the N and Z flags for the 16-bit result
ADY #value          add the value to Y, setting the N Z V and C flags (in the same way as ADC does)
SBY #value          subtract the value from Y, setting the N Z V and C flags (in the same way as SBC does)
CMPH direct,X       like CMP, but uses the old C-flag (doesn't assume it is 1), and AND's the old Z-flag with the new Z-flag
BLT offset          branch if less than                 branch if  N <> V
BGT offset          branch if greater than              branch if  N = V and ~Z
MRTI                used to terminate MIRQ ISRs (similar to how RTI is used to terminate IRQ and NMI ISRs)
SEM                 sets the M-flag (this masks MIRQ interrupts, similar to SEI for IRQ)
CLM                 clears the M-flag (this allows MIRQ interrupts to occur, similar to CLI for IRQ)
ENTR                push A X Y to the return-stack, then move D to X, then set A Y and D to zero
EXIT                move X to D, then pull Y X A from the return-stack


Attachments:
File comment: added a lot of support for 16-bit data in YA
65VM02.txt [41.22 KiB]
Downloaded 247 times
Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Tue Jun 06, 2017 9:18 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
Hugh Aguilar wrote:
Code:
ADYA direct         add YA to value at direct-page variable and set the N Z flags according to the new value in YA
ADYA direct,X       add YA to value at direct,X and set the N Z flags according to the new value in YA

I minor mistake is that I should have said this:

Code:
ADYA direct         add YA to value at direct-page variable assuming no carry and setting the N Z C flags for YA
ADYA direct,X       add YA to value at direct,X assuming no carry and setting the N Z C flags for YA

Note that I didn't do anything about upgrading the interrupts with another level, or getting rid of the BRK instruction. I also didn't provide a register F for use as a frame-pointer. I'm dubious of the F register because it won't provide much of a boost in speed compared to using a direct-page pointer as the frame-pointer, which I'm doing now, and it will require adding a raft of new instructions. I'm still thinking on these issues though. I'll come up with a new document when I have figured out what I want.

I think these 16-bit instructions will help everybody. :) The 65c02 has always been weak on 16-bit data. Some of these instructions only provide a minor benefit. For example, DINX DDEX PHYA PLYA are all examples of new instructions that only replace two old instructions, so only a tiny boost in speed. All of these are in critical places in the code though. PHYA and PLYA are used by CALL and WEXIT which are important in Forth. Note that CALL and WEXIT are likely to be exactly the same in C or Pascal --- CALL pushes the old IP to the return-stack and sets IP to a new address, and WEXIT undoes this --- that is going to be the same in any language, and pretty important.


Last edited by Hugh Aguilar on Tue Jun 06, 2017 11:04 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Tue Jun 06, 2017 9:25 pm 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8507
Location: Midwestern USA
Hugh Aguilar wrote:
I doubt that BDD has read my document.

Actually, I have.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Wed Jun 07, 2017 10:59 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
Hugh Aguilar wrote:
I think these 16-bit instructions will help everybody. :) The 65c02 has always been weak on 16-bit data. Some of these instructions only provide a minor benefit. For example, DINX DDEX PHYA PLYA are all examples of new instructions that only replace two old instructions, so only a tiny boost in speed. All of these are in critical places in the code though. PHYA and PLYA are used by CALL and WEXIT which are important in Forth. Note that CALL and WEXIT are likely to be exactly the same in C or Pascal --- CALL pushes the old IP to the return-stack and sets IP to a new address, and WEXIT undoes this --- that is going to be the same in any language, and pretty important.

I have a new version of the 65VM02 --- I discarded the D register as well as all support for a multi-tasking OS.

I no longer believe that a preemptive multi-tasking OS is realistic on a processor such as this --- people can still have a round-robin multi-tasker as done in Forth traditionally, and implemented pretty much the same as on the 65c02.

I added the INCH and DECH instructions which help with 16-bit values in memory.

I modified the MIRQ interrupts so they would be simpler and would have less interrupt latency --- the reason why people like the 65c02 (rather than the Z80, MC68000, etc.) is primarily because it has low interrupt latency --- the 65VM02 should continue with this as a main feature.

The 65VM02 is no longer supporting a multi-tasking OS, but it is supporting a byte-code VM (that is the main feature, hence the name), and is supporting 16-bit data better than the 65c02 did.

This is the new set of instructions:
Code:
The 65VM02 has these new registers:
IP  16-bit          used by OPY OPA and OPYA for accessing the first far-bank to execute byte-code
M   1-bit           this is the currently unused bit-5 in the P register --- it is now used as a mask for MIRQ interrupts

YA  16-bit          this isn't a new register --- this is just the Y and A registers used as a pair (Y is low, A is high)

These are the new instructions (none affect the flags unless explicitly described as doing so):
JVM page            jump through the pointer located at (page*$100 OR 2*A) --- the page value has to be even
OPY                 load Y with (IP) in the first far-bank, then increment IP
OPA                 load A with (IP) in the first far-bank, then increment IP
OPYA                effectively: OPY OPA
INIP                increment IP --- mostly used in conditional branches that don't branch
EXIP                exchange IP with YA
YIP                 add the signed value in Y to IP
FLDA (direct),Y     load A through a 3-byte pointer with a value in far-memory, setting the N Z flags
FSTA (direct),Y     store A through a 3-byte pointer to far-memory
LLY                 load Y with the offset to the bottom value of the return-stack from the page boundary
AAS                 add A to S
EXA (direct),Y      exchange A with value at (direct),Y and set the N Z flags according to the new value in A
DINX                add 2 to X                      effectively the same as: INX INX
DDEX                subtract 2 from X               effectively the same as: DEX DEX
PHYA                push YA to the return-stack     effectively the same as: PHA PHY
PLYA                pull YA from the return-stack   effectively the same as: PLY PHA
NGYA                negate YA and set the N Z flags according to the new value in YA
ADYA direct         add YA to value at direct-page variable assuming no carry and setting the V N Z and C flags for YA
ADYA direct,X       add YA to value at direct,X assuming no carry and setting the N Z V and C flags for YA
EXYA direct,X       exchange YA with value at direct,X and set the N Z flags according to the new value in YA
LDYA direct         load YA from the direct-page variable
STYA direct         store YA to the direct-page variable
LDYA direct,X       load YA from the direct-page indexed by X
STYA direct,X       store YA to the direct-page indexed by X
LDYA (direct,X)     load YA indirectly from an array of direct-page pointers indexed by X
STYA (direct,X)     store YA indirectly to an array of direct-page pointers indexed by X
TST                 test YA, setting the N and Z flags (appropriate for the whole 16-bit value)
MUL                 multiply A by Y unsigned, leaving the product in YA
SGN                 sign-extend A into YA (set A to -1 or 0), setting the N and Z flags for the 16-bit result
ADY #value          add the value to Y, setting the N Z V and C flags (in the same way as ADC does)
SBY #value          subtract the value from Y, setting the N Z V and C flags (in the same way as SBC does)
CMPH direct,X       like CMP but uses the C-flag (doesn't assume it is 1), and AND's the old Z-flag with the new Z-flag
INCH direct         if C-flag is 1, increment memory value, setting N Z and C flags appropriately like ADC does
DECH direct         if C-flag is 0, decrement memory value, setting N Z and C flags appropriately like SBC does
INCH direct,X       if C-flag is 1, increment memory value, setting N Z and C flags appropriately like ADC does
DECH direct,X       if C-flag is 0, decrement memory value, setting N Z and C flags appropriately like SBC does
BLT offset          branch if less than                 branch if  N <> V
BGT offset          branch if greater than              branch if  N = V and ~Z
MRTI                used to terminate MIRQ ISRs (similar to how RTI is used to terminate IRQ and NMI ISRs)
SEM                 sets the M-flag (this masks MIRQ interrupts, similar to SEI for IRQ)
CLM                 clears the M-flag (this allows MIRQ interrupts to occur, similar to CLI for IRQ)


Attachments:
File comment: I discarded all support for a multi-asking OS --- I also added the INCH and DECH instructions
65VM02.txt [23.93 KiB]
Downloaded 245 times
Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 5:29 am 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
Hugh Aguilar wrote:
I modified the MIRQ interrupts so they would be simpler and would have less interrupt latency --- the reason why people like the 65c02 (rather than the Z80, MC68000, etc.) is primarily because it has low interrupt latency --- the 65VM02 should continue with this as a main feature.

My next improvement may be to upgrade the MIRQ interrupts to store all of the registers in a shadow-register bank, rather than push them to the return-stack and have MRTI pull them off again.

If I did this, interrupt latency would be as low as it would be with a coprocessor --- I am starting to think that low interrupt latency is the #1 feature that will get people interested in the 65VM02 --- the main program doesn't have to be fast (it is not going to be fast if it is written in Forth and runs on a byte-code VM).

Note for Michael Morris --- your M65c02 is pretty cool --- by upgrading from 8-bit to 16-bit registers though, you have almost doubled the interrupt latency, and fast interrupts may be the only feature that anybody cares about.

There may be some programs that don't have a main program at all --- the entire program consists of ISRs --- in this case, the 65VM02 could be used, although the IP register will go unused because there is no high-level language programming being done.

I've never seen a program that was all ISRs and had no main-program --- have any of you guys seen this? --- I've heard some people say that it is an absolutely terrible idea, although I don't know why.
People tend to express strong opinions on the internet, but I say: "Down with categorical imperatives!"


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 5:52 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8544
Location: Southern California
Do make it re-entrant though. Maybe shallow onboard stacks would be in order for the saving of registers for interrupts?

_________________
http://WilsonMinesCo.com/ lots of 6502 resources
The "second front page" is http://wilsonminesco.com/links.html .
What's an additional VIA among friends, anyhow?


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 6:37 am 
Offline
User avatar

Joined: Thu Dec 11, 2008 1:28 pm
Posts: 10986
Location: England
About interrupt latency: for the real world, it's measured in microseconds. But in a CPU implementation, it's measured in clock cycles. If a CPU adds lots of wide registers, but runs at 100MHz, then the interrupt latency might still be better than a 6502 at 2MHz. Or at 14MHz.

We sometimes make the mistake here in thinking the old currency of clock cycles has the same value that it did in the 70s.


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 12:23 pm 
Offline
User avatar

Joined: Wed Mar 01, 2017 8:54 pm
Posts: 660
Location: North-Germany
IMHO:

INCH/DECH: I wonder whether these instruction could be useful but as following an INC/DEC. So why not implementing a INP/DEP (P = pointer, 16bit)? It would save one instruction fetch at least.

IRQ latency: As BigEd already said, its µs (or less) today. Several priorities might be nice, but vectoring is more important. If you need to poll where the IRQ is coming from you lost. If your CPU shall compete against any modern microcontroller vectoring is mandatory. And then one or two sets of shadow registers per priority might be sufficient.

Another way to speed up response is DMA. If information is just to gather or to refresh DMA can do that in a virtual° transparent way. (° setup, maintaining, and stolen cycles are the "costs")

No more multi tasking support / no D register: why? Of course multi tasking cannot render interrupts as useless. But having intrinsic support for rapid task switching is valuable and something that isn't a common feature in the microcontroller world. Having multi tasking support you can use ISR for immediate response / quick action but everything that doesn't need to be done in that pace can be delegated (by the ISR) to an appropriate task (e.g. sending a message, setting a semaphore or flag, ...). The ISR could issue a request to the task scheduler to elevate its associated task(s). There are many other possibilities how ISRs and tasks could work in a cooperative fashion making the systems look & feel more agile.

my 2 cents :)


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 7:56 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
GaBuZoMeu wrote:
INCH/DECH: I wonder whether these instruction could be useful but as following an INC/DEC. So why not implementing a INP/DEP (P = pointer, 16bit)? It would save one instruction fetch at least.

Sometimes the low byte is in Y and only the high byte is in memory. For example:
Code:
CMOVE:                  ; this is:  CMOVE ( src dst cnt -- )
    LDYA roslo,X
    STYA src
    LDYA soslo,X
    STYA dst
    LDYA toslo,X        ; Y is the count, with the high-byte still in toshi,X
    TST
    BEQ DROP3           ; if the count is zero, don't even begin
    DEY                 ; because we need an offset to the last element in the array (rather than past the array)
CMOVE_BEGIN:
    LDA (src),Y
    STA (dst),Y
    SBY #1              ; clears C-flag when Y underflows (Y becomes $FF)
    BCS CMOVE_BEGIN     ; loop until Y is $FF
    DECH toshi,X        ; clears C-flag when high-byte underflows (high-byte becomes $FF)
    BCC DROP3           ; loop until high-byte is $FF
    STA toshi,X
    INC src+1
    INC dst+1
    BRA CMOVE_BEGIN     ; this loop could be unwound to boost the speed

GaBuZoMeu wrote:
IRQ latency: As BigEd already said, its µs (or less) today. Several priorities might be nice, but vectoring is more important. If you need to poll where the IRQ is coming from you lost. If your CPU shall compete against any modern microcontroller vectoring is mandatory. And then one or two sets of shadow registers per priority might be sufficient.

Well, I now have 8 MIRQ interrupts --- that seems like a lot to me.

GaBuZoMeu wrote:
Another way to speed up response is DMA. If information is just to gather or to refresh DMA can do that in a virtual° transparent way. (° setup, maintaining, and stolen cycles are the "costs")

DMA is what the coprocessor essentially does --- moves data between I/O ports and circular buffers in far memory --- but with the coprocessor the user writes the code for the coprocessor, so he has some flexibility in what he can do, rather than have this written in HDL.

Note that a coprocessor doesn't speed up I/O at all. What it does, is speed up the main-program because the main-program is not being interrupted to do the I/O.

GaBuZoMeu wrote:
No more multi tasking support / no D register: why?

The big problem with the D register is that every task has its own direct-page, which means that tasks can't have shared direct-page variables. I was worried that this was going to kill the speed --- the 65c02 has always benefited by keeping important global variables in the direct-page --- pointers are especially useful in the direct-page because of the (direct) and (direct),Y addressing modes.

EDIT: Another thing I want to mention, is that it may be possible to have the lower 512 bytes of memory to be faster than the rest of memory that has a wait state. Having the whole program use the zero-page as the direct-page and the one-page as the return-stack will channel a lot of data through the lower 512 bytes of memory, rather than having it scattered all over the memory map as it would be given the D register.

The multi-tasking OS and the D register would have been useful for huge programs in which each task needs its own direct-page and there wouldn't be enough room in a single direct-page for the entire program --- such big programs seem unlikely though --- most programs don't need this level of complexity.

GaBuZoMeu wrote:
Of course multi tasking cannot render interrupts as useless. But having intrinsic support for rapid task switching is valuable and something that isn't a common feature in the microcontroller world. Having multi tasking support you can use ISR for immediate response / quick action but everything that doesn't need to be done in that pace can be delegated (by the ISR) to an appropriate task (e.g. sending a message, setting a semaphore or flag, ...). The ISR could issue a request to the task scheduler to elevate its associated task(s). There are many other possibilities how ISRs and tasks could work in a cooperative fashion making the systems look & feel more agile.

Well, people can still do a cooperative round-robin multi-tasker as done traditionally in Forth.

Another issue here, is that I don't really know anything about preemptive multi-tasking OS systems. This was getting beyond my level of expertise --- I got rid of the D register and the multi-tasking support just to simplify the system, to a level I'm more familiar with --- there may be some big programs though, that the 65VM02 would no longer be capable of supporting.

This is my first design --- I don't want to go overboard with features --- I don't want to "invent" the ARM Cortex.


Last edited by Hugh Aguilar on Thu Jun 08, 2017 9:33 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 8:11 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
GARTHWILSON wrote:
Do make it re-entrant though. Maybe shallow onboard stacks would be in order for the saving of registers for interrupts?

That is a possibility, but it seems complicated.

I would be more inclined to have a few fast interrupts (lets call them FIRQ interrupts) that use the shadow registers and can't be interrupted --- and also have the slower MIRQ interrupts that use the return-stack and can be interrupted --- the FIRQ ISRs should hopefully be so short that they don't delay things too much.

The PIC24 has an instruction that exchanges the low four registers with their shadow registers. An ISR can either do this exchange (which implies that it can't be interrupted) or it can use the return-stack (which implies that it can be interrupted) --- this allows the programmer to decide how many fast-interrupts and how many slow-interrupts he has --- the PIC24 is a pretty good design by all accounts.


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 9:06 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
BigEd wrote:
About interrupt latency: for the real world, it's measured in microseconds. But in a CPU implementation, it's measured in clock cycles. If a CPU adds lots of wide registers, but runs at 100MHz, then the interrupt latency might still be better than a 6502 at 2MHz. Or at 14MHz.


True enough --- but there are also the issues of cost and power-consumption --- I'm hoping the 65VM02 will be better on these than a 32-bit processor, and adequate on performance.


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 9:28 pm 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8544
Location: Southern California
Hugh Aguilar wrote:
BigEd wrote:
About interrupt latency: for the real world, it's measured in microseconds. But in a CPU implementation, it's measured in clock cycles. If a CPU adds lots of wide registers, but runs at 100MHz, then the interrupt latency might still be better than a 6502 at 2MHz. Or at 14MHz.

True enough --- but there is also the issues of cost and power-consumption --- I'm hoping the 65VM02 will be better on these than a 32-bit processor, and adequate on performance.

Will processors created in FPGAs ever be very low-power? Perhaps they can be—I don't know, but I didn't get the impression that it's possible for one to compete in the area of power and speed with silicon designs made from the ground up to be the particular processor. That's no reason to not go ahead with the project though.

_________________
http://WilsonMinesCo.com/ lots of 6502 resources
The "second front page" is http://wilsonminesco.com/links.html .
What's an additional VIA among friends, anyhow?


Top
 Profile  
Reply with quote  
 Post subject: Re: 65VM02
PostPosted: Thu Jun 08, 2017 10:30 pm 
Offline

Joined: Fri Jun 03, 2016 3:42 am
Posts: 158
GARTHWILSON wrote:
Hugh Aguilar wrote:
BigEd wrote:
About interrupt latency: for the real world, it's measured in microseconds. But in a CPU implementation, it's measured in clock cycles. If a CPU adds lots of wide registers, but runs at 100MHz, then the interrupt latency might still be better than a 6502 at 2MHz. Or at 14MHz.

True enough --- but there is also the issues of cost and power-consumption --- I'm hoping the 65VM02 will be better on these than a 32-bit processor, and adequate on performance.

Will processors created in FPGAs ever be very low-power? Perhaps they can be—I don't know, but I didn't get the impression that it's possible for one to compete in the area of power and speed with silicon designs made from the ground up to be the particular processor. That's no reason to not go ahead with the project though.

Maybe not competitive in power consumption --- I don't really know enough about FPGAs to comment on that.

As for price, FPGAs might be competitive if there is no single-chip ARM Cortex that has the needed I/O configuration --- this is dubious though --- one ARM Cortex enthusiast told me that FPGAs aren't useful because there is always an ARM Cortex chip available off-the-shelf that does what you need.

My emphasis now is on supporting I/O (I have 8 MIRQ interrupts now) in the expectation that the only case in which the 65VM02 would be competitive is a project with unique I/O needs that can only be met in an FPGA with custom HDL. For example, here is an article by Michael Morris:
https://www.fpgarelated.com/showarticle/765.php
Are there any ARM Cortex chips like that available off-the-shelf? I would assume not, or he wouldn't have bothered to do it himself in an FPGA.

Another possibility in which an FPGA could be competitive, is in an application that does some simple calculation repetitively. This would be written in 65VM02 assembly-language for speed. If it is still too slow though, then it may be possible use HDL to add a new instruction to the 65VM02 that does most or all of this code significantly faster. For example, lets say you have a 65VM02 controlling a fax machine (the 16MB memory would be needed) and you want your faxes encrypted --- encoding the guts of the encryption algorithm in HDL will boost the speed by orders of magnitude --- and there isn't going to be an off-the-shelf ARM Cortex chip available if the customer has invented his own encryption algorithm.


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 217 posts ]  Go to page Previous  1 ... 11, 12, 13, 14, 15  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 10 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: