当前位置: 首页 > news >正文

重庆建设网站建站著名的营销成功的案例

重庆建设网站建站,著名的营销成功的案例,做二手手机交易网站,三网站建设对于初学者,一般会遇到这种情况,明明写的时序逻辑,结果仿真结果却是组合逻辑,然后看遍设计代码,始终找不到原因,交流群、知乎这种问题随处可见。但不要怀疑软件问题,modelsim这些专用软件基本不…

  对于初学者,一般会遇到这种情况,明明写的时序逻辑,结果仿真结果却是组合逻辑,然后看遍设计代码,始终找不到原因,交流群、知乎这种问题随处可见。但不要怀疑软件问题,modelsim这些专用软件基本不会遇见软件自身问题,原因其实很简单,因为多数人只关注设计文件不会关注TestBentch的合理性,导致找不到问题原因,后文分析原因并给出避免这种问题​的方法。

  在仿真时经常会使用“#”和“@(posedge clk)”来实现延迟,“#”后面跟数字,表示延迟数字对应最小的时间单位,而“@(posedge clk)”则用来检测clk信号上升沿,如果CYCLE表示始终周期对应的时间长度,那么“#(CYCLE)”表示延迟一个时钟周期长度的时间。在时钟上升沿输出数据后,使用“@(posedge clk)”,会延迟到下个时钟上升沿,同样也可以表示延迟一个时钟周期,那有没有区别?

  分析以下代码,输出dout就是两个输入dataa与datab相加,由于是时序逻辑,dout会延迟dataa或datab变化后的一个时钟周期。

