VHDL字符集生成

VHDL字符集生成,vhdl,fpga,hdl,Vhdl,Fpga,Hdl,我需要从角色集中生成所有可能的组合 "abcdefghijklmnopqstuvxyz" 生成的模式应该像这样输出 a b ... z aa ab ... az ba ... 这项工作将持续8小时。即a=>zzzzzz。我用C编写了一个例子来解决这个问题,并为此使用了一个递归函数。我知道它写得又快又脏,但希望你能有个想法 #include <stdio.h> #include <string.h> #define WIDTH 8 char *charset = "a

我需要从角色集中生成所有可能的组合

"abcdefghijklmnopqstuvxyz"
生成的模式应该像这样输出

a
b
...
z
aa
ab
...
az
ba
...
这项工作将持续8小时。即
a=>zzzzzz
。我用C编写了一个例子来解决这个问题,并为此使用了一个递归函数。我知道它写得又快又脏,但希望你能有个想法

#include <stdio.h>
#include <string.h>

#define WIDTH 8
char *charset = "abcdefghijklmnopqrstuvxyz";

void charset_r(int width, int pos, char *s)
{
    char buf[WIDTH];
    char *p = charset;

    while(*p!='\0')
    {
        strcpy(buf, s);
        if(pos<width)
        {
            strncat(buf, p, 1);
            printf("%s\n", buf);
            charset_r(width, pos+1, buf);
        }
        p++;
    }
}

int main(void)
{
    int i;
    for(i=0;i<=WIDTH;i++)
        charset_r(i,0,"");
}
#包括
#包括
#定义宽度8
char*charset=“abcdefghijklmnopqrstuvxyz”;
无效字符集(整数宽度、整数位置、字符*s)
{
字符buf[宽度];
char*p=charset;
而(*p!='\0')
{
strcpy(buf,s);

如果(pos您可以将每个字符组合视为以26为底的数字(即序列中的字符数)。这样,每个数字都会隐式地告诉您后面的字符串序列。您可以将数字转换为基数26并获取字符串。当然,您需要对每个长度的字符串重复此过程。我为您编写了一个简单的代码来演示此想法。您可以使用可合成语言子集在VHDL中实现它

for( int i = 1 ; i<= 8 ; ++i )
{
    for( int j = 0 ; j < pow(26,i) ; ++j )
    {
           foo( j , i  );
    }
}


void foo( int num , int len)
{
    char digits[len+1];
    // convert num from base 10 to base 26 and fill digits array with proper values in range 0-25
    toBase26(num,digits,len);
    digits[len] = '\0';
    for( int i = 0 ; i < len ; ++i )
    {
              digits[i] = digits[i] + 97 ; //  97 == 'a'
    }
    // do proper thing with your sequence

}

for(int i=1;i您可以将每个字符组合视为写在基26中的数字(即序列中的字符数)。这样,每个数字都会隐式地告诉您后面的字符串序列。您可以将数字转换为基数26并获取字符串。当然,您需要对每个长度的字符串重复此过程。我为您编写了一个简单的代码来演示此想法。您可以使用可合成语言子集在VHDL中实现它

for( int i = 1 ; i<= 8 ; ++i )
{
    for( int j = 0 ; j < pow(26,i) ; ++j )
    {
           foo( j , i  );
    }
}


void foo( int num , int len)
{
    char digits[len+1];
    // convert num from base 10 to base 26 and fill digits array with proper values in range 0-25
    toBase26(num,digits,len);
    digits[len] = '\0';
    for( int i = 0 ; i < len ; ++i )
    {
              digits[i] = digits[i] + 97 ; //  97 == 'a'
    }
    // do proper thing with your sequence

}

for(int i=1;i您最好将其视为硬件问题,而不是软件问题。您有八个状态变量-序列中每个字符一个。如果您对每个字符使用5位计数器,则可以表示所有字符[a-z],再加上一个空状态(可能为零)知道何时不输出字符

然后,您需要某种状态机按照一组简单规则递增计数器:“始终递增计数器0。如果计数器0为26,则将其设置为0,递增计数器1…等等”。这将驱动您的内部状态

然后创建一个输出进程,查看计数器并决定要及时输出哪个字符(如果计数器的增量没有超过零,则根本不输出字符)。如果您连续输出字符,则此过程将花费不同的时间来执行,因此它可能会作为触发器来推进您的状态机


这里没有代码,只是方法的概要。但我认为,如果你按照这些思路思考,它会对你有所帮助。

你最好把这看作是硬件问题,而不是软件问题。你有八个状态变量——序列中每个字符一个。如果你对每个字符使用5位计数器,那么你就可以可以表示所有字符[a-z],加上一个空状态(可能为零),以知道何时不输出该字符

然后,您需要某种状态机按照一组简单规则递增计数器:“始终递增计数器0。如果计数器0为26,则将其设置为0,递增计数器1…等等”。这将驱动您的内部状态

然后创建一个输出进程,查看计数器并决定要及时输出哪个字符(如果计数器的增量没有超过零,则根本不输出字符)。如果您连续输出字符,则此过程将花费不同的时间来执行,因此它可能会作为触发器来推进您的状态机


这里没有代码,只是该方法的概要。但我认为,如果您按照这些思路思考,它将对您有所帮助。

1)如果您不想综合它,您可以用VHDL编写它。您的最终目标是什么?像您的示例那样打印到标准输出?在时钟电路中的端口上输出这些值?2)你试过什么?你问的是VHDL,但只发布了C代码,没有上下文。一些形式的递归也是可合成的。这可能是,小心点,但由于它倾向于将递归展开到并行硬件中,我认为你不希望结果超出深度2!C代码是为了让你明白我的意思,已经更新了帖子。Being过于简单,忽略了非8字符的输出,26^8是3x10^23组合。在100MHz时,这将需要约96迈耶才能输出。有必要问一下“为什么?”!C版本需要多长时间才能运行?哇,显然我需要重新考虑这个问题。谢谢!1)如果你不想合成它,你可以用VHDL写它。你的最终目标是什么?像你的例子那样打印到标准输出?把那些值放在时钟电路的端口上?2)你试过什么?你问的是VHDL,但只发了C代码,没有上下文。一些递归形式也是可以合成的。这是当然,要小心,但由于它倾向于将递归展开到并行硬件中,我认为您不希望结果超出深度2!C代码是为了让您理解我的意思,更新了帖子。由于过于简单,忽略了非8字符输出,26^8是3x10^23组合。在100MHz时,这将需要约96 Myears才能输出。必须问一下“为什么?”!运行C版本需要多长时间?哇,显然我需要重新考虑一下。谢谢!