verilog - 延迟后如何输出二进制数对应的方波?
问题描述
我有三个输出引脚(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;
解决方案
我刚刚查看了您的代码,发现了两个主要错误:
- 您的计数器被定义为一个位。不可能用一位数到四。
- 这
counter <= 1;
永远不会执行。您总是递增计数器,因为时钟部分中的最后一条语句是:counter <= counter + 1;
它会否决任何先前的分配。
最后但同样重要的是:always @ (pos/negedge ..)
在代码中的语句中使用派生时钟是一种不好的做法。
我不知道clkdivby8
从哪里来,但这个名字表明你自己做了那个时钟。如果是这样,这里的整个代码部分应该从您的主时钟运行并每 8 个时钟周期执行一次。
推荐阅读
- excel - VBA-如果列具有某些文本并将其粘贴到某个单元格区域中,则将数据传输到另一个工作表
- javascript - React——为什么循环状态更新先于递归状态更新?
- python - 带有标头的 post API 的蝗虫基准测试
- c# - 使用 xunit 运行测试时,OpenCover 会抛出缺少的程序集异常
- php - 使用方法的返回值作为另一个对象的属性名
- r - 使用预定义参数模拟混合效应模型的数据
- git - 如何在使用 Visual Studio 在 git 中恢复提交后重新提交代码
- postgresql - 如何使用 Fluent 从 Vapor 3 中的同一个表中进行两个 JOIN 查询?
- opencv - 在 OpenCV 中使用 GPU
- keycloak - greenmail - keycloak connection doesn't work