高速数据并串转换,上升沿下降沿采样问题

2019-03-25 08:16发布

小弟碰到一个FPGA中的设计问题,如下所述:

需要实现500MSPS的高速DA转换,所选的DA器件AD9734中给出了在FPGA中的数据源的参考设计:
AD9734中给出的FPGA中数据源设计 AD9734中给出的FPGA中数据源设计

即在FPGA中实现一个并串转换功能,将两路250MSPS的数据(DATA1和DATA2)合成一路500MSPS数据(DB)输出给DA。图中给出的并串转换电路要求在时钟上升沿对DATA1采样,在下降沿对DATA2采样,小弟以前从未涉及过如此高频的时钟设计,不知该如何编写代码实现这段逻辑电路?

这是小弟写的verilog代码,从仿真的结果(附件中所示)来看,感觉数据的时序问题很严重,不知各位大哥有何建议?

仿真结果,感觉输出数据时序问题很严重 仿真结果,感觉输出数据时序问题很严重

module data_change(clk, reset, data1, data2, logic0, logic1, DB, dataclk, D1, D2, D1_temp, D2_temp);
        input clk, reset;
        input [7:0]data1, data2;
        input logic0, logic1;
        output [7:0]DB;
        output dataclk;
       
        output [7:0]D1, D2;
        output [7:0]D1_temp, D2_temp;
       
        reg [7:0]DB;
        reg dataclk;

       
        reg [7:0]data1_temp, data2_temp;
        reg [7:0]D1, D2;
        reg [7:0]D1_temp, D2_temp;
//        wire clk_neg;
       
//        assign clk_neg = ~clk;
       
        always @(posedge clk or negedge reset) begin
                if(~reset) begin
                        data1_temp <= 8'b00000000;
                        data2_temp <= 8'b00000000;
                end
                else begin
                        data1_temp <= data1;
                        data2_temp <= data2;
                end
        end

        always @(posedge clk or negedge reset) begin
                if(~reset) begin
                        D1 <= 8'b00000000;
                        D1_temp <= 8'b00000000;
                end
                else begin
                        D1 <= data1_temp;
                        D1_temp <= D1;
                end               
        end

        always @(negedge clk or negedge reset) begin
                if(~reset) begin
                        D2 <= 8'b00000000;
                        D2_temp <= 8'b00000000;
                end
                else begin
                        D2 <= data2_temp;
                        D2_temp <= D2;
                end       
        end
       
        always @(clk, D1, D2)
                if(~clk)
                        DB = D1;
                else
                        DB = D2;
                       
        always @(clk)
                if(~clk)
                        dataclk = logic0;
                else
                        dataclk = logic1;

endmodule 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。