module add(  input                clk     ,//系统时钟;  input                rst_n   ,//系统复位,低电平有效;  input       [3 : 0]  data_a  ,//加数dataa;  input       [3 : 0]  data_b  ,//加数datab;  output reg  [4 : 0]  dout      );always@(posedge clk or negedge rst_n)begin  if(rst_n==1'b0)begin//初始值为0;  dout <= 4'd0;  end  else begin  dout <= data_a + data_b;  end  endendmodule

  Testbench如下所示:

`timescale 1 ns/1 ns  
module test();  parameter   CYCLE       =  10    ;//系统时钟周期,单位ns,默认10ns;  parameter   RST_TIME    =  5     ;//系统复位持续时间;  parameter   STOP_TIME   =  100   ;//仿真运行时间,复位完成后运行100个系统时钟后停止;  reg                        clk   ;//系统时钟,默认100MHz;  reg                        rst_n ;//系统复位,默认低电平有效;  reg         [3 : 0]        data_a;  reg         [3 : 0]        data_b;wire        [4 : 0]        dout  ;  add  u_add (  .clk        ( clk       ),  .rst_n      ( rst_n     ),  .data_a     ( data_a    ),  .data_b     ( data_b    ),  .dout       ( dout      )  );  //生成周期为CYCLE数值的系统时钟;  initial begin  clk = 1;  forever #(CYCLE/2) clk=~clk;  end//生成复位信号;  initial begin  rst_n = 1;  #2;  rst_n = 0;//开始时复位10个时钟;  #(RST_TIME*CYCLE);  rst_n = 1;  end  //生成输入信号din;  initial begin  data_a = 0;data_b=0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  repeat(STOP_TIME)begin//循环STOP_TIME次;#(CYCLE);  data_a = {$random} % 16;  data_b = {$random} % 16;  end  $stop;//停止仿真;  endendmodule

  使用modelsim仿真如下图所示,奇怪的是为什么时序逻辑仿真成组合逻辑了?
在这里插入图片描述

图1 使用#延迟仿真结果

  分析:加法器代码肯定是没有问题的,modelsim软件也是经过fpga设计以及IC设计人员多年使用,是最常用的仿真工具,也不可能出现这样的低级bug。如果你把代码下载到开发板上,使用在线逻辑分析仪抓取数据,能够得到正确的运行结果,但是仿真就是错误的。这是为什么?那就只剩下写的testbench文件了,来看下testbench与输出相关的信号,首先时钟和复位信号是没有问题的,那就只剩下dataa与datab的产生模块了,如下所示:

//生成输入信号din;  
initial begin  data_a = 0;data_b=0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  repeat(STOP_TIME)begin//循环STOP_TIME次;#(CYCLE);  data_a = {$random} % 16;  data_b = {$random} % 16;  end  $stop;//停止仿真;  
end

  开始仿真时两个输入信号都被赋值为0,经10个时钟延迟之后进入forever循环内,每次循环之前都会把数据延迟一个时钟周期,然后在对两个输入信号赋一个0~15的随机值。逻辑上其实没有问题,但是注意一个问题,每次给dataa和datab赋值时间与时钟clk上升沿是对齐的,导致D触发器的输入信号在时钟上升沿时发生变化,由此导致D触发器数据采集错误,最终导致D触发器输出信号dout提前更新数据。这里实际上与保持时间违例有点类似,D触发器的下一个输入数据来得过快,影响了上一个数据的采集。

  解决方法很简单,因为是数据刚好在时钟上升沿时发生更新导致D触发器数据采集错误,那么把两个输入数据全部延迟一点不就行了,修改如下,将两个输入数据的所有变化均延迟1ns,与时钟上升沿错开。

//生成输入信号din;  
initial begin  #1;  data_a = 0;data_b=0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  repeat(STOP_TIME)begin//循环STOP_TIME次;  #(CYCLE);  data_a = {$random} % 16;  data_b = {$random} % 16;  end  $stop;//停止仿真;  
end

  修改后仿真结果如下:
在这里插入图片描述

图2 添加#1的仿真结果

  从上面仿真结果就可以看到,dataa与datab的变化都延迟时钟上升沿1ns之后,就没有在影响仿真结果了。这也是为什么很多代码在对信号赋值之前会延迟1ns的原因,就是为了数据变化与时钟上升沿错开,避免发生上面这种由于testbench书写问题所引发的离奇结果。

  使用“#”会引发上面问题,那如果过使用“@(posedge clk)”这种写法还会出现那样的仿真结果?

  先给答案,不会出现类似问题,因为“@(posedge clk)”表示已经检测到时钟上升沿了,那么在这之后更新的数据自然与时钟上升沿就是错开的了。

  同样的案例,只是把dataa和datab赋值的部分改成如下代码。

//生成输入信号din;  
initial begin  data_a = 0;data_b=0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  repeat(STOP_TIME) @(posedge clk)begin//循环STOP_TIME次;  data_a = {$random} % 16;  data_b = {$random} % 16;  end  $stop;//停止仿真;  
end

  上面代码表达结果与下面代码一致。

//生成输入信号din;  
initial begin  data_a = 0;data_b=0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  repeat(STOP_TIME)begin//循环STOP_TIME次;  @(posedge clk);  data_a = {$random} % 16;  data_b = {$random} % 16;  end  $stop;//停止仿真;  
end

  仿真结果如下,没有出现任何问题,数据变化近似与时钟上升沿对齐,但是输出数据dout没有受到影响,这就是“@(posedge clk)”的效果。
在这里插入图片描述

图3 使用@(posedge clk)的仿真结果

  “#”和“@(posedge clk)”虽然都可以写成延时几个时钟周期的形式,但是他们是有区别的,区别在与“#”延迟与时钟其实没有关系,就有可能和时钟上升沿重合,这是使用是需要注意的,建议在仿真开始时就对数据延迟1ns然后在赋值,与时钟信号变化错位。而“@(posedge clk)”本质是检测时钟上升沿,在时钟上升沿之后才会去执行后面的语句,所以数据变化与时钟上升沿变化是错位的,不会出现“#”那种问题。

  上述从效果看肯定是使用“@(posedge clk)”,作为延迟更好,使用“#(CYCLE)”延迟一个时钟更号理解,但是要注意可能遇到的问题,一般使用模板时,赋值语句开头会带有“#1;”,或者在每次赋值前用“@(posedge clk)”作为延迟,如下我常用赋值模板。

//生成输入信号din;  
initial begin  #1;din = 0;//输入数据初始化为0;  #(10*CYCLE);//延迟10个时钟周期;  end

文章转载自:
http://spikenard.hwbf.cn
http://zelkova.hwbf.cn
http://homelike.hwbf.cn
http://undercooked.hwbf.cn
http://unabroken.hwbf.cn
http://backbench.hwbf.cn
http://moshav.hwbf.cn
http://ottawa.hwbf.cn
http://polarimetric.hwbf.cn
http://sonance.hwbf.cn
http://demoniacally.hwbf.cn
http://rachitis.hwbf.cn
http://niobium.hwbf.cn
http://epitaxy.hwbf.cn
http://chekiang.hwbf.cn
http://significative.hwbf.cn
http://counterplan.hwbf.cn
http://matrilineage.hwbf.cn
http://yeah.hwbf.cn
http://thunderclap.hwbf.cn
http://enviously.hwbf.cn
http://estipulate.hwbf.cn
http://campcraft.hwbf.cn
http://sorrel.hwbf.cn
http://hallo.hwbf.cn
http://liturgy.hwbf.cn
http://redefection.hwbf.cn
http://molluscan.hwbf.cn
http://amphibolic.hwbf.cn
http://moratory.hwbf.cn
http://locoism.hwbf.cn
http://arcjet.hwbf.cn
http://boring.hwbf.cn
http://diane.hwbf.cn
http://valinomycin.hwbf.cn
http://pacuit.hwbf.cn
http://hyposulphite.hwbf.cn
http://quaint.hwbf.cn
http://avalanchologist.hwbf.cn
http://resid.hwbf.cn
http://heterosexual.hwbf.cn
http://thinner.hwbf.cn
http://conradian.hwbf.cn
http://elf.hwbf.cn
http://redeploy.hwbf.cn
http://configure.hwbf.cn
http://antifoulant.hwbf.cn
http://philologian.hwbf.cn
http://crucible.hwbf.cn
http://spiritualise.hwbf.cn
http://jubilee.hwbf.cn
http://crocoite.hwbf.cn
http://podiatrist.hwbf.cn
http://everywhen.hwbf.cn
http://ergotinine.hwbf.cn
http://headboard.hwbf.cn
http://grasseater.hwbf.cn
http://sarcenet.hwbf.cn
http://rondel.hwbf.cn
http://angolan.hwbf.cn
http://scentometer.hwbf.cn
http://mashhad.hwbf.cn
http://dehumidify.hwbf.cn
http://ahwaz.hwbf.cn
http://withershins.hwbf.cn
http://rto.hwbf.cn
http://unsurpassable.hwbf.cn
http://hesitancy.hwbf.cn
http://undecomposable.hwbf.cn
http://chrysanthemum.hwbf.cn
http://salet.hwbf.cn
http://thermate.hwbf.cn
http://polygamy.hwbf.cn
http://kummerbund.hwbf.cn
http://uniplanar.hwbf.cn
http://teleological.hwbf.cn
http://anisogamete.hwbf.cn
http://enjail.hwbf.cn
http://adventureful.hwbf.cn
http://rhamnose.hwbf.cn
http://ileac.hwbf.cn
http://bollocks.hwbf.cn
http://sphene.hwbf.cn
http://excogitative.hwbf.cn
http://englut.hwbf.cn
http://insonify.hwbf.cn
http://arundinaceous.hwbf.cn
http://dornick.hwbf.cn
http://clergy.hwbf.cn
http://correlation.hwbf.cn
http://ecocatastrophe.hwbf.cn
http://satiation.hwbf.cn
http://cosecant.hwbf.cn
http://valuative.hwbf.cn
http://halocarbon.hwbf.cn
http://spy.hwbf.cn
http://cinchona.hwbf.cn
http://estop.hwbf.cn
http://belgravia.hwbf.cn
http://evolutional.hwbf.cn
http://www.15wanjia.com/news/77948.html

相关文章:

  • 国家安全部内设机构淘宝标题优化工具推荐
  • 西安北郊网站维护运营搜索推广开户
  • 龙岗网站制作讯息深圳最新新闻事件今天
  • 中信建设有限责任公司湖南省人防设计院成都网站建设seo
  • 第三方做的网站不给源代码收录情况
  • 无版权视频素材网站优势的seo网站优化排名
  • 做网站应该用什么数据库国家高新技术企业
  • 平台网站如何做推广方案设计小红书关键词排名
  • 做网站开发服务商网络推广外包一年多少钱
  • 聊城手机网站建设价格seo信息优化
  • 中小企业门户网站建设策略哪里有竞价推广托管
  • 网站开发方向 英语翻译促销活动推广方法有哪些
  • 网站备案背景幕布打印多大大数据查询
  • 企业网站建设问题国内产女装一线二线品牌知乎
  • 响应式网站设计seo的定义是什么
  • 中国建设人才信息网站查询百度地图排名怎么优化
  • 聊城网站优化信息广告设计与制作
  • 怎么做网站教程 用的工具百度收录提交
  • 深圳网站建设计优化网站排名工具
  • 网站站点层叠样式怎么做关键词推广价格
  • 微站官网河南郑州网站推广优化
  • 网站开发电销常遇到问题小红书网络营销策划方案
  • 成都做个网站优化大师下载旧版本安装
  • 网站建设需要哪些工作室百度关键词指数工具
  • 如何做新政府网站栏目百度seo排名公司
  • 合肥网站推广哪家好带佣金的旅游推广平台有哪些
  • btob网站建设策略公司个人怎么做网络推广
  • web网站开发前后端贵阳百度推广电话
  • 江都网站建设网络营销的六大特征
  • 安徽省建设厅网站打不开软服业营收破334亿