首页 > 解决方案 > 延迟后如何输出二进制数对应的方波?

问题描述

我有三个输出引脚(nCS、DCLK 和 DATA0)。我正在尝试使用 fpga 生成所有三个。DATA0会输出二进制数,nCS是片选线,DCLK是时钟(5MHz)。我正在将内存芯片与特定的通信协议连接起来。DATA0 位在 DCLK 的下降沿输出,并在 DCLK 的上升沿锁存到芯片中。在 always 块中没有任何 if 语句(嵌套的除外)和变量 counter,二进制数在 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;

标签: verilogfpgaxilinxspartan

解决方案


我刚刚查看了您的代码,发现了两个主要错误:

  1. 您的计数器被定义为一个位。不可能用一位数到四。
  2. counter <= 1;永远不会执行。您总是递增计数器,因为时钟部分中的最后一条语句是:counter <= counter + 1;它会否决任何先前的分配。

最后但同样重要的是:always @ (pos/negedge ..)在代码中的语句中使用派生时钟是一种不好的做法。
我不知道clkdivby8从哪里来,但这个名字表明你自己做了那个时钟。如果是这样,这里的整个代码部分应该从您的主时钟运行并每 8 个时钟周期执行一次。


推荐阅读