labview里是有设定程序的运行时间这个说法
但是fpga没有,fpga的运行时间是根据你用的开发板的,现在比较常见的就是50MHZ的时钟,就是20ns一个clk。你可以通过分频来获得想要的时钟频率
当然你在仿真的时候可以直接改变某个输入的时钟频率,至于怎么改要看你用的是哪个软件了
module Timer_Design(input wire clk, //时钟信号输入端F = 1Hz P = 1s
input wire res, //复位信号,Low Active低有效
input wire [1:0] data, //定时模式[长短]选择
output reg x
)
/*******************************功能描述***************************
data = 2'b00 -> 无定时, 告警信号X一直为0
data = 2'b01 -> 5s定时, 告警信号X保持6s的高,但是5s就会输出一个
告警,这个有一点冲突
data = 2'b10 -> 10s定时,每隔10s输出一个告警信号,告警信号保持6s
data = 2'b11 -> 15s定时,每隔15输出一个告警有效信号
******************************************************************/
//这里有一个不明确的地方,是否定时是一直在运行,如果一直在运行定时,那么第一个假设定时时间是5s
//5s到了之后告警信号拉高,此时定时清零继续运行,告警信号要保持6s的高,那么5s定时到的时候告警信
//号依旧是高,以此循环,5S定时的话X会一直保持高。
//另外一种情况是定时一直在运行,但是X持续高时间需要低于定时周期5s
//第三种可能是定时不一直运行,定时到5s之后,X输出6s的高,此时定时是停止的,6s之后重新开始定时
//但是这个定时周期的定义就有问题了
//所以考虑以上情况,我选择第二种,将X持续时间缩短到3s
reg [3:0] timer_cnt
always @(posedge clk,negedge res) begin
if(!rss) begin
x <= 1'b0
timer_cnt <= 4'd0
end
else case(data)
2'b00 : begin
x <= 1'b0
timer_cnt <= 4'd0
end
2'b01 : begin //定时5s
if(timer_cnt <= 4'd1) begin
x <= x //刚开始定时的时候不能将之拉高,所以这里用保持
timer_cnt <= timer_cnt + 1'b1
end
else if(timer_cnt <= 4'd3) begin
timer_cnt <= timer_cnt + 1'b1
x <= 1'b0
end
else begin //timer_cnt = 4
timer_cnt <= 4'd0
x <= 1'b1
end
end
2'b10 : begin //定时10
if(timer_cnt <= 4'd1) begin //x保持3s的高
x <= x //刚开始定时的时候不能将之拉高,所以这里用保持
timer_cnt <= timer_cnt + 1'b1
end
else if(timer_cnt <= 4'd8) begin
timer_cnt <= timer_cnt + 1'b1
x <= 1'b0
end
else begin //timer_cnt = 9
timer_cnt <= 4'd0
x <= 1'b1
end
end
2'b11 : begin //定时15
if(timer_cnt <= 4'd1) begin //x保持3s的高
x <= x //刚开始定时的时候不能将之拉高,所以这里用保持
timer_cnt <= timer_cnt + 1'b1
end
else if(timer_cnt <= 4'd13) begin //cnt = 2~(14-1)
timer_cnt <= timer_cnt + 1'b1
x <= 1'b0
end
else begin //timer_cnt = 14
timer_cnt <= 4'd0
x <= 1'b1
end
end
default :
endcase
end
endmodule
有问题可以补充。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)