C语言中的vhdl语法分析器



这次我的问题是关于一个c解析器,它将从txt中读取vhdl代码。老实说,这并不完全是一个问题,但主要是一个请求,引导我到一个链接,将提供一个简短的例子。在这一点上,任务对我来说有点太重了,我正在寻找能帮助我把事情弄清楚的东西。我搜索了一下,但我找到的主题要么使用了死链接,要么不是我想要的。

由于我是vhdl的初学者(我想在这种情况下这并不重要),不幸的是,我也是C的初学者,我正在寻找一个简单的例子来展示如何创建数字电路的拓扑结构。即使它只有两个门,我想一个简短的例子会帮助我理解它是如何工作的。

我的意图是从txt文件开始读取,并创建一个列表,将每个门及其输入/输出存储在结构实例中,但我的想法仍然有点混乱,我不知道从哪里开始。如果你知道某个地方发布的例子,或者我错过的C语言中vhdl解析器的任何其他简单例子,请告诉我在哪里可以找到它;我将不胜感激。

我为这个话题的性质(不是一个问题)道歉,但我只是在寻找摆脱困境的方法。

干杯

像VHDL这样的分析语言是一项不平凡的练习。

你不会用字符串、正则表达式、破解和一些简单的逻辑来做这件事。你需要一门基本的编译器课程来告诉你语言处理器是如何读取源代码并解释符号的含义的。

创建的电路拓扑本质上是一个图形;如果使用C.语言,您需要了解如何从动态分配的节点构建图,以及如何使用指针链接图元素

你真的需要这种水平的知识吗?我不认为大多数VHDL设计者都没有这样的背景。

然后,您需要一些关于VHDL前端如何通过语法树和符号表根据这些信息组装电路的实际电路模型的背景知识。如果你理解属性语法,它们在这里可能会有所帮助;否则,需要对AST进行复杂的遍历,以收集有关电路元件的提示,并遵循符号的链接来确定连接。完整VHDL的细节将非常复杂。

编辑:看来OP真的想建立一个电路的表示;深入研究真正的编译器可能会让他感到困惑,因为他似乎缺乏经验。

他真正需要的是数据结构中的一个类,然后相对显而易见的是如何做到这一点。[如果你要使用复杂的软件,这是必须的]。如果没有这些,建立一个C库以达到预期的效果可能会教会他需要知道的东西,并提高他的C技能。

图书馆需要两种类型的操作:

a) 对于N=and_gate、or_gate、RS_flop、clocked_flop的每个节点类型N,设计一个相应的结构,并创建一个库成员来创建该节点类型[用sizeof(struct…)调用malloc]。这是个好主意使节点类型在内容上非常相似,以允许其他库过程在不深入了解它们的情况下操作大多数节点类型。一种方法是使所有节点类型都使用相同的结构,其中一个结构槽包含表示N的数字,另一个槽包含表示节点端口的数组;按照约定定义阵列插槽到节点类型的命名端口的映射。对于D触发器,array[0]是D输入array[1]是时钟输入,array[2]是Q,array[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);

就这样。图书馆的详细信息留给读者。

不是一个真正的答案,但太长了,无法发表评论。我不认为你被要求写一个"VHDL解析器"。

您的输入是

AND(A,B,X),OR(C,D,Y),XOR(X,C,Z),OR(Y,B,W),AND(Z,W,O)

这只是一个没有语言的任意门列表。您可能被要求将其转换为VHDL,这有点毫无意义。首先绘制一张带有连接的5个闸门的图,以确保您理解这些连接。用C代码扫描上面的文本,为每个门创建五个三输入门实例(您称之为structs),并连接,以给出图表的C表示。

现在将所有内容写成VHDL结构描述(一个实体和一个体系结构,其中该体系结构包含5个带有连接信号的门实例)。你可以在互联网上找到这些;从这里开始。

最新更新