小弟碰到一个FPGA中的设计问题,如下所述:
需要实现500MSPS的高速DA转换,所选的DA器件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
此帖出自
小平头技术问答
一周热门 更多>