这次我的问题是一个c解析器,它将从txt读取vhdl代码。说实话,这不是一个问题,但主要是要求我指向一个提供简短示例的链接。在这一点上,作业对我来说感觉有点太沉重,我正在寻找能够帮助我把事情弄清楚的事情。我搜索过,但我发现的主题要么使用死链接,要么不是我想要的。
由于我是vhdl的初学者(在这种情况下我认为并不重要),不幸的是C也是如此,我正在寻找一个简单的例子来说明如何创建数字电路的拓扑结构。即使它只有2个门,我想一个简短的例子将帮助我理解它是如何工作的。
我的目的是从txt文件开始读取并创建一个列表,在结构实例中存储每个门及其输入/输出,但在我的脑海中仍然有点混乱,我不知道从哪里开始。如果您知道某个地方发布的示例,或者我错过了C中的vhdl解析器的任何其他简单示例,请告诉我在哪里找到它;我将非常感激。
我为主题的性质(不是问题)道歉,但我只是想找到一种方法来解决问题。
干杯
答案 0 :(得分:2)
像VHDL一样解析语言是一项非常重要的练习。
你不会用字符串,正则表达式和黑客以及一些简单的逻辑来做。您需要一个基本的编译器课程来告诉您语言处理器如何读取源代码并解释符号的含义。
创建的电路拓扑基本上是一个图形;如果使用语言C,您需要了解如何使用指针构建动态分配节点的图形以及如何使用指针链接图形元素。
你真的需要这种知识水平吗?大多数VHDL设计师都没有这个背景,我不这么认为。
然后,您需要了解具有语法树和符号表的VHDL前端如何根据此信息组装电路的实际电路模型的背景知识。如果你了解属性语法,那么属性语法可能会有所帮助;否则,人们需要在AST上进行复杂的步骤以收集有关电路元素的提示,并遵循符号链接以确定连接。完整VHDL的细节将非常复杂。
编辑:OP似乎真的想建立一个电路的代表;潜入一个真正的编译器可能会使他感到困惑,因为他似乎缺乏经验。他真正需要的是数据结构中的一个类,然后如何做到这一点会相对明显。 [如果你打算使用复杂的软件,这必须]。如果没有这个,建立一个C库来达到预期的效果可能会教会他需要知道什么,并提高他的C技能。
图书馆需要的是两种类型的操作:
a)对于N = and_gate,or_gate,RS_flop,clocked_flop的每个节点类型N,设计相应的结构,并创建将创建该节点类型的库成员[使用sizeof(struct ...)调用malloc]。对于布朗尼点,创建一个类型的节点,创建一个" gate"叫" wire"。这是个好主意 使内容中的节点类型非常相似,以允许其他库过程操作大多数节点类型,而无需深入了解它们是什么。一种方法是使所有节点类型使用相同的结构,一个包含数字表示N的结构槽,另一个包含表示节点端口的数组;按照约定定义数组槽到节点类型的命名端口的映射。对于D-flop,array [0]是D输入数组[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);
那就是它。图书馆详细信息留给读者。
答案 1 :(得分:0)
不是答案,但评论时间太长。我不认为你被要求写一个" 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结构描述(一个entiry和一个架构,其中架构包含5个门实例,带有连接信号)。你可以在互联网上找到这些;开始here。