我这次的问题是关于一个c解析器,它将从txt中读取vhdl代码。老实说,这不完全是一个问题,但主要是要求我指向一个链接,将提供一个简短的例子。现在的作业对我来说有点太重了,我想找些能帮我把事情弄清楚的东西。我搜索了,但我发现的主题要么使用死链接,要么不是我要找的。
由于我是vhdl的初学者(在这种情况下,我想这并不重要),而且不幸的是,我正在寻找一个简单的例子来说明如何创建数字电路的拓扑结构。即使它只有两个门,我想一个简短的例子可以帮助我理解它是如何工作的。
我的目的是从txt文件开始读取,并创建一个列表,将每个门及其输入/输出存储在struct实例中,但在我的脑海中仍然有点混乱,我不知道从哪里开始。如果你知道某个地方发布了一个例子,或者我错过了任何其他简单的vhdl解析器的例子,请告诉我在哪里可以找到它;我将非常感激。
我为这个话题的性质道歉(不是问题),但我只是在寻找一种摆脱困境的方法。
干杯

最佳答案

分析像VHDL这样的语言是一项非常重要的工作。
你不能用字符串、正则表达式、黑客和一些简单的逻辑来实现它。你需要一个基本的编译器课程来告诉你语言处理器如何读取源代码和解释符号的含义。
创建的电路拓扑本质上是一个图;如果使用C语言,则需要了解如何从动态分配的节点构建图,以及如何使用指针链接图元素。
你真的需要这样的知识吗?我不认为大多数VHDL设计者都没有这个背景。
然后你需要一些背景知识,一个VHDL前端,一个语法树和一个符号表,如何根据这些信息组装一个实际的电路模型。如果您理解属性文法,那么它们在这里可能很有用;否则,您需要在AST上进行复杂的遍历以收集有关电路元素的提示,并跟踪符号的链接以确定连接。完整VHDL的细节将非常复杂。
编辑:看起来OP真的想建立一个电路的表示;潜入一个真正的编译器可能会使他迷惑,因为他似乎没有经验。
他真正需要的是数据结构中的一个类,然后比较明显的是如何做到这一点。[如果你要使用复杂的软件,这是必须的]。如果没有这些,建立一个C库来达到预期的效果可能会教会他需要知道的东西,并提高他的C技能。
库需要两种类型的操作:
a)对于N=和_gate的每个节点类型N,或_gate、RS_flop、clocked_flop,设计相应的结构,并创建将创建该节点类型的库成员[使用sizeof(struct…)调用malloc]。对于brownie点,创建一个类型为的节点,创建一个名为“wire”的“gate”。这是个好主意
使节点类型在内容上非常相似,以允许其他库过程在不深入了解节点类型的情况下操作大多数节点类型。一种方法是让所有节点类型使用同一个结构,其中一个结构插槽包含表示N的数字,另一个包含表示节点端口的数组;按照约定定义数组插槽到节点类型的命名端口的映射。对于D-flop,数组[0]是D输入数组[1]是时钟输入,数组[2]是Q,数组[3]是Q*,等等。这不是整数数组,而是可以容纳到其他节点的链接的插槽数组。[提示数组槽应该让一个人用任意数量的元素建立一个循环列表]。
b)添加额外的过程调用“LinkNodePorts”,给出4个参数:指向第一个节点的指针、第一个节点端口号、指向第二个节点的指针、第二个节点端口号。如果数组槽可以包含循环列表,则应该直接实现。
然后,“构建电路拓扑”的行为减少到对库的一系列调用,以创建所需的节点,并将端口链接在一起。
[您可以想象VHDL编译器可能会使用您的库执行此操作]。
您可以决定是否要将门端口链接到其他门端口,或者坚持门端口始终连接到一根电线,反之亦然。
要提供OP想要的“示例”,请考虑:

      // library:
      struct node { int type; // use an enum to make this readable
                    (struct node)* ports[10]; // enough for most complex gate
                  }

      // library calls to construct RS flop from cross-couple NAND gates:
      struct node *nand_gate1;
      struct node *nand_gate2;
      // make the gates to implement an RS flop:
      nand_gate1= gate_library_make_nand_gate();
      nand_gate2= gate_libray_make_nand_gate();
      // connect gate outputs to other gate inputs:
      gate_library_connect_ports(nand_gate1,0,nand_gate2,1);
      gate_library_connect_ports(nand_gate2,0,nand_gate1,1);

就这样。图书馆的细节留给读者。

10-08 03:03