我有三个输出引脚(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;
答案 0 :(得分:0)
我刚刚查看了您的代码,发现了两个主要错误:
counter <= 1;
从未执行。您总是要增加计数器的数量,因为计时部分的最后一条语句是:counter <= counter + 1;
,它会否决以前的所有分配。最后但并非最不重要:在代码中的always @ (pos/negedge ..)
语句中使用派生时钟是不明智的做法。
我不知道clkdivby8
的来源,但是这个名字表明您自己做了那个时钟。如果是这样,则应从您的主时钟运行此处的整个代码节,并每8个时钟周期执行一次。