2014-03-28 105 views
2

我对Verilog和HDL一般都很陌生。我最近购买了Mojo FPGA(斯巴达6)开发板,并一直在玩它。Verilog移位寄存器接口到AVR

我感兴趣的一个概念是移位寄存器,具体来说就是将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 

它很简单,它的时钟(50兆赫)的正沿转移数据时sshift_en为1 sshift_en是AND'ing的电流的结果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 

回答

1

你的移位寄存器描述看起来不错给我。

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

参见“同步寄存器”本文档中:

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

另一个小一点:尽管互换在你的榜样的情况下,! (连同& &和||)用于逻辑运算,而〜用于按位否定,这对于此上下文更适合。一个常用的!是:

if (!condition)

+0

感谢您的信息。在研究移位寄存器时,我曾经看到术语“亚稳态”的出现(当我尝试posedge触发sshift输入时,最初有问题,这在阅读后对我有意义)。另外,我同意 - 我来自C并且〜更有意义地回顾它。 – nslogan

+0

需要说明的是,我编辑的代码是否超出了你所说的同步类型?我从[这里]得到了这个想法(http://ece.wpi.edu/~rjduck/Synthesis%20and%20Timing%20module 2011%%20rev%20a.pdf)。 – nslogan