总的来说,我对Verilog和HDL非常陌生。我最近买了一个Mojo (斯巴达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这真的很简单,当MHz为1时,它会将数据移到时钟的正边(50 sshift_en )。sshift_en是sshift的当前值和翻转sshift_FF输出的补充(即检查上升的边缘)。
我的真正问题是:这是一种好/正确的方法吗?,我在Verilog中对实现移位寄存器做了大量的研究,我的概念基本上是一样的,只是我希望我的移位寄存器的“移位”信号由AVR (操作速度比FPGA上的50 MHz时钟慢得多)指示,而不是时钟信号(就像我看到的所有例子一样)。
如果我需要提供更多关于这里的信息,请告诉我。
提前谢谢你!
编辑:--我已经修改了代码,以包含一个同步部分:
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发布于 2014-03-28 20:46:22
在我看来你的值班记录没问题。
来自AVR的sshift信号是一个异步信号wrt您的FPGA时钟,这是一个可能的亚稳态来源。我会用同步器来减少机会。
见本文件“同步登记册”一节:
http://www.altera.com/literature/wp/wp-01082-quartus-ii-metastability.pdf
另一个小问题:虽然在你的例子中是可以互换的!(连同&& and可比)用于逻辑操作,而~用于逐位否定,而IMHO更适合用于这种上下文。一种常见的用法!是:
if (!condition)
https://stackoverflow.com/questions/22722263
复制相似问题