2014-03-28 180 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