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

共9条 1/1 1 跳转至

jsyzgaochao的CPLD DIY进程帖

菜鸟
2013-07-04 16:33:39     打赏


jsyzgaochao的CPLD DIY进程贴 目录


1、CPLD的焊接.......................................................1楼
2、CPLD“木鱼声”发生器...........................................1楼
3、关于有源蜂鸣器和无源蜂鸣器的讨论.......................8楼
4、CPLD数字秒表....................................................9楼




7月1号听同学介绍的CPLD DIY活动,早就想学习CPLD和FPGA,于是就申请了PCB和套件。


7月3号收到套件之后,立马开焊,花费了三个小时终于焊完。。

下面是焊好后的开发板图:

CPLD开发板

在焊接过程中遇到一点小波折,和大家分享一下:

1、焊完之后下载数码管测试程序,发现每一位数码管右下角的段都不亮,分析原因后发现,三极管的基极和集电极电阻焊反了(R67和R77),结果三极管集电极LED限流电阻为10K,LED自然不亮了。。。

2、拨码开关焊完一边准备焊另一边的时候发现焊反了,于是拆下来重焊,由于是双面板,正反两面都有焊盘,正反两面都有焊锡,而且焊反的那边是拨码开关的下边,和地的铺铜相连,热量很容易散开,导致十分难拆。最后拿镊子翘,再往焊盘上上大量的锡,费了九牛二虎之力终于搞下来了。。所以以此告诫大家,焊东西前一定要看清。。


7月4日,9月份有全国电赛,所以暑假里学校有电赛培训。老师给我们布置了几个题,有个声音定位的。。于是整个实验室里就充斥着此起彼伏的“嘟嘟嘟”类似敲木鱼的声音。。感觉很不爽,于是拿CPLD写了一个“木鱼声发生器”。。

刚开始写的时候,用了求余运算(主要之前对单片机比较熟悉),结果编译一看,用了800多个逻辑单元。直接就爆了。。。后来修改程序,用62个,OK~代码如下:

module beep(CLK,BP);
input CLK;
output BP;
reg BP;
reg[17:0] COUNT;
reg[7:0] BPDELAY;

initial
begin
COUNT=18'd0;
BPDELAY=8'd0;
BP=1'd1;
end

