我试图通过使用自己的时钟分频器模块来操作我的时钟。
module clockDivider(input logic input0,
input logic input1,
input logic clock,
output logic y);
// 00 = stop, 01 = slow, 10 = medium, 11 = fast;
if( ~input1 & ~input0 ) /*stop clock*/ ;
else if( ~input1 & input0 ) /*slow*/ ;
else if( input1 & ~input0 ) /*medium*/ ;
else if( input1 & input0 ) /*fast*/ ;
endmodule
如上所示,根据我的输入,我将操作我的时钟然后让步进电机位于我们的FPGA板上。但我无法弄清楚如何去做。
还有除doulos以外的任何网站吗?我认为它不是很清楚,只包含有关System Verilog的少量信息。
由于
答案 0 :(得分:2)
您可以直接使用模N计数器将频率除以N.
假设这是你所有3种类型的时钟。
@blur=validate(...)
这是代码。请注意,它是一个概念性代码,未经过验证。
00 - No Clock
01 - Clock/4
02 - Clock/2
03 - Clock
答案 1 :(得分:1)
通过slow
,medium
和fast
,我将假设您通过此逻辑预期的最快速度是clock
本身的速度,即您正在实施时钟分频器。
我假设了以下内容:
slow
= 0.25 *时钟
medium
= 0.5 *时钟
fast
=时钟
module clockDivider(input logic reset,
input logic input0,
input logic input1,
input logic clock,
output logic y);
// 00 = stop, 01 = slow, 10 = medium, 11 = fast;
logic delayed_y;
logic delayed_delayed_y;
logic [1:0] counter;
always @(posedge clock) begin
if (reset) begin
counter <= 'h0;
end
else begin
counter <= counter+1'b1;
end
end
always @(posedge clock) begin
if (reset) begin
delayed_y <= 1'b0;
end
else begin
delayed_y <= counter[0];
end
end
always @(posedge clock) begin
if (reset) begin
delayed_delayed_y <= 1'b0;
end
else begin
delayed_delayed_y <= counter[1];
end
end
always @(*) begin
if (reset) begin
y = 1'b0;
end
else begin
/*stop clock*/
if( ~input1 & ~input0 ) begin
y = 1'b0;
end
/*slow*/
else if( ~input1 & input0 ) begin
y = delayed_delayed_y;
end
/* medium*/
else if( input1 & ~input0 ) begin
y = delayed_y;
end
/* fast */
else if( input1 & input0 ) begin
y = clock;
end
end
end
endmodule
您可以在此处找到一个有效的示例:https://www.edaplayground.com/x/5J75
注意:如果您希望将时钟倍增,则需要在目标FPGA上使用DCM。还有另一种方法,有一个2输入XOR门和一个时钟缓冲器,但我会坚持使用DCM。