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

共3条 1/1 1 跳转至

547886405的进程贴---6.22更新流水灯

助工
2013-06-14 21:27:40     打赏

今天下午收到板子,先上两张图

PCB正面

 

pc板背面

 

器件

明天开始焊接

 

 




关键词: 547886405     进程     ---6.22     更新         

助工
2013-06-22 21:33:06     打赏
2楼
进程一:焊接

    经过半天的奋斗,终于焊接完成,CPLD焊了两次才OK,第一次焊接电源和地短路了,拿着放大镜检查了半天也没看出来哪里短路,果断用热风枪吹下来,重新焊一遍,上电OK。从论坛上下了测试程序,简单测试了下,应该没啥问题了,上图。。。

图-1 流水灯

 

图-2:数码管动态显示

 


助工
2013-06-22 23:14:14     打赏
3楼
进程二:流水灯

其几天网坏了,都没更新进程,今天终于可以上网了,赶紧更新。。。。

先看原理图

二极管一端接3.3V,一端通过限流电阻与CPLD IO相连,所以需要LED发光时,只需要CPLD IO输出一个低电平就可以点亮相应的LED了。

首先来一个简单的LED程序,功能:同时点亮和熄灭所有LED,以一定频率闪烁

思路:由于板子上用的是50M的时钟,不能直接作为LED的时钟,否则太快人眼看不清楚现象,所以我们先要分频,我这个频率也没精确计算过,取个大概值。然后在以分频后的时钟作为LED闪烁的反转时钟, 就OK了 。

module led_flow(clk,data_out);

input clk;
output[7:0] data_out;
reg clk_1kHz;
reg[26:0] clk_divn;
reg[7:0] data_out;

always@(posedge clk)
begin
  clk_divn <= clk_divn + 1'b1;
end


always@(posedge clk_divn)
begin
 if(clk_divn[26]==0)
  data_out <= 8'b00000000;
 else
  data_out <= 8'b11111111;
end
endmodule

 

 

再来一个真正的流水灯。。

思路:分为三个进程,板载时钟频率太快,为了能看清楚现象,毫无疑问第一个进程是分频;第二个进程是以分频后的时钟为敏感信号,在8个状态之间依次切换(点亮每个LED为一种状态);第三个进程是8个不同的状态所对应的CPLD相应管脚的输出。

module led_flow(clk,data_out);

input clk;
output[7:0] data_out;

reg[2:0] led_sel;
reg[25:0] clk_divn;
reg[7:0] data_out;

always@(posedge clk)
begin
  clk_divn <= clk_divn + 1'b1;
end

always@(posedge clk_divn[25])
begin
  led_sel <= led_sel + 1'b1;
end


always@(clk_divn)
begin
 case(led_sel)
 3'b000 : data_out  <= 8'b1111_1110;
 3'b001 : data_out  <= 8'b1111_1101;
 3'b010 : data_out  <= 8'b1111_1011;
 3'b011 : data_out  <= 8'b1111_0111;
 
 3'b100 : data_out  <= 8'b1110_1111;
 3'b101 : data_out  <= 8'b1101_1111;
 3'b110 : data_out  <= 8'b1011_1111;
 3'b111 : data_out  <= 8'b0111_1111;
 default : data_out <= 8'b1111_1111;
 endcase
end
endmodule

 

 


共3条 1/1 1 跳转至

回复

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