情境:

  FPGA里面计数器需要复位(计数值置零),与计数器状态有关的行为是状态机控制的,即状态机为CLEAR_TIMER状态时,计数器才完成清零动作。

  清零有两个条件:(1)计数器值溢出(达到OVF门限);(2)清零信号有效(1有效)。这两个条件是独立的,没有先后关系的约束。

问题是:如何写Verilog语句,才使得这两个触发的优先级相同?

有两个思路:

一个是:

always@(posedge clk)begin
  if(!rst_n)begin
    stat_preload <= STAT_IDLE;
  end
  else begin
    //*** Combined Transition
    if((tim_cnt >= TIIM_OVF) || (1'b1 == tim_rst))begin // OR
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Status Latch
    end
  end
end

另一个:

always@(posedge clk)begin  
  if(!rst_n)begin
    stat_preload <= STAT_IDLE;
  end
  else begin
    //*** Separate Transition
    if(tim_cnt >= TIM_OVF)begin
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Stay
    end
    if(1'b1 == tim_rst)begin
      stat_preload <= STAT_CLEAR_TIMER;
    end
    else begin
      stat_preload <= stat_preload; // Stay
    end
  end
end

这两种写法的区别在于:第一种,状态转移语句放在两个条件参与的单个if选择结构里面;第二种,状态转移语句放在分别的两个if选择结构里面。

状态转移图中表现为这样的两种情况:

实现和测试:

上述两种的代码和综合结果如下:

module top(
rst_n,
clk,
X,
Y,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if(('b1 == X) || (1'b1 == Y))begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

module top(
rst_n,
clk,
X,
Y,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if('b1 == X)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == Y)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

综合器是Quartus 15.1内置的。

可以看到,第二种写法的综合结果让输入信号X没有驱动逻辑了,这样就与需求不符。

原因是什么?

第二种(分开if)情况下,虽然赋值语句都是非阻塞的<=,但是由于if语句放在顺序的begin::end结构内,所以判断和执行都是顺序处理的,状态转移和状态停留操作是一模一样的,所以X条件被省略了。

为了验证这个结论,在X,Y两个条件的基础上再加R,S两个条件,进行X,Y,R,S的顺序if,然后查看结果:

module top(
rst_n,
clk,
X,
Y,
R,
S,
din_A,
dout
); //****************************************
// Port Def.
//****************************************
input wire rst_n;
input wire clk; input wire X; // Conditions
input wire Y;
input wire R;
input wire S; input wire[:] din_A; output wire[:] dout; //****************************************
// Variables
//****************************************
reg[:] dout_reg; //****************************************
// Behaviour
//**************************************** assign dout = dout_reg; always@(posedge clk)begin
if(!rst_n)begin
dout_reg <= 'b0;
end
else begin
if('b1 == X)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == Y)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == R)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
if('b1 == S)begin
dout_reg <= din_A;
end
else begin
dout_reg <= dout_reg;
end
end
end endmodule

显然,只有S条件有效了。

结论:顺序块begin::end中的语句是顺序执行的。

Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?的更多相关文章

  1. verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系

    这几个概念是不一样的 顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关. 并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执 ...

  2. Verilog HDL中阻塞语句和非阻塞语句的区别

    在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”).正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要. Verilog语言中讲的阻塞赋值与非 ...

  3. Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)

    出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM 综合软件:Quartus II 一.有优先级的if语句 if..else if.. else i ...

  4. Verilog中的阻塞与非阻塞

    这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...

  5. Verilog之阻塞赋值非阻塞赋值

    verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1. 阻塞赋值与非阻塞赋值: 2. 代码测试: 3. 组合逻辑电路和时序逻辑电路. 阻塞赋值与非阻塞赋值: 1. 阻塞赋值" ...

  6. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理:     阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...

  7. 用Java实现非阻塞通信

    用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...

  8. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  9. 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法

    转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...

随机推荐

  1. Cisco Umbrella WLAN

    Cisco Umbrella WLAN在域名系统(DNS)级别提供云交付网络安全服务,可自动检测已知和紧急威胁. 此功能允许您在实际恶意攻击之前阻止托管恶意软件,僵尸网络和网络钓鱼的站点. Cisco ...

  2. vue-cli项目结构详解

    vue-cli的webpack模板项目配置文件分析 https://blog.csdn.net/hongchh/article/details/55113751/ 由于最近在vue-cli生成的web ...

  3. MAC系统 - 系统目录结构

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/smstong/article/detai ...

  4. Java IO流详解(二)——File类

    在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...

  5. Pako.js压缩解压,vue压缩解压,前后端之间高效数据传输

    项目开发中常常会遇到前后端之间有大量数据传输占用带宽导致页面响应慢的问题,这时候我们可以考虑使用Pako.js对信息进行压缩之后传输. 我在前端使用的是vue-element-admin前端框架.框架 ...

  6. Python磁力获取器命令行工具 torrent-cli

    作为一个搞代码的,找资源这种事肯定不能像普通人一样打开百度盲目查找,你需要写个爬虫工具来帮你完成这件事情啦! 兼容环境 Windows/Linux/MacOs 安装 pip 安装 $ pip inst ...

  7. burpsuite使用--暴力破解

    测试靶机:dvwa 浏览器开启代理,使用burpsuite拦截: 并将拦截到的内容发送到intruder进行暴力破解 右边的Add$和Clear$都是选择爆破范围的操作,一个是选择,一个是清除,这里只 ...

  8. Struts+Spring+Hibernate整合笔记一

    OpenSessionInview: 1.如果当前方法没有事物环境,则调用完毕getHibernate以后.session关闭: 说明:1如果测试dao层,没有事物环境 2如果测试service层,但 ...

  9. leetcode刷题-- 5. 动态规划

    动态规划思路 参考 状态转移方程: 明确「状态」-> 定义dp数组/函数的含义 -> 明确「选择」-> 明确 base case 试题 53最大子序和 题目描述 53 给定一个整数数 ...

  10. 6 JavaScript函数&内置构造&函数提升&函数对象&箭头函数&函数参数&参数的值传递与对象传递

    JavaScript函数:使用关键字function定义,也可以使用内置的JavaScript函数构造器定义 匿名函数: 函数表达式可以存储在变量中,并且该变量也可以作为函数使用. 实际上是匿名函数. ...