|
发表于 2013-6-7 10:40:29
|
显示全部楼层
回复 3# obwl_rei
我修改了一下,写verilog时要想着对应的电路是什么样子的;module XB8804(Mclk, nRst,
FPGA_CLK, FPGA_RESET
);
input Mclk,nRst;
output FPGA_CLK,FPGA_RESET;
reg FPGA_CLK;
reg FPGA_RESET;
reg FPGA_CLK_D1,FPGA_CLK_D2;
reg[10:0] FPGA_CLK_CNT;
reg [11:0] clk_cnt;
reg[3:0] present,next;
wire FPGA_CLK_Rising;
wire FPGA_CLK_Falling;
wire Scan_Flag;
parameter IDLE=4'b1000,
RESET_L1=4'b0100,
RESET_H=4'b0010,
RESET_L2=4'b0001;
assign Scan_Flag=1;
always @(negedge nRst or posedge Mclk) //frequency division
if(!nRst)
begin
clk_cnt<=0;
FPGA_CLK<=1;
end
else if(clk_cnt==11'd625)
begin
clk_cnt<=11'd0;
FPGA_CLK<=~FPGA_CLK;
end
else
clk_cnt<=clk_cnt+11'd1;
always@(negedge nRst or posedge Mclk)
if(!nRst)
begin
FPGA_CLK_D1<=1'b0;
FPGA_CLK_D2<=1'b0;
end
else
begin
FPGA_CLK_D1<=FPGA_CLK;
FPGA_CLK_D2<=FPGA_CLK_D1;
end
assign FPGA_CLK_Rising=FPGA_CLK_D1&(~FPGA_CLK_D2);
assign FPGA_CLK_Falling=FPGA_CLK_D2&(~FPGA_CLK_D1);
always@(negedge nRst or posedge Mclk)
if(!nRst)
present<=IDLE;
else if(FPGA_CLK_Rising)
present<=next;
always@(posedge Mclk)
if(present==IDLE)
FPGA_CLK_CNT<=11'd0;
else if(FPGA_CLK_Rising==1'd1 || FPGA_CLK_Falling==1'd1)
FPGA_CLK_CNT<=FPGA_CLK_CNT+11'd1;
always@(Scan_Flag or present or FPGA_CLK_CNT)
case(present)
IDLE:
begin
FPGA_RESET<=1'd1;
if(Scan_Flag==1'b1)
next<=RESET_L1;
else
next<=IDLE;
end
RESET_L1:
begin
FPGA_RESET<=1'd0;
if(FPGA_CLK_CNT<11'd28)
next<=RESET_L1;
else
next<=RESET_H;
end
RESET_H:
begin
FPGA_RESET<=1'd1;
if(FPGA_CLK_CNT<11'd1056)
next<=RESET_H;
else
next<=RESET_L2;
end
RESET_L2:
begin
FPGA_RESET<=1'd0;
if(FPGA_CLK_CNT<11'd1069)
next<=RESET_L2;
else
next<=IDLE;
end
default:
begin
FPGA_RESET<=1'd1;
next<=IDLE;
end
endcase
endmodule |
|