打算 学 ALTERA 的 MAX3000系列的 EPM3128

2009年06月18日 10:32    发布者:Netjob
打算 学 ALTERA 的 MAX3000系列的 EPM3128    或EPM5000系列。

作为初学者,选择简单的CPLD做入门。封装100LQFP的。

好希望听听 都是初学者的你的意见。 高手免提!

网友评论

Netjob 2009年06月18日
大家为什么想使用FPGA/CPLD.? 是是什么行业?什么项目? 可以简单说说吗?

我主要是用CPLD 来扩展 I/O口,暂时就这个需要。因此没什么要求,简单学学就OK.
qupeng2008 2009年06月18日
建议LZ将学习经历共享撒~
naos 2009年06月19日
cpld,太简单了。用原理图输入就可以了。
McuPlayer 2009年06月19日
二者没有简单和复杂之分

一般而言,CPLD是基于Macro Cell的,FPGA是基于LUT
CPLD的delay小并且可以准确预估,非常适合做组合逻辑功能
FPGA基于LUT门密度大,flip-flop更加丰富,适合做时序逻辑
zjianq 2009年06月20日
玩玩用3128也无妨。做批量就用epm240吧。价格更便宜,供货也ok,资源更多。
我是想用“免提”和你通话的,可这个破论坛没这功能啊。
wangkj 2009年06月20日
epm240 是新品,你说的那个快停产了。
zjianq 2009年06月20日
楼上咋不用“免提”,不厚道
Netjob 2009年06月22日
EPM240才10元,  240个宏单元.
参考资料:
Using MAX II & MAX 3000A
Devices as a Microcontroller
I/O Expander

比较好入门,程序,说明都很详细。简单学学~
Netjob 2009年06月22日
下面是代码

module IO_Expander (CS, RD, WR, RST, CONF, LOAD, MODE,
MCU_IO, IO_PortA, IO_PortB, IO_PortC, IO_PortD);

input CS, RD, WR, RST, CONF, LOAD, MODE;

inout MCU_IO, IO_PortA, IO_PortB, IO_PortC, IO_PortD;

wire writeA, writeB, writeC, writeD, read, en_IObuf, reset;
wire Latched_Addr;
wire inv_address;
wire rbuf, wbuf_A, wbuf_B, wbuf_C, wbuf_D, inbuf, outbuf, Latched_en;

latch_io write_instA(.enable(writeA),.reset(reset),.data(MCU_IO),.q(wbuf_A));
latch_io write_instB(.enable(writeB),.reset(reset),.data(MCU_IO),.q(wbuf_B));
latch_io write_instC(.enable(writeC),.reset(reset),.data(MCU_IO),.q(wbuf_C));
latch_io write_instD(.enable(writeD),.reset(reset),.data(MCU_IO),.q(wbuf_D));
latch_io read_inst(.enable(read),.reset(reset),.data(inbuf),.q(rbuf));

reg_Addr register1_load(.enable((CONF & LOAD) | CS),.reset(reset),.data(MCU_IO),.q(Latched_Addr));
reg_en register2_load(.enable(CONF | CS),.reset(reset),.data({inv_address,MCU_IO}),.q(Latched_en));

tri_buffer wPortA(.in(wbuf_A),.oe(Latched_en),.out(IO_PortA));
tri_buffer wPortB(.in(wbuf_B),.oe(Latched_en),.out(IO_PortB));
tri_buffer wPortC(.in(wbuf_C),.oe(Latched_en),.out(IO_PortC));
tri_buffer wPortD(.in(wbuf_D),.oe(Latched_en),.out(IO_PortD));
tri_buffer rPort(.in(rbuf),.oe((en_IObuf & ~MODE) | (en_IObuf & CS)),.out(outbuf));

mux4_8bit mux0(.inA(IO_PortA),.inB(IO_PortB),.inC(IO_PortC),.inD(IO_PortD),.sel(Latched_Addr),.mux_out(inbuf));
mux4_1bit mux1(.inA(Latched_en),.inB(Latched_en),.inC(Latched_en),.inD(Latched_en),.sel(Latched_Addr),.mux_out(en_IObuf));

assign inv_address = {~MCU_IO, ~MCU_IO, ~MCU_IO, ~MCU_IO};
assign MCU_IO = outbuf;
assign reset = RST | CS;
assign read = RD | CS;
assign writeA = (Latched_Addr | Latched_Addr | WR) | CS;
assign writeB = (~Latched_Addr | Latched_Addr | WR) | CS;
assign writeC = (Latched_Addr | ~Latched_Addr | WR) | CS;
assign writeD = (~Latched_Addr | ~Latched_Addr | WR) | CS;

endmodule
Netjob 2009年06月29日
CPLD最大的问题是 烧写寿命短,才100~200次! 学习不方面。使用FPGA就比较好些。

ALTERA的CYCLONE 应该合适(LQFP-100封装的),但是价格比较贵啊!
潜艇8421 2009年06月29日
要做发烧音响,不得不用CPLD 控制时序。
hqgboy 2009年07月22日
呵呵。。。学习。。
Netjob 2009年08月05日
现在觉得一块开发板和一堆简单易懂的例子很重要~