Synchronization AVR的Verilog移位寄存器接口
一般来说,我对Verilog和HDL都很陌生。我最近购买了一个Mojo FPGA(Spartan 6)开发板,并一直在使用它 我感兴趣的一个概念是移位寄存器,特别是将ATmega连接到FPGA以在FPGA上加载移位寄存器。我在与Verilog的合作中:Synchronization AVR的Verilog移位寄存器接口,synchronization,verilog,fpga,shift-register,Synchronization,Verilog,Fpga,Shift Register,一般来说,我对Verilog和HDL都很陌生。我最近购买了一个Mojo FPGA(Spartan 6)开发板,并一直在使用它 我感兴趣的一个概念是移位寄存器,特别是将ATmega连接到FPGA以在FPGA上加载移位寄存器。我在与Verilog的合作中: module sr8( input clk, // FPGA clock input sshift, // Shift signal from ATmega input sdata, //
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
模块sr8(
输入时钟,//FPGA时钟
输入SSShift,//来自ATmega的移位信号
输入sdata,//来自ATmega的数据
输出[7:0]PO//并行输出
);
//移位寄存器
reg[7:0]srdata=8'd0;
reg SSShift\u FF;
钢丝绳换档;
始终@(posedge clk)开始
在我看来,移位寄存器的描述还可以
来自AVR的sshift
信号是FPGA时钟上的异步信号,这可能是亚稳态的来源。我会用一个同步器来减少机会
请参阅本文档中的“同步寄存器”部分:
另一个小问题:虽然在你的例子中可以互换,但是!(与&&和| |)一起用于逻辑运算,而~用于按位求反,IMHO更适合此上下文。一个常见的用法!是:
如果(!条件)
谢谢您提供的信息。在研究移位寄存器时,我看到“亚稳态”这个术语出现了一些问题(最初,当我试图posedge触发ssshift输入时,出现了一些问题,读了一些之后,我觉得这很有意义)。另外,我也同意——我来自C语言,回过头来看更有意义。说清楚一点,我在上面编辑的代码就是你所说的那种同步吗?我从中得到了这个想法。
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