我是Verilog的新手,所以我不知道该怎么做。我有一个时钟,' samp_clk',用于切换系统时钟的每10个时钟周期,时钟' (或那是我试图做的)。这就是我到目前为止所做的:
//'counter' counts the number of rising edges for system clock
//'samp_clk' is the sample clock, 'clock' is system clock
always @ (posedge clock)begin
if(~reset)begin
if(counter == 10)begin
samp_clk <= 1;
counter <= 0;
end
else begin
samp_clk <= 0;
counter <= counter + 1;
end
end
end
我写它的方式,我觉得我的samp_clk只会在一个时钟周期内保持断言。我怎样才能使它每十个时钟周期在1到0之间切换?
答案 0 :(得分:1)
你想要切换它,所以要切换它。
另请注意,要每10个时钟切换一次,当值为10-1时,您必须将计数器设置为0.
试试这个(未经测试):
//'counter' counts the number of rising edge s for system clock
//'samp_clk' is the sample clock, 'clock' is sy stem clock
always @ (posedge clock)begin
if(~reset)begin
if(counter == 9)begin
samp_clk <= ~samp_clk;
counter <= 0;
end
else begin
counter <= counter + 1;
end
end
else begin
samp_clk <= 0;
end
end
答案 1 :(得分:1)
从你的代码:
if(counter == 10)begin
samp_clk <= 1;
counter <= 0;
end
这将导致11个时钟周期,因为我们从0开始计数到10个。
第一步,定义一个计数器,其中它重置为某个
数字(时钟周期)。例如,您要检测10个时钟
当counter
大于或等于9时,周期(n = 10),
它回到了0。
always @ (posedge clk)begin
if(~reset)begin
counter <= 0;
end
else begin
if(counter >= 9)begin
counter <= 0;
end
else begin
counter <= counter + 1;
end
end
end
然后简单地,当samp_clk
等于n-1(10 - 1 = 9)时,根据counter
切换。{/ p>
always @(posedge clk) begin
if (~reset) begin
samp_clk <= 0;
end
else begin
if (counter == 9) begin
samp_clk <= ~samp_clk;
end
end
end
请注意,我已将两个触发器分开,以便于调试 并且足够清楚,以了解其逻辑。
以下是包含测试平台的代码。
module ten_clock(input clk, reset, output reg samp_clk);
reg [7:0] counter;
//'counter' counts the number of rising edges for system clock
always @ (posedge clk)begin
if(~reset)begin
counter <= 0;
end
else begin
if(counter == 10)begin
//samp_clk <= 1;
counter <= 0;
end
else begin
//samp_clk <= 0;
counter <= counter + 1;
end
end
end
//'samp_clk' is the sample clock, 'clock' is system clock
always @(posedge clk) begin
if (~reset) begin
samp_clk <= 0;
end
else begin
if (counter == 9) begin
samp_clk <= ~samp_clk;
end
end
end
endmodule
module test;
reg clk, reset;
wire samp_clk;
ten_clock ten_clock(.*);
initial begin
clk = 0;
forever #1 clk = !clk;
end
initial begin
reset <= 1;
repeat (2) @(posedge clk);
reset <= 0;
repeat (2) @(posedge clk);
reset <= 1;
repeat (100) @(posedge clk);
$finish;
end
initial begin
$dumpfile("dump.vcd"); $dumpvars;
end
endmodule
您可以尝试运行this code并查看wave表单 如果这种行为符合你的期望。
答案 2 :(得分:0)
您是对的,当samp_clk
为1
时,此代码将counter
设置为10
,否则将其设置为0
。这意味着您将获得一个信号,该信号在1个时钟周期内保持低电平,并且低电平持续10个时钟周期。基本逻辑是正确的(计数10个时钟周期),但给samp_clk
的值不正确。
您希望拥有的是samp_clk
与前一周期相同的值counter
ins't 10
并且samp_clk
是。要翻转信号,您需要将信号分配给信号的倒数:samp_clk <= ~samp_clk
。
完成这项工作之后,您可能需要重构代码,因为我认为它将在当前状态下生成锁存器。