سلام دوستان.
من یه برنامه در مادلسیم نوشتم که برای سنتزش باید آنرا در Proteus اجرا کنم.ولی error میدهد که در مادلسیم با توجه به امکاناتش نمیدهد.
حالا از دوستان اگه کسی میتونه کمکم کنه و error اش رو برطرف کنه.
البته با verilog نوشته شده.
این برنامه برنامه ایست که جمع دو فرکانس ورودی را در خروجی می گذارد و کلاکی با همان دوره تناوب تولید میکند.
با تشکر
کد:
module f_c1(clk1,clk2,clk_sys,reset,cl2);
input clk1,clk2,clk_sys,reset;
output cl2 ;
reg [100:0]count,count_1,next_state,state,next_state_1,state_ 1,clk_prd_1,clk_prd_2;
reg [100:0]clk_prd_total,cl2_count;
reg cl2;
parameter [3:0] s0=1,s1=2,counter=3,exit=4;
parameter [3:0] s00=5,ss=6,counter1=7,exit1=8;
reg rst;
reg rst_1;
reg cl2_en;
//-----------------------------------------
reg [2:0] shReg,shReg_1;
wire clkPos,clkPos_1;
always @(posedge clk_sys)
shReg = {shReg[1:0],clk1};
assign clkPos = ~shReg[1] & shReg[0];
always @(posedge clk_sys)
shReg_1 = {shReg_1[1:0],clk2};
assign clkPos_1 = ~shReg_1[1] & shReg_1[0];
//-----------------------------------------
initial
begin
state<=s0;next_state <= s0 ;
rst=reset;
end
initial
begin
rst_1=reset;
state_1=s00;next_state_1 = s00 ;
end
always @(posedge clk_sys)
begin
if (rst==1'b1)
begin
next_state <= s0;
end
else
begin
state <= next_state;
end
case(state)
s0 :
begin
count = 0;
next_state = s1 ;
end
s1 :
begin
if (clkPos==1'b1)
begin
next_state = counter;
end
else next_state = s1 ;
end
counter :
begin
count = count + 1;
if (clkPos==1'b1)
next_state = exit;
else
next_state = counter;
end
exit :
begin
clk_prd_1 = count*4;
rst = 1'b1;
end
endcase
end
always @(posedge clk_sys)
begin
if (rst_1==1'b1)
begin
next_state_1 <= s00;
end
else
begin
state_1 <= next_state_1;
end
case(state_1)
s00 :
begin
count_1 = 0;
next_state_1 = ss ;
end
ss :
begin
if (clkPos_1==1'b1)
begin
next_state_1 = counter1;
end
else next_state_1 = ss ;
end
counter1 :
begin
count_1 = count_1 + 1;
if (clkPos_1==1'b1)
next_state_1 = exit1;
else
next_state_1 = counter1;
end
exit1 :
begin
clk_prd_2 = count_1 * 4;
rst_1=1'b1;
end
endcase
assign clk_prd_total=(clk_prd_1*clk_prd_2)/(clk_prd_1+clk_prd_2);
if (reset==1)
begin
cl2_count = 0 ;
cl2_en = 1'b0 ;
end
else if (clk_prd_total != 0)
begin
if (cl2_count != clk_prd_total)
cl2_count <= cl2_count + 1 ;
else
begin
cl2_en <= 1'b1 ;
cl2_count <= 0'b0 ;
end
cl2_en = 0 ;
end
assign cl2 = cl2_en;
end
endmodule
من یه برنامه در مادلسیم نوشتم که برای سنتزش باید آنرا در Proteus اجرا کنم.ولی error میدهد که در مادلسیم با توجه به امکاناتش نمیدهد.
حالا از دوستان اگه کسی میتونه کمکم کنه و error اش رو برطرف کنه.
البته با verilog نوشته شده.
این برنامه برنامه ایست که جمع دو فرکانس ورودی را در خروجی می گذارد و کلاکی با همان دوره تناوب تولید میکند.
با تشکر
کد:
module f_c1(clk1,clk2,clk_sys,reset,cl2);
input clk1,clk2,clk_sys,reset;
output cl2 ;
reg [100:0]count,count_1,next_state,state,next_state_1,state_ 1,clk_prd_1,clk_prd_2;
reg [100:0]clk_prd_total,cl2_count;
reg cl2;
parameter [3:0] s0=1,s1=2,counter=3,exit=4;
parameter [3:0] s00=5,ss=6,counter1=7,exit1=8;
reg rst;
reg rst_1;
reg cl2_en;
//-----------------------------------------
reg [2:0] shReg,shReg_1;
wire clkPos,clkPos_1;
always @(posedge clk_sys)
shReg = {shReg[1:0],clk1};
assign clkPos = ~shReg[1] & shReg[0];
always @(posedge clk_sys)
shReg_1 = {shReg_1[1:0],clk2};
assign clkPos_1 = ~shReg_1[1] & shReg_1[0];
//-----------------------------------------
initial
begin
state<=s0;next_state <= s0 ;
rst=reset;
end
initial
begin
rst_1=reset;
state_1=s00;next_state_1 = s00 ;
end
always @(posedge clk_sys)
begin
if (rst==1'b1)
begin
next_state <= s0;
end
else
begin
state <= next_state;
end
case(state)
s0 :
begin
count = 0;
next_state = s1 ;
end
s1 :
begin
if (clkPos==1'b1)
begin
next_state = counter;
end
else next_state = s1 ;
end
counter :
begin
count = count + 1;
if (clkPos==1'b1)
next_state = exit;
else
next_state = counter;
end
exit :
begin
clk_prd_1 = count*4;
rst = 1'b1;
end
endcase
end
always @(posedge clk_sys)
begin
if (rst_1==1'b1)
begin
next_state_1 <= s00;
end
else
begin
state_1 <= next_state_1;
end
case(state_1)
s00 :
begin
count_1 = 0;
next_state_1 = ss ;
end
ss :
begin
if (clkPos_1==1'b1)
begin
next_state_1 = counter1;
end
else next_state_1 = ss ;
end
counter1 :
begin
count_1 = count_1 + 1;
if (clkPos_1==1'b1)
next_state_1 = exit1;
else
next_state_1 = counter1;
end
exit1 :
begin
clk_prd_2 = count_1 * 4;
rst_1=1'b1;
end
endcase
assign clk_prd_total=(clk_prd_1*clk_prd_2)/(clk_prd_1+clk_prd_2);
if (reset==1)
begin
cl2_count = 0 ;
cl2_en = 1'b0 ;
end
else if (clk_prd_total != 0)
begin
if (cl2_count != clk_prd_total)
cl2_count <= cl2_count + 1 ;
else
begin
cl2_en <= 1'b1 ;
cl2_count <= 0'b0 ;
end
cl2_en = 0 ;
end
assign cl2 = cl2_en;
end
endmodule