毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

VC++数字逻辑电子仿真器设计 第8页

更新时间:2010-5-19:  来源:毕业论文
VC++数字逻辑电子仿真器设计 第8页
 其算法主要思想是:遍历每一个输入结点,将输入结点的值送入到它所连接的元件的输入端,若此时该元件可以进位,则调用该元件进位函数gatefunction()计算该元件的输出端的值,再将该输出端的值送入它的下一个连接元件,再判断下一个元件能否进位,如此循环,直到输出结点。若此时不可以进位,则遍历下一个输入结点。
 可以用下图来说明:图21
 假设此时输入结点遍历的顺序是1->2->3 (顺序不唯一)。假设此时1,2,3号输入结点取值0,1,0。首先将1号输入结点的值送入它所连接的或门的第一个输入端,即input1value=0。此时或门进位标志inputs= =1。于是不能进位。遍历下一个输入结点2,将2号1号输入结点的值送入它所连接的与门的第一个输入端,同样此时与门进位标志也为inputs= =1,不能进位。最后遍历到输入结点3,将值送入到与门的输入端2。由于此时有两个输入了,即与门进位标志inputs= =2,调用与门函数计算与门输出端output1value.然后将此值送入或门,同样或门进位标志inputs= =2,调用或门函数计算或门输出端值,最后送入输出结点,结束。
计算真值表:beginCalculate()
代码如下:
void CMyView::beginCalculate()
{
 //计算输入结点的个数,输出真值表
 n=numpoint.GetSize ();
 //计算要进行循环的次数
 int i;
  x=1;
 for(i=1;i<=n;i++)
 {
  x=x*2;
 }
 //动态生成x个字符串保存真值表
 //用一个字符串格式化数据
 CString str;
 //用一个数组I[1]~I[n]记录每个输入结点值
 UINT* I=new UINT[n+1];
 //用数组J[1]~J[n]辅助计算
 UINT* J=new UINT[n+1];
 //初始化J[1]~J[n]
 J[1]=1;
 for(i=2;i<=n;i++)
 {
  J[i]=J[i-1]*2;
 }
 //进行x次循环,计算真值表
 for(i=0;i<x;i++)
 {
  //增加数组元素:加入一个字符串
  strs.Add (CString());
  for(int k=1;k<=n;k++)
  {
   I[k]=i & J[k];
   //向右移位
   I[k]=I[k]>>(k-1);
   //将输入端1~n的值加入字符串
   str.Format ("%d ",I[k]);
   //
   
   //连接起来
   
   strs[i]=strs[i]+str;

  }
  //给输入结点1~n初始化值
  POSITION pos=MyList.GetHeadPosition ();
  MyNode* pNode;
  while(pos!=0)
  {
   pNode=MyList.GetNext (pos);
   //如果结点是输入结点
   if(pNode->Subtype ==Input)
   {
    //结点中的pNode->number 记录了结点序号
    //给结点初始化值
    pNode->output1value =I[pNode->number ];
   }
  }
  //调用函数计算,将计算结果保存
  int result=CalculateResult();
  //生成字符串以便输出
  str.Format ("%10d",result);
  strs[i]+=str; }
}
代码分析:
(1) 首先得到输入结点的个数:n=numpoint.GetSize ();
这里numpoint是记录输入结点前序号位置点的数组,而有多少个这样的点,就有多少个输入结点。
(2)然后计算真值表的行数,因为有n个输入结点,真值表就有2^n行。
  x=1;
 for(i=1;i<=n;i++)
 {
  x=x*2;
 }
这里我们用x来保存真值表的行数。
(3)产生所有的输入结点值的组合。
如果有3个输入结点,它的所有组合如下表
输入3 输入2 输入1 i
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
我们可以从表的第四列看出可以用数字i从0到x-1来分解出这些组合。
例如:当i为2时,它在内存中最后3位为:010。
此时 输入3=010 & 100=000,再右移2位即可得到0。
于是我们可以得到:输入1 & 001 再右移0位
      输入2 & 010 再右移1位
输入1 & 100 再右移2位
 我们用一个数组J[1]~J[n]来记录相与的数字。为1,2,4,......,2^(n-1)
 初始化J[1]~J[n]
 J[1]=1;
 for(i=2;i<=n;i++)
 {
  J[i]=J[i-1]*2;
 }
 用I[1]~I[n]记录输入1~输入n 
产生一行输入值

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 

VC++数字逻辑电子仿真器设计 第8页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。