我对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