这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » wsjiayugao的CPLD进程贴

共8条 1/1 1 跳转至

wsjiayugao的CPLD进程贴

菜鸟
2013-07-08 11:41:37     打赏

前天晚上开发板到货,经过昨天一上午奋斗,终于焊完了,CPLD的封装确实很坑爹……

由于我的设想(FIFO控制器)比较奇葩,最粗犷的设想需要占用2*8(双向数据线)+8(RAM数据线)+13(RAM地址线)=37个IO口,这个板基本上是提供不了的,所以一方面要考虑复用,另一方面为了省IO,我没有焊上拨码开关。另外,可能一辈子都用不到的PS2和RS232串口我也没有焊上。

CPLD开发板焊接成果

下载了版主提供的示例程序,工作正常。


整个焊接过程还是很顺利的,坑爹的事情发生在下程序的时候,发生了喜闻乐见的如下报错:

Error (209040): Can't access JTAG chain

Error (209053): Unexpected error in JTAG server -- error code 44

Error (209012): Operation failed

这个错误在版主提供的教程里有详尽的分析,但是我排除了所有的错误情况,最后发现竟然是:QuartusII不支持中文路径。把代码移到英文路径下,下载就成功了……






关键词: wsjiayugao     进程    

院士
2013-07-08 13:16:34     打赏
2楼
呵呵,好事多磨

菜鸟
2013-07-13 22:10:24     打赏
3楼

CPLD开发板焊好后,首先大致熟悉了一下板上的外设——其实也就是数码管和按键。只基于熟悉外设考虑,按键的检测我完全没有加消抖,用起来的确很抖(按下一次偶尔能响应若干次)。刚才看到论坛里有对消抖的讨论

http://forum.eepw.com.cn/thread/234045/1待会去观摩一下。


熟悉完外设之后我决定做一个频率计,采用在规定时间内记上升沿个数的方法,测量信号的频率。虽然这种方法一般只适于频率稍高的信号,但是实测发现精度惊人,在100Hz~1MHz除了末尾的一个字误差之外基本木有抖动。下面是我的具体做法:

1、引脚设置为施密特触发输入,verilog代码里写作上升沿触发。

    之前下好代码开始加信号之后,发现了一个有意思的现象:方波信号测得非常准,但是正弦波,三角波等信号测的就完全是乱码。后来是听同学说,CPLD引脚可配置为“施密特触发输入”,即内部自带施密特反相器,也就相当于内部自带了一个迟滞比较器,配置选项在分配引脚的PinPlanner菜单里,如图:

输入引脚设置为施密特触发输入

顺带也能发现CPLD支持的电平确实很多,不过一般使用的话,什么CMOS,TTL电平貌似可以通用。

2、设置采集时间长度:0.1s

由于CPLD不能做乘除,所以这个时间长度就只能是10的倍数。1s太长,就只好0.1s了,用verilog可以轻易实现这样的分频:

parameter M5=23'd5_000_000;

always @(posedge SYS_CLK,negedge SYS_RST)
    if(!SYS_RST)//低电平复位
        begin   

            timer<=23'b0;

            _time_up<=1'b0;
        end
    else 
        begin    

            timer<=timer+1'b1;
            _time_up<=1'b1;
            if(timer==M5)
                begin
                    timer<=23'b0;
                    _time_up<=1'b0;
                end 
        end 
3、采用BCD码计数

由于CPLD不能做乘除,所以下面这段极其简单的代码居然不能直接使用……

always @(posedge in , negedge(SYS_RST & _time_up)

    if(!(SYS_RST & _time_up))

        freq<=0;

    else

        freq<=freq+1;

由于需要点亮数码管,为了查表的方便,被迫使用BCD 码计数——为了折腾那个进位,写了7层if-else ……代码不放了,太长。

4、数据锁存,数码管扫描

当 _time_up 低电平时,触发一个锁存操作,在BCD码即将回零时,将当前计数值锁进一个寄存器。这全拜托了verilog特色的非阻塞赋值。

always @(negedge _time_up,negedge SYS_RST)
if(!SYS_RST)
    begin
        hold[0]<=4'b0; 
        ……
    end
else if(!_time_up)
    begin
        hold[0]<=bcdf[0]; 
        ……

    end

接下来进行数码管扫描,定时 - 循环扫段 - 查表显示数字

{verilog的大括号实在太好用了,本来我循环左移还写了好半天,后来发现使用大括号:

always @(posedge in,negedge (SYS_RST&_time_up))

完美解决,真不知道verilog还提供左移右移运算符是干什么的……}

//扫描时钟

always @(posedge SYS_CLK,negedge SYS_RST)
    if(!SYS_RST) diverled<=16'b0;
    else diverled<=diverled+16'b1;

//段扫描
always @(posedge diverled[15],negedge SYS_RST)
    if(!SYS_RST)
        begin 
            dig<=8'hfe;
            tempd<=3'b0;
        end 
    else
        begin
            dig<={dig[6:0],dig[7]};
            tempd<=tempd+3'b1;
        end 
assign temps=hold[tempd];
//查表显示

always @(temps)
    begin
        case(temps)
            4'd0:seg=8'b1100_0000;

            ……
            default:seg=8'b0111_1111;
        endcase
    end

以上就是这个频率计的做法


菜鸟
2013-07-14 00:17:39     打赏
4楼
不知楼主说的中文路径具体是怎样的。我直接下载“D:\CPLD_DIY\4个测试程序\key_piano.pof”没发现问题哦

高工
2013-07-14 00:24:06     打赏
5楼
所有的工程都最好不要有中文路径

院士
2013-07-14 09:20:36     打赏
6楼

我还是建议楼主焊上拔码开关与rs232

这两个都是灰常好用的数字IO与调试通讯工具。



菜鸟
2013-07-14 10:05:51     打赏
7楼
@lgs2007m 就是你那个路径,报错啊……我用的是QuartusII 13.0,Windows 7旗舰版

菜鸟
2013-07-14 18:53:53     打赏
8楼
我的是QuartusII 12.0,系统是64位WIN7旗舰版

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]