首页 > 其他分享 >数字电路设计组合循环

数字电路设计组合循环

时间:2022-08-16 12:22:06浏览次数:86  
标签:逻辑 组合 数字电路 areset 循环 设计 input

问题

今天在做一个小设计的时候遇到一个问题,设计的目的是实现串行计算2的补码,用mealy型状态机实现:

在rtl coding时如果组合逻辑输出用这样的写法,仿真就会报错

这里modelsim卡在循环了,看进一步的描述

这里解释了原因是产生了组合循环或者latch锁存器中有竞争条件,导致仿真器无法确定某一个仿真时刻的固定值,电路无法稳定到一个数值上。组合循环一般是由于某些组合逻辑使用了它修改的信号。

其实就是组合逻辑的输出(即门之间没有寄存器的逻辑部分)被反馈到该组合逻辑的输入而没有中间寄存器。这种设计需要避免,我的目的是对输入进行反转,因此不能像时序逻辑设计那样写代码。

解决方案

改变代码后便可以通过测试了

 1 module top_module (
 2     input clk,
 3     input areset,
 4     input x,
 5     output z
 6 ); 
 7     reg state,nstate;
 8     reg zr;
 9     parameter s0=1'b0,s1=1'b1;
10     
11     always@(posedge clk or posedge areset)begin
12         if(areset)begin
13             state <= s0;
14         end
15         else begin
16             state <= nstate;
17         end
18     end
19     
20     always@(*)begin
21         case(state)
22             s0:nstate=x?s1:s0;
23             s1:nstate=s1;
24             default:nstate=s0;
25         endcase
26     end
27     
28     always@(*)begin
29         if(state==s0 && x==1)begin
30             zr=1;
31         end
32         else if(state==s1)begin
33             zr=~x;
34         end
35         else begin
36             zr=0;
37         end
38     end
39     
40     assign z= zr;
41     
42 endmodule
View Code

这里仅仅改动了这一部分

参考资料

https://support.xilinx.com/s/question/0D52E00006hpWLASA2/what-is-combinational-loop-?language=en_US

https://blog.csdn.net/weixin_43755290/article/details/104656467

标签:逻辑,组合,数字电路,areset,循环,设计,input
From: https://www.cnblogs.com/Achilles7/p/16591139.html

相关文章

  • MySQL循环处理查询结果
    1.insert_num将查询结果循环,并传入到下一个存储过程--创建存储过程之前需判断该存储过程是否已存在,若存在则删除DROPPROCEDUREIFEXISTSinsert_num;--创建存储过......
  • Python-元组 & 创建字典并利用循环在字典里面添加key和value
      【元组】:有序且不可更改的集合,在Python中是用圆括号编写的,不能删除元组中的元素但是可以通过del完全删除元组https://www.w3school.com.cn/python/python_tuples.a......
  • 数列(循环节)
    题意有一个整数数列\(a_0,a_1,a_2,a_3\dots\)该数列的前两项\(a_0,a_1\)的具体值已知,其它项可以通过如下递推式求出:\(a_n=p\timesa_{n−1}+q\timesa_{n−......
  • vue js 计时器setInterval(),setTimeout() 循环调用,定时调用
    setInterval():他就是每隔多少秒或毫秒调用(循环的调用)。setTimeout():他就是过了多少秒或毫秒调用(调用一次)。//过500毫秒调用setTimeout(()=>{//方法区},500);//......
  • 641. 设计循环双端队列
    原题链接https://leetcode.cn/problems/design-circular-deque/题目设计实现双端队列。实现MyCircularDeque类:MyCircularDeque(intk):构造函数,双端队列最大为k......
  • fastjson中$ref循环引用
    问题描述:  当我们使用fastjson工具包的方法转换成字符串时,我们发现转换后的字符串不正确,出现了$ref,如图为啥会出现$ref:  这是因为我们对象出现了重复引用,待转换......
  • C#运算符与判断循环
    一、运算符原文:https://www.runoob.com/csharp/csharp-operators.html运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C#有丰富的内置运算符,分类如下:算术运......
  • python教程:一个 list 使用 for 遍历,边循环边删除的问题
    今天由于要对一个list数据类型写一个循环删除的程序(这是小编第一次对于list操作),但发现一个奇异问题,来,我们来看看代码跟效果:#初始化一个list列表,为了下边的方便比较......
  • Python-08while循环
    while循环Python提供了While和for循环,(在Python中没有do..while循环)如果使用 while 循环,给定的判断条件为true时执循环体,否则退出循环体。1#在Python中没有do...whi......
  • C++ 用for/while循环实现字符串逆置输出
    1.for循环实现字符串逆置#include<iostream>usingnamespacestd;intmain(){stringstr;cout<<"请输入一个字符串:"<<endl;cin>>str;......