gpt4 book ai didi

counter - 滴答计数器 Verilog

转载 作者:行者123 更新时间:2023-12-04 20:15:59 25 4
gpt4 key购买 nike

我想知道如何为滴答计数器编写 verilog 程序。
当快速输入为低电平时,每 150 ms(每 7500000 个周期)输出一个周期为高电平
时钟周期为 20ns。
如果快速输入为高电平,tick 应每隔一个时钟周期在一个周期内变为高电平。

我在想我应该计算 clk 周期数,并在满足周期数时使用该计数来输出尽可能高的滴答声,但我似乎无法让它工作。

继承人我的代码:

module tick_counter(
input clk,
input reset,
input fast,
output reg tick
);

reg count;

always @(posedge clk) begin
count <= count + 1;
if((fast == 1)&&(count == 2)) begin
tick <= 1;
end
else if(fast == 0)&&(count == 7500000)) begin
tick <= 1;
end
end
endmodule

最佳答案

您的计数器只有 1 位宽,您没有包含重置,您也不会在需要时将计数器清零。 ==2 只是 == 7500000 的相移。尝试:

module tick_counter(
input clk,
input reset,
input fast,
output reg tick
);

reg [22:0] count;

always @(posedge clk or negedge reset) begin
if (~reset) begin
count <= 'd0;
tick <= 0;
end
else begin
if((fast == 1)&&(count == 2)) begin
tick <= 1;
count <= 'd0;
end
else if(fast == 0)&&(count == 7500000)) begin
tick <= 1;
count <= 'd0;
end
else begin
tick <= 0;
count <= count + 1;
end
end
end
endmodule

或者像下面这样的东西可能会合成更小:
reg  [22:0] count;

wire [22:0] comp = (fast) ? 23'd2: 23'd7500000 ;
wire done = count >= comp ;

always @(posedge clk or negedge reset) begin
if (~reset) begin
count <= 'd0;
tick <= 0;
end
else begin
if(done) begin
tick <= 1;
count <= 'd0;
end
else begin
tick <= 0;
count <= count + 1;
end
end
end

关于counter - 滴答计数器 Verilog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12294905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com