我對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
感謝您的信息。在研究移位寄存器時,我曾經看到術語「亞穩態」的出現(當我嘗試posedge觸發sshift輸入時,最初有問題,這在閱讀後對我有意義)。另外,我同意 - 我來自C並且〜更有意義地回顧它。 – nslogan
需要說明的是,我編輯的代碼是否超出了你所說的同步類型?我從[這裏]得到了這個想法(http://ece.wpi.edu/~rjduck/Synthesis%20and%20Timing%20module 2011%%20rev%20a.pdf)。 – nslogan