【问题标题】:Verilog Shift Register interface to AVRVerilog 移位寄存器接口到 AVR
【发布时间】:2014-03-29 11:23:30
【问题描述】:

总的来说,我对 Verilog 和 HDL 非常陌生。我最近购买了一个 Mojo FPGA (Spartan 6) 开发板,并且一直在使用它。

我感兴趣的一个概念是移位寄存器,特别是,将 ATmega 连接到 FPGA 以在 FPGA 上加载移位寄存器。我有这个与这个 Verilog 之间的工作:

module sr8(
    input clk,        // FPGA clock
    input sshift,     // Shift signal from ATmega
    input sdata,      // Data from ATmega
    output [7:0] PO   // Parallel output
);

// Shift register
reg [7:0] srdata = 8'd0;

reg sshift_FF;
wire sshift_en;
always @(posedge clk) begin
    sshift_FF <= sshift;
end
assign sshift_en = sshift & !sshift_FF;

always @(posedge clk) begin
    if ( sshift_en ) begin
        srdata <= { srdata[6:0], sdata };
    end
end

assign PO = srdata;

endmodule

这真的很简单,当 sshift_en 为 1 时,它在时钟的上升沿 (50 MHz) 移入数据。 sshift_en 是与 sshift 的当前值和翻转输出的互补的结果翻转 sshift_FF(即检查上升沿)。

我真正的问题是:这是一个好的/正确的方法吗? 我已经对在 Verilog 中实现移位寄存器进行了大量研究,我的概念基本上是相同的,只是我希望移位寄存器的“移位”信号由 AVR 指示(运行速度比 50 MHz 时钟慢得多) FPGA)而不是时钟信号(就像我见过的所有例子一样)。

如果我需要在此处提供有关任何内容的更多信息,请告诉我。

提前谢谢你!

编辑: 我修改了代码以包含同步部分:

module sr8(
    input clk,
    input sshift,
    input sdata,
    output [7:0] PO
);

// Shift register
reg [7:0] srdata = 8'd0;

// Start of modified synchronization section
reg sshift_d, sshift_dd, sshift_ddd, sshift_en;
always @(posedge clk) begin
    sshift_d <= sshift;
    sshift_dd <= sshift_d;
    sshift_ddd <= sshift_dd;
    sshift_en <= sshift_dd & ~sshift_ddd;
end
// End of modified section

always @(posedge clk) begin
    if ( sshift_en ) begin
        srdata <= { srdata[6:0], sdata };
    end
end

assign PO = srdata;

endmodule

【问题讨论】:

    标签: synchronization verilog fpga shift-register


    【解决方案1】:

    我觉得你的移位寄存器描述没问题。

    来自 AVR 的sshift 信号是与您的 FPGA 时钟相关的异步信号,这可能是亚稳态的来源。我会使用同步器来减少机会。

    请参阅本文档中的“同步寄存器”部分:

    http://www.altera.com/literature/wp/wp-01082-quartus-ii-metastability.pdf

    另一个小问题:尽管在您的示例中可以互换,但! (与 && 和 || 一起)用于逻辑运算,而 ~ 用于按位求反,恕我直言,这更适合这种情况。的一个常见用途!是:

    if (!condition)

    【讨论】:

    • 感谢您的信息。我在研究移位寄存器时看到了“亚稳态”这个词(最初当我试图触发 sshift 输入时遇到问题,经过阅读后这对我来说很有意义)。另外,我同意 - 我来自 C 并且 ~ 回顾它更有意义。
    • 说清楚,我在上面编辑的代码是你所说的那种同步吗?我从here得到这个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多