我今天写了我生平第一个FPGA代码,遇到了问题向大神请教。
(
input sck,
input rst_n,
output led_en
);
reg [25:0] cnt;
always@(posedge sck or negedge rst_n)
begin
if(!rst_n)
cnt <= 26'd0;
else if(cnt<49_999_999)
cnt <= cnt+1'b1;
else
cnt <= 26'd0;
end
assign led_en = (cnt > 26'd25_000_000) ? 1'b1 : 1'b0;
endmodule
module LED_module
(
input sck,
input rst_n,
input led_en,
output reg [3:0] LED_Data
);
always@ (posedge led_en or negedge rst_n)
begin
if(!rst_n)
LED_Data[3:0] <= 4'b0001;
else
LED_Data[3:0] <= {LED_Data[2:0],LED_Data[3]};
end
endmodule
module LED_Runing
(
input sck,
input rst_n,
output [3:0] LED_Data
);
wire led_en;
LED_Clock LED_Clock_Init
(
.sck (sck),
.rst_n (rst_n),
.led_en (led_en)
);
LED_module LED_module_Init
(
.sck (sck),
.rst_n (rst_n),
.led_en (led_en),
.LED_Data (LED_Data)
);
endmodule
建议小编先做一下功能仿真看看,如果还是没发现问题,可以用时序仿真,或signaltap观测(quartus自带)。另外,写个流水灯不用这么麻烦,一个module就能搞定了,这样写有点乱,而且有可能会产生毛刺
谢谢指点
不要用分频时钟作为敏感性号,有毛刺的always@ (posedge led_en or negedge rst_n)
module test(
input sck,
input rst_n,
output reg [2:0] LED_Data);
reg [25:0] cnt;
always@(posedge sck or negedge rst_n)
begin
if(!rst_n)
cnt <= 0;
else if(cnt>26'd49_000_000)
cnt <=0;
else
cnt<=cnt+1'b1;
end
always@ (posedge sck or negedge rst_n) //要用系统时钟
begin
if(!rst_n)
LED_Data[2:0] <= 3'b001;
else if(cnt==0) //改成这样就正常了
LED_Data[2:0] <= {LED_Data[1:0],LED_Data[2]};
end
endmodule
分成多个模块写是没有问题的
多谢多谢,为什么用敏感信号作为时钟会有毛刺呢?
可以去看看规范,不要用分频始终做敏感信号,至于为什么,我认为是不是因为在系统时钟的时候会产生两个时钟?
为了学习而点的这个灯吧!弄得这么复杂还上原语了。
LED_Data[3:0] <= {LED_Data[2:0],LED_Data[3]};这句位拼接并没有指定具体的LED_Data每一位值给0还是1,难道是在原语里面操作的?如果没有指定,你这个亮完之后就有问题啦
太复杂了吧 小编 一个分频就可以了啊
