延迟后如何输出与二进制数相对应的方波?

时间:2018-07-11 19:15:06

标签: verilog fpga xilinx spartan

我有三个输出引脚(nCS,DCLK和DATA0)。我正在尝试使用fpga生成所有这三个。 DATA0将输出二进制数,nCS是片选线,DCLK是时钟(5 Mhz)。我正在用特定的通信协议连接存储芯片。 DATA0的位在DCLK的下降沿输出,并在DCLK的上升沿锁存到芯片中。在always块中(除了嵌套的一个)和变量计数器中,如果没有任何if语句,则二进制数在DATA0上连续输出。

问题是当我添加计数器代码时。我希望nCS线在几个时钟周期内变高,然后变低,以启用正在使用的设备。之后,应在时钟的上升沿输出二进制数。然后应该重复。使用我现在的代码,ncs线保持高电平,而data0线保持低电平。我认为变量计数器将增加到4,然后继续增加,同时输出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;

1 个答案:

答案 0 :(得分:0)

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

  1. 您的计数器定义为单个位。不可能用一位计数到四。
  2. counter <= 1;从未执行。您总是要增加计数器的数量,因为计时部分的最后一条语句是:counter <= counter + 1;,它会否决以前的所有分配。

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