基于Verilog的串口调试,在Modelsim中仿真正常,但在FPGA开发板上没反应

2012年11月21日 19:23    发布者:x1i2e3
基于Verilog的串口调试,在Modelsim中仿真正常,但在FPGA开发板上用串口调试助手调试没反应,麻烦高手指教一下。万分感谢!

顶层文件
module ckdcwj(rst,clk,rxd,txd,data1,nclk);
input rst;
input clk;
input rxd;
output  txd;
inout data1;
inout nclk;
wire    data1;
wire  nclk;
js_rxd u1(.rst(rst), .nclk(nclk), .rxd(rxd), .data1(data1));
fs_txd u2(.rst(rst), .nclk(nclk), .data1(data1), .txd(txd));
nclk   u3(.clk(clk), .rst(rst), .nclk(nclk));
endmodule

接受模块

module js_rxd(rst,nclk,rxd,data1);
input  rst;
input  nclk;
input  rxd;
output data1;
reg   count1;
reg   count2;
reg    data;
reg   cnt;
reg rec_reg1;
reg  rec_reg2;
reg  txdone=1'b1;
reg  data1;
reg   cunt=0;

parameter start=4'b0000,
          bit0=4'b1000,
    bit1=4'b1001,
    bit2=4'b1010,
    bit3=4'b1011,
    bit4=4'b1100,
    bit5=4'b1101,
    bit6=4'b1110,
    bit7=4'b1111,
    stop=4'b0010;
   
         
initial cnt<=start;
always  @(posedge nclk or negedge rst)
begin
  if(!rst)
  begin
    cunt<=0;
    rec_reg1<=1'b1;
  rec_reg2<=1'b1;
  data<=8'hzz;
  end
  else if(rec_reg1&&rec_reg2)
  begin
    rec_reg1<=rxd;
  rec_reg2<=rec_reg1;
  end
  else if(!rec_reg1&&rec_reg2&&cunt==2)
  begin
  case(cnt)
  start:cnt<=bit0;  
  bit0:begin
        if(count1)begin
            data<=rxd;
            cnt<=bit1;
        end
    else cnt<=bit0;
        end
  bit1:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit2;
   end
   else cnt<=bit1;
   end
  bit2:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit3;
   end
   else cnt<=bit2;
   end
bit3:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit4;
   end
   else cnt<=bit3;
   end
bit4:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit5;
   end
   else cnt<=bit4;
   end
bit5:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit6;
   end
   else cnt<=bit5;
   end
bit6:begin
         if(count1)begin
      data<=rxd;
    cnt<=bit7;
   end
   else cnt<=bit6;
   end
bit7:begin
        if(count1)begin
      data<=rxd;
    cnt<=stop;
   end
   else cnt<=bit7;
   end
stop:begin
       if(count1)begin
  if(txdone)
        begin
         data1<={1'b1,data,1'b0};   
        cnt<=start;
  rec_reg1<=1'b1;
    rec_reg2<=1'b1;
    cunt<=0;      
    end
    end
    end   
  default:begin
       data<=8'hzz;
  rec_reg1<=1'b1;
    rec_reg2<=1'b1;
    end
endcase
  end
  else  cunt<=cunt+1;
  end
  
always @(posedge nclk or negedge rst)
begin
if(!rst)
begin
  count1<=0;
  count2<=0;
  end
  else if(count2==7)
  begin
  count2<=0;
  count1<=1;
  end
else  begin
count1<=0;
count2<=count2+1;
end
end
  endmodule

发送模块

module fs_txd(rst,nclk,data1,txd);
input rst;
input nclk;
input data1;
output txd;
reg   count1;
reg   count2;
reg  txd;
reg   count;
parameter start=4'b0000,
          wit0=4'b1000,
          wit1=4'b1001,
    wit2=4'b1010,
    wit3=4'b1011,
    wit4=4'b1100,
    wit5=4'b1101,
    wit6=4'b1110,
    wit7=4'b1111,
    stop=4'b0001;
initial count<=start;
always @(posedge nclk or negedge rst)
begin
     if(!rst)
   txd<=1'bz;
   else if(!data1) begin
   case(count)
   start:begin
         if(count1)begin
        txd<=data1;
        count<=wit0;
    end
    else count<=start;
        end
   wit0:begin
         if(count1)begin
        txd<=data1;
        count<=wit1;
    end
    else count<=wit0;
    end
   wit1:begin
         if(count1)begin
        txd<=data1;
    count<=wit2;
    end
    else  count<=wit1;
    end
   wit2:begin
          if(count1)begin
        txd<=data1;
    count<=wit3;
    end
    else  count<=wit2;
    end
  wit3:begin
         if(count1)begin
        txd<=data1;
    count<=wit4;
    end
    else  count<=wit3;
    end
  wit4:begin
        if(count1)begin
        txd<=data1;
    count<=wit5;
    end
    else  count<=wit4;
    end
wit5:begin
        if(count1)begin
        txd<=data1;
    count<=wit6;
    end
    else count<=wit5;
    end
wit6:begin
        if(count1)begin
        txd<=data1;
    count<=wit7;
    end
    else count<=wit6;
    end
wit7:begin
         if(count1)begin
        txd<=data1;
    count<=stop;
    end
    else count<=wit7;
    end
  stop:begin
         if(count1)begin
         txd<=data1;
     count<=start;
     end
     else  count<=stop;
     end
default:txd<=1'bz;
endcase
end
end

always @(posedge nclk or negedge rst)
begin
if(!rst)
begin
  count1<=0;
  count2<=0;
  end
  else if(count2==7)
  begin
  count2<=0;
  count1<=1;
  end
else  begin
count1<=0;
count2<=count2+1;
end
end
endmodule
   
波特率发生模块

module nclk(clk,rst,nclk);
input  clk,rst;
output  nclk;
reg nclk;
reg   cnt;
parameter yu_clk=50000000,
mu_clk=76800;
wire step=yu_clk/mu_clk-1;
always @( clk or  rst)
begin
if(!rst)
begin
nclk<=0;
cnt<=0;
end
else if(cnt==step)
begin
nclk<=~nclk;
cnt<=0;
end
else
cnt<=cnt+1;
end
endmodule

仿真结果