繁体   English   中英

C语言中的vhdl解析器

[英]vhdl parser in C

这次我的问题是关于一个交流解析器,它将从txt读取vhdl代码。 坦白地说,这并不是一个确切的问题,但主要是要求将我定向到将提供一个简短示例的链接。 在这一点上,任务对我来说有点太重了,我正在寻找可以帮助我弄清楚事情的东西。 我进行了搜索,但是发现的主题要么使用了无效链接,要么不是我要找的主题。

由于我是vhdl的初学者(在这种情况下,我认为这并不重要),不幸的是,对于C来说,我正在寻找一个简单的示例,该示例说明如何创建数字电路的拓扑。 即使只有2个闸门,我也想举一个简短的例子来帮助我了解其工作原理。

我的意图是从txt文件开始读取,并创建一个列表,该列表将每个门及其输入/输出存储在struct实例中,但在我看来仍然有些混乱,我不知道从哪里开始。 如果您知道某个地方发布的示例,或者我错过的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代码扫描上面的文本,为每个带有连接的门创建五个3输入门实例(您称其为结构),以给出图的C表示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM