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

共13条 1/2 1 2 跳转至

357482894的进程贴-预习篇

助工
2012-09-26 21:30:35 打赏
本帖主要是我自己先预习的,代码缺乏规范性,我会另外开贴发我按教程学习的进程。

2012.9.26 收到PCB及元器件包
2012.9.29 全部焊接完成
2012.10.7 实现LED闪烁实验
2012.10.7 LED跑马灯
2012.10.14 LED流水灯
2012.10.14 读取按键信号
2012.10.14 按键消抖实验
2012.10.14 拨码开关控制LED
2012.10.18 数码管静态显示
2012.10.19 数码管动态显示



关键词: 357482894 进程 预习

助工
2012-09-26 21:36:25 打赏
2楼
9.26 收到PCB及元器件包,上图


助工
2012-09-29 22:32:37 打赏
3楼
9.29 焊接完成


第一次焊接如此紧密的引脚,把握不住手法,松香用的太多,最后清理起来很麻烦。
TLC549第一次没注意,焊反了,焊下来又重新焊的,折腾的挺惨,希望还好使。

助工
2012-10-07 11:46:27 打赏
4楼

10.7 第一个实验——LED闪烁灯

控制LED闪烁,每一秒闪烁一次
程序:

module led_1
(
clk,rst,led
);

input clk,rst;
output led;

parameter T10ms=26'd50_000_000;

reg [25:0]count;
reg led_f;

always @ (posedge clk or negedge rst)
if(!rst)
count<=26'd0;
else if(count==T10ms)
count<=26'd0;
else
count<=count+1'd1;

