作者papa2958 (当当是蓝 你是白)
看板Electronics
标题[问题] 16个led跑马灯的问题
时间Sat Apr 25 22:25:11 2009
我要作一个 从右亮到左 然後在从左亮到右的跑马灯
总共有16个,然後当跑马灯在最右边或最左边亮时,後来的out就会等於
原先out加上输入的数字(stepsize)
这是我的程式码(我只想到这种笨方法 所以很长)
不知道哪里写错了 那个1的值都不会跑...
还是用状态机比较好呢?
麻烦知道的人教我 谢谢!!
module runled(out,led,speed1,clk2,stepsize);
output led;
reg [15:0]led;
input speed1;
input clk2;
input stepsize;
output out;
reg [6:0]out;
always@(posedge clk2 or speed1)
begin if(speed1==1)
out=7'b0;
led=0;
led[15]=1;
if(led[15]==1)
begin
led[14]<=led[15];
led[15]<=0;
end
else if(led[14]==1)
begin
led[13]<=led[14];
led[15]<=0;
end
else if(led[13]==1)
begin
led[12]<=led[13];
led[13]<=0;
end
else if(led[12]==1)
begin
led[11]<=led[12];
led[12]<=0;
end
else if(led[11]==1)
begin
led[9]<=led[10];
led[10]<=0;
end
else if(led[9]==1)
begin
led[8]<=led[9];
led[9]<=0;
end
else if(led[8]==1)
begin
led[7]<=led[8];
led[8]<=0;
end
else if(led[7]==1)
begin
led[6]<=led[7];
led[7]<=0;
end
else if(led[6]==1)
begin
led[5]<=led[6];
led[6]<=0;
end
else if(led[5]==1)
begin
led[4]<=led[5];
led[5]<=0;
end
else if(led[4]==1)
begin
led[3]<=led[4];
led[4]<=0;
end
else if(led[3]==1)
begin
led[2]<=led[3];
led[3]<=0;
end
else if(led[2]==1)
begin
led[1]<=led[2];
led[2]<=0;
end
else if(led[1]==1)
begin
led[0]<=led[1];
led[1]<=0;
end
if(led[15]==1)begin
out<=out+stepsize;
end
else if(led[0]==1)
out<=out+stepsize;
end
endmodule
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.217.238
※ 编辑: papa2958 来自: 140.115.217.238 (04/25 22:25)
1F:推 ksmrt0123:把led[15:0]当做shift register, reset给16'h8000 04/25 22:43
2F:→ ksmrt0123:要有一个register记着左移或右移 04/25 22:45
3F:→ ksmrt0123:然後就 "shift过来 shift过去" 就好了... 04/25 22:46
4F:推 mepass:怎麽好像最近都只有verilog讨论 学VHDL比较少吗 哭哭 04/25 22:51
5F:→ papa2958:reset给16'h8000?? 这个看不太懂 我这样写不是就是 04/25 22:54
6F:→ papa2958:shift register了? 04/25 22:54
7F:推 ksmrt0123:抱歉, 我的意思是, shift用这样的写法: 04/25 23:04
8F:→ ksmrt0123: led[15:0] <= {1'b0, led[15:1]}; // right shift 04/25 23:05
9F:→ ksmrt0123:reset时把16'h8000 assign给 led[15:0] 04/25 23:07