想利用RAM块实现a,b两路数据的延迟,其中a,b都是32位,速率为61.44Mb/s ,要求a路延迟16个数据时钟周期,b路延迟8个数据周期
请各位帮忙瞧一瞧代码哪里有问题??我怎么也查不出问题来,也没有报错就是
仿真得出的结果不对!!!!!!!!!!!!
`
timescale 1ns / 1ps
//利用RAM实现两路数据的延迟,其中a,b都是32位,速率为61.44Mb/s ,要求a路延迟16个数据时钟周期,b路延迟8个数据周期
module bram_delay(clk_122p88MHz,a,b,a_delay,b_delay);
input clk_122p88MHz;
input [31:0] a;
input [31:0] b;
output [31:0] a_delay;
output [31:0] b_delay;
reg [31:0] a_delay;
reg [31:0] b_delay;
wire[5:0] addra,addrb;
wire[31:0] douta,doutb;
reg[5:0] addra1=0;
reg[5:0] addra2=0;
reg[5:0] addrb1=32;
reg[5:0] addrb2=32;
reg wea=0;
reg web=0;
reg flag=0;
always@(posedge clk_122p88MHz)
begin
flag<= !flag;
if(flag ==1'b1)
begin
a_delay<=a_delay;
b_delay<=b_delay;
wea<=1'b1;
web<=1'b1;
addra2<=addra2;
addrb2<=addrb2;
if(addra1==31)
addra1<=0;
else
addra1<=addra1+1'b1;
if(addrb1==63)
addrb1<=32;
else
addrb1<=addrb1+1'b1;
end
else
begin
wea<=1'b0;
web<=1'b0;
a_delay<=douta;
b_delay<=doutb;
addra1<=addra1;
addrb1<=addrb1;
if(addra1<=15) //控制A路延迟的时间
addra2<=addra1+16;
else
addra2<=addra1-16;
if(addrb1<=39) //控制B路延迟的时间
addrb2<=addrb1+8;//........................
else
addrb2<=addrb1-8;
end
end
assign addra=!flag?addra1:addra2;
assign addrb=!flag?addrb1:addrb2;
bram_16 bram_16 (
.clka(clk_122p88MHz), // input clka
.wea(wea), // input [0 : 0] wea
.addra(addra), // input [3 : 0] addra
.dina(a), // input [31 : 0] dina
.douta(douta), // output [31 : 0] douta
.clkb(clk_122p88MHz), // input clkb
.web(web), // input [0 : 0] web
.addrb(addrb), // input [3 : 0] addrb
.dinb(b), // input [31 : 0] dinb
.doutb(doutb) // output [31 : 0] doutb
);
endmodule
设计fpga程序,首先要画出时序逻辑图,然后根据逻辑图来编写程序,这样编写完程序后就可以有目的的验证,不要先动手编程序,要不然还要从头开始设计。
一周热门 更多>