always @(posedge CLK)
begin
COUNT=COUNT+1;
if(COUNT==18'd62500)
begin
COUNT=1'd0;
BPDELAY=BPDELAY+1;
if(BPDELAY==250) BPDELAY=8'd0;
if(BPDELAY<125)
BP=!BP;
else
BP=1'd1;
end
end

endmodule

只是咱的蜂鸣器拼不过人家的大喇叭啊。。。


这个程序没什么技术含量,看到底下回复,于是把工程传上来:beep.rar




关键词: CPLD     进程    

院士
2013-07-04 16:43:07     打赏
2楼
不错,继续努力~~

专家
2013-07-04 22:16:06     打赏
3楼

论坛编辑器要是加上代码编辑功能就好了  一段代码贴上来不至于看的这么麻烦


建议:后期加上这种功能


高工
2013-07-04 22:54:18     打赏
4楼
可以上传整个工程,便于大家参考借鉴。。。

院士
2013-07-05 09:01:32     打赏
5楼
这个要求提的还是蛮高的

高工
2013-07-05 13:21:35     打赏
6楼

其实很简单的,王总。


专家
2013-07-05 20:25:45     打赏
7楼
看到别的论坛有这种功能很是羡慕啊   代码结构很清楚  

菜鸟
2013-07-15 15:19:50     打赏
8楼

这几天一直在忙电赛培训,做一个频率计,我做的整形部分,频率范围0.1Hz-20MHz(再高的信号源没法输出,没有测),幅度范围20mVpp-20Vpp,同学拿CPLD做的频率周期测量,精度还是比较高的,测量上兆的频率,误差在10Hz左右。。


7月14日

有人在群里问下面程序蜂鸣器为什么不响。

module fp_verilog (clk,rst_n,beep);
input clk; //时钟信号,50MHz
input rst_n; //复位信号,低电平有效
output beep; //蜂鸣器,0--响,1--不响
assign beep= 1'b0;   
endmodule
我们板子上用的蜂鸣器是无源蜂鸣器,需要用交流驱动,就像喇叭一样,我给他写了一个蜂鸣器发声的程序。

module beep(CLK,RST,BEEP);
input CLK;
input RST;
output reg BEEP;
reg[15:0] COUNT;


always @(posedge CLK or negedge RST)
begin
if(~RST)
begin
COUNT<=16'd0;
BEEP<=1'b1;
end
else if(CLK)
begin
if(COUNT==16'hffff)
begin
COUNT<=16'd0;
BEEP<=~BEEP;
end
else
COUNT<=COUNT+16'd1;
end
end


endmodule
而对于有源蜂鸣器,可以用PNP或NPN三极管驱动(或者PMOS、NMOS),PNP:1不响、0响,NPN:1响、0不响。有源蜂鸣器也可以用上面的方式用交流产生不同频率的声音,区别是不用的时候必须让蜂鸣器不响(对于NPN驱动来说),而无源蜂鸣器无所谓。有源蜂鸣器用这种方式发声,声音不如无源的好听。


另外群里有人对我程序里面if(~RST)有质疑,他认为应该用if(!RST)

就符号字面来看,~是按位取反,而!是非。对于一位的寄存器或者线网来看,两者是等效的。

对于多位数据,~是按位取反,而!不知会有什么结果,求大神解释。


菜鸟
2013-07-15 15:28:51     打赏
9楼

7月15日

写了一个秒表来玩玩。

秒表

上程序代码:

module msclk(CLK,RST,SEG,COM);
input CLK,RST;
output reg[7:0] SEG;
output reg[7:0] COM;
reg[3:0] NUM;
reg[31:0] DATA;
reg[23:0] COUNT;

always @(posedge CLK or negedge RST)
begin
if(~RST)
begin
COUNT<=24'd0;
DATA<=32'd0;
end
else if(CLK)
begin
if(COUNT==24'D5000000)
begin
COUNT<=24'd0;
if(DATA[3:0]==4'd9)
begin
DATA[3:0]<=4'd0;
if(DATA[7:4]==4'd9)
begin
DATA[7:4]<=4'd0;
if(DATA[11:8]==4'd9)
begin
DATA[11:8]<=4'd0;
if(DATA[15:12]==4'd9)
begin
DATA[15:12]<=4'd0;
if(DATA[19:16]==4'd9)
begin
DATA[19:16]<=4'd0;
if(DATA[23:20]==4'd9)
begin
DATA[23:20]<=4'd0;
if(DATA[27:24]==4'd9)
begin
DATA[27:24]<=4'd0;
if(DATA[31:28]==4'd9)
begin
DATA<=32'd0;
end
else
DATA[31:28]<=DATA[31:28]+4'd1;
end
else
DATA[27:24]<=DATA[27:24]+4'd1;
end
else
DATA[23:20]<=DATA[23:20]+4'd1;
end
else
DATA[19:16]<=DATA[19:16]+4'd1;
end
else
DATA[15:12]<=DATA[15:12]+4'd1;
end
else
DATA[11:8]<=DATA[11:8]+4'd1;
end
else
DATA[7:4]<=DATA[7:4]+4'd1;
end
else
DATA[3:0]<=DATA[3:0]+4'd1;
end
else
COUNT<=COUNT+24'd1;
end
end

always @(COUNT[16:14] or DATA)
begin
case(COUNT[16:14])
3'd0:begin COM=8'b11111110; NUM=DATA[3:0]; end
3'd1:begin COM=8'b11111101; NUM=DATA[7:4]; end
3'd2:begin COM=8'b11111011; NUM=DATA[11:8]; end
3'd3:begin COM=8'b11110111; NUM=DATA[15:12]; end
3'd4:begin COM=8'b11101111; NUM=DATA[19:16]; end
3'd5:begin COM=8'b11011111; NUM=DATA[23:20]; end
3'd6:begin COM=8'b10111111; NUM=DATA[27:24]; end
3'd7:begin COM=8'b01111111; NUM=DATA[31:28]; end
//default:begin COM=8'b11111111; NUM=4'd0; end
endcase
end


always @(NUM)
begin
if(COM==8'b11111101)
case(NUM)
4'd0:SEG=8'h40;
4'd1:SEG=8'h79;
4'd2:SEG=8'h24;
4'd3:SEG=8'h30;
4'd4:SEG=8'h19;
4'd5:SEG=8'h12;
4'd6:SEG=8'h02;
4'd7:SEG=8'h78;
4'd8:SEG=8'h00;
4'd9:SEG=8'h10;
default:SEG=8'hff;
endcase
else
case(NUM)
4'd0:SEG=8'hc0;
4'd1:SEG=8'hf9;
4'd2:SEG=8'ha4;
4'd3:SEG=8'hb0;
4'd4:SEG=8'h99;
4'd5:SEG=8'h92;
4'd6:SEG=8'h82;
4'd7:SEG=8'hf8;
4'd8:SEG=8'h80;
4'd9:SEG=8'h90;
default:SEG=8'hff;
endcase
end

endmodule

程序打包下载:

msclk.rar


共9条 1/1 1 跳转至

回复

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