Synchronization AVR的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, //

一般来说,我对Verilog和HDL都很陌生。我最近购买了一个Mojo FPGA(Spartan 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
模块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