关于Verilog代码的时钟频率问题

关于Verilog代码的时钟频率问题,第1张

always @(cnt_scan) 这种写法不是时序逻辑,是组合逻辑。不是采集cnt_scan的上升沿。是只要cnt_scan变化就会执行,只要两个时刻的值不同,就执行always下的程序。

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

有问题可以补充。。。

在module paobiao中把执行条件srt=1,在module shizhong中把执行条件srt=0;

通过按键消抖,当按键按一下是对外部srt=~srt执行一次。其他的计时很容易设计。

wire clk,reset;的确是多余的。按照标准如果没有显示说明,都认为是wire类型。

idle在这里是表示所有其它未定义状态均回归idle状态。是电路未知状态稳定性回归描述的一部分。想想现实电路如果出现外部电磁干扰造成影响而状态变成未知的状况的时候,这时没有reset信号将会怎样?

1 。clk25,clk48只是方便读者了解此时钟的频率,比如clk25一般指25M的clk,clk48一般指48M的clk。他们只是在clk这个名字后面加个后缀,方便而已。

2500HZ的周期是2ms,即高电平持续1ms,低电平再持续1ms,如此反复。如果clk是48M,那么clk的周期就是002us,也就是需要50000个clk才能达到1ms的时间。所以你上面的code明显是不对的。呵呵。

verilog里面没有系统时钟这个东西,他是verilog 设计人员根据自己的需求来定义出来的东西,但是在rtl上是没有特别的体现。在dc综合的时候,可以create_clock的命令来定义时钟。例如:

create_clock -period 10 -name host_clk -waveform [3 5 8 9] [get_ports host_clk]

时钟来源于模块输入接口host_clk,命令为host_clk, 周期为10ns,0ns处于低电平,3ns上升沿,5ns下降沿,8上升沿,9ns下降沿,以10ns为周期循环。

不知道高低时钟频率差多少,

以下代码供参考(要求高时钟频率是低时钟频率的3倍以上):

module button( clk_h, clk_l rst, dada_i, data_o);

input clk_h, clk_l rst;

input [7:0] dada_i;

output reg [7:0] dada_o;

reg clk_l_1b, clk_l_2b;

always@(posedge clk_dut or negedge rst)

if(!rst)

begin clk_l_1b <= 1'b0; clk_l_2b <= 1'b0; end

else

begin clk_l_1b <= clk_l; clk_l_2b <= clk_l_1b; end

always@(posedge clk_dut or negedge rst)

if(!rst)

data_o <= 8'b0;

else if (clk_l_2b && !clk_l_1b)

data_o <= data_i;

endmodule

以上就是关于关于Verilog代码的时钟频率问题全部的内容,包括:关于Verilog代码的时钟频率问题、verilog 简单定时器设计 回答满意可再加分。多谢!要求写出完整的程序啊、Verilog HDL的数字秒表和电子时钟设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9707354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存