如何延时后输出一个二进制数对应的方波?
How do I output a square wave corresponding to a binary number after a delay?
我有三个输出引脚(nCS、DCLK 和 DATA0)。我正在尝试用 fpga 生成所有三个。 DATA0会输出二进制数,nCS是芯片select线,DCLK是时钟(5Mhz)。我正在使用特定的通信协议连接内存芯片。 DATA0 的位在DCLK 的下降沿输出,在DCLK 的上升沿锁存到芯片中。 always 块(嵌套块除外)和变量 counter 中没有任何 if 语句,二进制数在 DATA0 上连续输出。
问题出在我添加计数器代码时。我希望 nCS 线在几个时钟周期内变高然后变低,从而启用我正在使用的设备。之后,二进制数应在时钟的上升沿输出。然后应该重复。使用我现在的代码,ncs 线保持高电平,data0 线保持低电平。我认为变量计数器会增加到四个,然后在输出 DATA0 位时继续增加,并在到达嵌套 if 语句后从 1 开始。这里有什么问题?我愿意提供更多信息,希望您能给我一些创建更好的 Verilog 的提示。
output nCS;
output DCLK;
output DATA0;
reg counter= 1;
wire [7:0] code = 8'b10011111;
reg [7:0] flag = 8'b10000000;
reg ncs;
reg data0 = 0;
always @ (negedge clkdivby8) begin
if (counter < 4 ) begin
ncs <= 1'b1;
end
else begin
ncs <= 1'b0;
data0 <= !(code & flag) ? 1'b0 : 1'b1;
flag <= flag >> 1;
if (flag == 8'b1) begin
flag <= 8'b10000000;
counter <= 1;
end
end
counter <= counter + 1;
end
assign nCS = ncs;
assign DCLK = clkdivby8; //the 5 MHz clock
assign DATA0 = data0;
我刚刚看了你的代码,发现了两个主要错误:
- 您的计数器定义为单个位。不可能用一位数到四。
- 此
counter <= 1;
永远不会执行。您始终会增加计数器,因为您的计时部分中的最后一条语句是:counter <= counter + 1;
,这会否决任何先前的分配。
最后但同样重要的是:在代码的 always @ (pos/negedge ..)
语句中使用派生时钟是不好的做法。
我不知道 clkdivby8
是从哪里来的,但这个名字表明你自己制作了那个时钟。如果是这样,这里的整个代码部分应该是 运行 来自您的主时钟,并且每 8 个时钟周期执行一次。
我有三个输出引脚(nCS、DCLK 和 DATA0)。我正在尝试用 fpga 生成所有三个。 DATA0会输出二进制数,nCS是芯片select线,DCLK是时钟(5Mhz)。我正在使用特定的通信协议连接内存芯片。 DATA0 的位在DCLK 的下降沿输出,在DCLK 的上升沿锁存到芯片中。 always 块(嵌套块除外)和变量 counter 中没有任何 if 语句,二进制数在 DATA0 上连续输出。
问题出在我添加计数器代码时。我希望 nCS 线在几个时钟周期内变高然后变低,从而启用我正在使用的设备。之后,二进制数应在时钟的上升沿输出。然后应该重复。使用我现在的代码,ncs 线保持高电平,data0 线保持低电平。我认为变量计数器会增加到四个,然后在输出 DATA0 位时继续增加,并在到达嵌套 if 语句后从 1 开始。这里有什么问题?我愿意提供更多信息,希望您能给我一些创建更好的 Verilog 的提示。
output nCS;
output DCLK;
output DATA0;
reg counter= 1;
wire [7:0] code = 8'b10011111;
reg [7:0] flag = 8'b10000000;
reg ncs;
reg data0 = 0;
always @ (negedge clkdivby8) begin
if (counter < 4 ) begin
ncs <= 1'b1;
end
else begin
ncs <= 1'b0;
data0 <= !(code & flag) ? 1'b0 : 1'b1;
flag <= flag >> 1;
if (flag == 8'b1) begin
flag <= 8'b10000000;
counter <= 1;
end
end
counter <= counter + 1;
end
assign nCS = ncs;
assign DCLK = clkdivby8; //the 5 MHz clock
assign DATA0 = data0;
我刚刚看了你的代码,发现了两个主要错误:
- 您的计数器定义为单个位。不可能用一位数到四。
- 此
counter <= 1;
永远不会执行。您始终会增加计数器,因为您的计时部分中的最后一条语句是:counter <= counter + 1;
,这会否决任何先前的分配。
最后但同样重要的是:在代码的 always @ (pos/negedge ..)
语句中使用派生时钟是不好的做法。
我不知道 clkdivby8
是从哪里来的,但这个名字表明你自己制作了那个时钟。如果是这样,这里的整个代码部分应该是 运行 来自您的主时钟,并且每 8 个时钟周期执行一次。