always @ (posedge clk or negedge rst)
if(!rst)
led_f<=1'b1;
else if(count<25'd25_000_000)
led_f<=1'b0;
else
led_f<=1'b1;

assign led=led_f;

endmodule

现象是LED1每个一秒闪烁一次。

实验过程中的问题:
第一次下载后,其余未使用的LED和数码管全亮,编译时提示所有未用输出引脚默认置低。这时需要修改工程配置,Assignments-Device-Device and Pin Options-Unused Pins,改成三态模式就可以了。


助工
2012-10-07 21:42:46 打赏
5楼
10.7 LED跑马灯

D1-D8每隔一秒变动一次,D11每隔一秒闪烁一次,视频演示:



源代码:
module led_3(
clk,rst_n,led1,led2
);

input clk,rst_n;
output led1;
output [7:0]led2;

reg led1_f;
reg [7:0]led2_f;

reg [24:0]count;
parameter T0s5=25'd25_000_000;
parameter T0s25=24'd12_500_000;

always @ (posedge clk or negedge rst_n)
if(~rst_n)
count<=25'd0;
else if(count==T0s5)
count<=25'd0;
else
count<=count+1'b1;

always @ (posedge clk or negedge rst_n)
if(~rst_n)
begin
led1_f<=1'b1;
led2_f<=8'b1111_1111;
end
else if(count==T0s25||count==T0s5)
begin
led1_f<=~led1_f;
if(count==T0s5)
if(led2_f==8'b1111_1111)
led2_f<=8'b1111_1110;
else
led2_f<={led2_f[6:0],1'b1};
end

assign led1=led1_f;
assign led2=led2_f;

endmodule

助工
2012-10-14 15:02:01 打赏
6楼

10.14 LED跑马灯+流水灯
利用板上的11个LED实现的多种方式的组合,效果:


代码;
module led_4(rstn,clk,led1,led10);
input rstn,clk;
output [9:0]led10;
output led1;

reg [9:0]led10_f;
reg led1_f;

reg [2:0]state;
reg [25:0]count;

always @ (posedge clk or negedge rstn)
if(~rstn)
begin
count<=1'b0;
end
else if(count==26'd50_000_000)
count<=1'b0;
else
count<=count+1'b1;

always @ (posedge clk or negedge rstn)
if(~rstn)
begin
led1_f<=1'b1;
state<=1'b0;
led10_f<=10'b11_1111_1111;
end
else if(count==25'd25_000_000 || count==26'd50_000_000)
begin
led1_f<=~led1_f;
if(count==26'd50_000_000)
begin
if(led10_f==10'b11_1111_1111 || led10_f==10'b00_0000_0000)
begin
if(state==3'b110 || state==3'b000)
state=3'b001;//not "<="
else state=state+1'b1;//not "<="

case(state)
3'b001: led10_f<=10'b11_1111_1110;
3'b010: led10_f<=10'b10_0000_0000;
3'b011: led10_f<=10'b11_1111_1110;
3'b100: led10_f<=10'b01_1111_1111;
3'b101: led10_f<=10'b00_0000_0001;
3'b110: led10_f<=10'b01_1111_1111;
default:led10_f<=10'h3ff;
endcase
end
else
case(state)
3'b001: led10_f<=led10_f<<1;
3'b010: led10_f<={1'b1,led10_f[9:1]};
3'b011: led10_f<={led10_f[8:0],1'b1};
3'b100: led10_f<=led10_f>>1;
3'b101: led10_f<={led10_f[8:0],1'b1};
3'b110: led10_f<={1'b1,led10_f[9:1]};
default:led10_f<=10'h3ff;
endcase
end
end

assign led1=led1_f;
assign led10=led10_f;

endmodule

这次遇到了个问题,如何使用阻塞性与非阻塞性过程赋值,问题出在注释处。
代码需要先改变变量state的值,然后根据state的值改变led10_f。如果使用非阻塞性赋值,没有等到state的值改变就改变led10_f,不能达到预定效果。


助工
2012-10-14 16:38:22 打赏
7楼

10.14 读取按键信号

利用8个按键控制8个LED的亮灭。按一下对应的LED点亮,再按一下灭。

代码:
module key_led(key,led);
input [7:0]key;
output [7:0]led;
reg [7:0]led1;

integer i;

always @ (key)
for(i=0;i<8;i=i+1)
if(key[i]==1'b0)
led1[i]<=~led1[i];

assign led=led1;

endmodule

由于没有进行消抖处理,实验中会有抖动现象。
下一步进行按键消抖。


助工
2012-10-14 20:14:44 打赏
8楼

10.14 按键消抖实验

按键在按下或者释放时会产生抖动,处于不稳定的状态。上一个实验直接读取按键值,产生了不稳定的现象。因此需要处理好这个抖动时间。下图为按键波形:

一般认为,按下时有20ms的不稳定时间。
消抖的方法是,在检测到有下降沿时锁存一个状态,然后在20ms后再锁存一个状态,然后对两个状态进行判断。

代码为;
module key_led(rstn,clk,key,led);
input rstn,clk;
input [7:0]key;
output [7:0]led;

reg [7:0]key1;
always @ (posedge clk or negedge rstn)
if(~rstn) key1<=8'hff;
else key1<=key;

reg [7:0]key2;
always @ (posedge clk or negedge rstn)
if(~rstn) key2<=8'hff;
else key2<=key1;
//check the negedge
wire [7:0]key_rst=key1&(~key2);

reg [19:0]count;
always @ (posedge clk or negedge rstn)
if(~rstn) count<=20'd0;
else if(key_rst!=1'b0) count<=20'd0;
else count<=count+1'b1;

reg [7:0]key3;
always @ (posedge clk or negedge rstn)
if(~rstn) key3<=8'hff;
else if(count==20'd1_000_000)
key3<=key;

reg [7:0]key4;
always @ (posedge clk or negedge rstn)
if(~rstn) key4<=8'hff;
else key4<=key3;
//check the states now and before 20ms
wire [7:0]key_f=key4&(~key3);

integer i;
reg [7:0]led_f;
always @ (posedge clk or negedge rstn)
if(~rstn) led_f<=8'hff;
else
for(i=0;i<8;i=i+1)
if(key_f[i]==1'b1)
led_f[i]<=~led_f[i];

assign led=led_f;

endmodule

前两个always语句是为了判断下降沿,然后产生延时,再在第四个always语句中取20ms后的状态,前一状态与后一状态取反相与,判断按键是否被按下。

经实验验证,这种方法可以很好的对按键进行消抖。


助工
2012-10-14 20:47:50 打赏
9楼
10.14 拨码开关控制LED

代码:
module sw_led(clk,sw,led);
input clk;
input[7:0]sw;
output[7:0]led;

reg[7:0]led_f;

always @ (posedge clk)
led_f<=sw;

assign led=led_f;

endmodule

代码比较简单,但在编译时出现问题:


这是由于Pin108默认为nCEO,即编程引脚,这样就会造成功能重复分配。
解决方法是将其修改为普通IO,assignments>device>device and pin options>dual-purpose pins:

菜鸟
2012-10-15 09:45:21 打赏
10楼
跟楼主学习中~

共13条 1/2 1 2 跳转至

回复

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