微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助帖,FPGA,前仿真

求助帖,FPGA,前仿真

时间:10-02 整理:3721RD 点击:
刚刚自学FPGA,做前仿真,结果输入信号都是高阻值(Z),检查位宽也配对,实在找不出问题了,谁能解答我的疑惑,谢谢谢谢

[attach]696590[/attach]

实例化的模块放在initial段后面,再试试

谢谢你呀,不过还是不行呀

  1. module counter2(clk1k,pinlvkin,rst_n,feedclko,count1kout ); //一秒之内的脉冲数

  2.          input   clk1k,rst_n,pinlvkin;
  3.          output feedclko;
  4.          output [18:0] count1kout;
  5.          
  6.          reg [15:0] counttest=16'h3e8;//(1000)D

  7.          reg [15:0] count;
  8.          reg [19:0] count1k;
  9.          reg [18:0] count1kout;
  10.          reg [3:0] countnum;
  11.          reg [19:0] feedclknum[7:0];
  12.          assign  feedclko=(count[15:0]<=counttest[15:0])? 1'b1:1'b0;


  13. always @ ( negedge clk1k or negedge rst_n )
  14.                  begin  
  15.                                  if( !rst_n )  
  16.                                                 begin
  17.                                                  count1kout[18:0]<=16'h000;
  18.                                                 end       
  19.                                  else if (count[15:0]==(counttest[15:0]+16'h010))
  20.                                                         begin
  21.                                                                 count1kout[18:0]<=//feedclknum[1][15:0];
  22.                                                                                                                 ((        feedclknum[0][19:0]+feedclknum[1][19:0]
  23.                                                                                                                   +feedclknum[2][19:0]+feedclknum[3][19:0]
  24.                                                                                                                   )>>2);//count1kout为1s内的脉冲数作为输出,即为频率
  25.                                                                                                                   
  26.                                                         end                               
  27.                  end
  28.                  
  29. always @ ( negedge clk1k or negedge rst_n ) //存储每个单位周期内的脉冲值(T=16ms)
  30.                 begin  
  31.                                  if( !rst_n )  
  32.                                                 begin
  33.                                                         feedclknum[0][19:0]<=18'h000;
  34.                                                         feedclknum[1][19:0]<=18'h000;
  35.                                                         feedclknum[2][19:0]<=18'h000;
  36.                                                         feedclknum[3][19:0]<=18'h000;
  37.                                                         feedclknum[4][19:0]<=18'h000;
  38.                                                         feedclknum[5][19:0]<=18'h000;
  39.                                                         feedclknum[6][19:0]<=18'h000;
  40.                                                         feedclknum[7][19:0]<=18'h000;
  41.                                                 end       
  42.                                 else
  43.                                 if (count[15:0]==(counttest[15:0]+16'h010))
  44.                                                         begin
  45.                                                          feedclknum[countnum[3:0]][19:0]<=(count1k[19:0]);
  46.                                                         end                               
  47.                 end
  48.                  
  49. always @ ( posedge clk1k or negedge rst_n ) //产生每个单位时间存储的序号(t=528ms)
  50.                  begin  
  51.                                  if( !rst_n )  
  52.                                                 begin
  53.                                                  countnum[3:0]<=4'h0;
  54.                                                 end               
  55.                                  else if (count[15:0]>=counttest[15:0])
  56.                                                         begin
  57.                                                                 countnum[3:0]<=countnum[3:0]+4'h1;
  58.                                                                 if (countnum[3:0]>3)
  59.                                                                         countnum[3:0]<=4'h0;
  60.                                                         end                                                       
  61.                  end
  62.                  
  63. always @ ( posedge clk1k or negedge rst_n )//控制计数周期
  64.                  begin  
  65.                                  if( !rst_n )  
  66.                                                 begin
  67.                                                  count[15:0]<=16'h00;       
  68.                                                 end               
  69.                                  else
  70.                                                  begin
  71.                                                                  if (count[15:0]>=(counttest[15:0]+15'h210))//
  72.                                                                                         begin
  73.                                                                                          count[15:0]<=16'h00;
  74.                                                                                         end                                                       
  75.                                                                  else
  76.                                                                                         begin
  77.                                                                                          count[15:0]<=count[15:0]+16'h01;       
  78.                                                                                         end
  79.                                                  end
  80.                  end        
  81.          
  82. always @ ( posedge pinlvkin or negedge rst_n ) //在1s内对输入的脉冲进行计数
  83.                  begin  
  84.                                  if( !rst_n )  
  85.                                                                                 begin
  86.                                                                                  count1k[19:0]<=19'h00;                                               
  87.                                                                                 end               
  88.                                  else
  89.                                                                                 begin
  90.                                                                                                  if (count[15:0]>=(counttest[15:0]+16'h20))//计数后清零,准备重新计数
  91.                                                                                                                         begin
  92.                                                                                                                          count1k[19:0]<=19'h00;
  93.                                                                                                                         end
  94.                                                                                                  else if (count[15:0]<counttest[15:0])//计数
  95.                                                                                                                         begin
  96.                                                                                                                          count1k[19:0]<=count1k[19:0]+19'h01;//count1k[19:0]为1s内的脉冲数
  97.                                                                                                                         end
  98.                                                                                 end
  99.                  end                   
  100.          


  101. endmodule

复制代码


这是模块代码,你帮我看下,我刚刚自学这个,不是很懂,谢谢您啦

module名是counter2,为什么例化的时候是counter uut?

楼上正解

楼上正解

问题貌似不在这,我把counter uut改成了counter2,依旧没解决,我这样设置激励不觉得有错呀

  1. module counter_test;

  2.         // Inputs
  3.         reg clk1k;
  4.         reg pinlvkin;
  5.         reg rst_n;

  6.         // Outputs
  7.         wire feedclko;
  8.         wire [18:0] count1kout;

  9.          

  10.         initial begin
  11.                 // Initialize Inputs
  12.                 clk1k = 1'b0;
  13.                 pinlvkin = 1'b0;
  14.                 rst_n = 1'b0;

  15.                 // Wait 100 ns for global reset to finish
  16.                 #100;
  17.                  rst_n =1'b1;
  18.                 end
  19.                 counter (
  20.                 .clk1k(clk1k),
  21.                 .pinlvkin(pinlvkin),
  22.                 .rst_n(rst_n),
  23.                 .feedclko(feedclko),
  24.                 .count1kout(count1kout)
  25.         );
  26.   always #500 clk1k = ~ clk1k; //产生 1kHz 时钟源
  27.   always #19  pinlvkin = ~ pinlvkin;
  28. endmodule
  29.         

复制代码

仿真的时候CPU实际上是从前向后顺序执行的,所以module的例化应该放在初始化之后

第二次贴的测试文件里面,实例化怎么写在initial模块里了,而且实例化名字也没有,应该会报错吧,还有你说的是测试信号输出的是高阻态?(是指设计模块的输入是高阻吗?),那很有可能就是你端口没连好了,你可以看看测试模块输出的信号是不是高阻

  1. module counter_test;
  2.   reg clk1k;
  3.   reg rst_n;
  4.   reg pinlvkin;
  5.   
  6.   wire feedclko;
  7.   wire[18:0] count1kout;
  8.   

  9.   parameter CYCLE  = 1000;
  10.   parameter RST_TIME=3;
  11.   
  12.   
  13.   initial begin
  14.   clk1k = 0;
  15.   forever
  16.   #(CYCLE/2)
  17.   clk1k=~clk1k;
  18.   end

  19. initial begin
  20. rst_n = 1;
  21. #2;
  22.    rst_n = 0;
  23. #(CYCLE* RST_TIME)
  24.    rst_n = 1;
  25. end

  26. initial begin
  27.   pinlvkin = 0;
  28. forever
  29. #20
  30. pinlvkin = ~pinlvkin;
  31. end
  32. counter uut(
  33.    .clk1k(clk1k),
  34.    .rst_n(rst_n),
  35.    .pinlvkin(pinlvkin),
  36.    .feedclko(feedclko),
  37.    .count1kout(count1kout)
  38. );

  39. endmodule  

复制代码

这里还是用的counter uut?你确定你的module名字是counter吗?你确定编译没有问题吗?仿真中有没有什么告警和错误?也要仔细看看,那些信息更有帮助。比我们在这里盲人摸象好多了。


嗯嗯,好

timescale 设了吗


设定了,单位是1ps,精度1ns

Unable to copy libPortabilityNOSH.dll to the simulation executable directory:
  我检查代码,仿真只出现了这一个警告,是不是问题出在这了?


单位是1ns,精度是1ps吧


怎末可能?1ps=1000ns呀

用什么做软件做仿真?。1 ns =1000 ps



    这个我检查了,没弄错,没问题,关键不在这

汗,1ns=1000ps。低级错误呀,兄弟。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top