Vhdl 为lcd数据创建字符串

Vhdl 为lcd数据创建字符串,vhdl,Vhdl,我想创建动态字符串阵列,以便将其传输到Altera DE2-115板上的lcd模块。到目前为止,大部分工作正常,但以下代码中的最后一部分没有工作: CREATE_STRING: PROCESS (CLK, RESET, X) BEGIN IF RESET = '1' THEN FOR i IN 0 TO 31 LOOP lcd_data(i) <= x"30"; END LOOP;

我想创建动态字符串阵列,以便将其传输到Altera DE2-115板上的lcd模块。到目前为止,大部分工作正常,但以下代码中的最后一部分没有工作:

CREATE_STRING:  PROCESS (CLK, RESET, X)
    BEGIN
        IF RESET = '1' THEN
            FOR i IN 0 TO 31 LOOP
                lcd_data(i) <= x"30";
            END LOOP;
        END IF;

        IF X /= 0 THEN
            FOR i IN 0 TO 15 LOOP
                IF X(15-i) = '0' THEN   
                    lcd_data(i) <= x"30";
                END IF;
                IF X(15-i) ='1' THEN 
                    lcd_data(i) <= x"31";
                END IF;
            END LOOP;
        END IF;

        IF char_count > 15 AND lcd_y = '1' THEN 
            ELSIF CLK = '1' AND CLK'event THEN
                lcd_data(to_integer(char_count)) <= x"31";
        END IF;

END PROCESS CREATE_STRING;
对于每个lcd_数据[31][x]

我在谷歌上搜索了错误,如果我的想法不完全是错误的,我想我理解了,但我仍然不能把它弄对

如果有人能提供建议,那就太好了

致意 阿德里安

这是否改变了:

CREATE_STRING:  PROCESS (CLK, RESET)
    BEGIN
        IF RESET = '1' THEN
            FOR i IN 0 TO 31 LOOP
                lcd_data(i) <= x"30";
            END LOOP;

        ELSIF CLK = '1' AND CLK'event THEN
            IF X /= 0 THEN
                FOR i IN 0 TO 15 LOOP
                    IF X(15-i) = '0' THEN   
                        lcd_data(i) <= x"30";
                    END IF;
                    IF X(15-i) ='1' THEN 
                        lcd_data(i) <= x"31";
                    END IF;
                END LOOP;
            END IF;
        ELSIF lcd_y = '1' THEN  
                lcd_data(to_integer(pos_count)) <= x"31";
        END IF;

END PROCESS CREATE_STRING;
CREATE_字符串:进程(CLK,重置)
开始
如果重置='1',则
对于0到31循环中的i

lcd_data(i)要正确描述寄存器,必须将if语句的顺序颠倒如下:

CREATE_STRING:  PROCESS (CLK, RESET)
    BEGIN
        IF RESET = '1' THEN
            FOR i IN 0 TO 31 LOOP
                lcd_data(i) <= x"30";
            END LOOP;
        ELSIF CLK = '1' AND CLK'event THEN
            IF X /= 0 THEN
                FOR i IN 0 TO 15 LOOP
                    IF X(15-i) = '0' THEN   
                        lcd_data(i) <= x"30";
                    END IF;
                    IF X(15-i) ='1' THEN 
                        lcd_data(i) <= x"31";
                    END IF;
                END LOOP;
            END IF;

            IF char_count > 15 AND lcd_y = '1' THEN 
                lcd_data(to_integer(char_count)) <= x"31";
            END IF;
        END IF;
END PROCESS CREATE_STRING;
CREATE_字符串:进程(CLK,重置)
开始
如果重置='1',则
对于0到31循环中的i

lcd_data(i)要正确描述寄存器,必须将if语句的顺序颠倒如下:

CREATE_STRING:  PROCESS (CLK, RESET)
    BEGIN
        IF RESET = '1' THEN
            FOR i IN 0 TO 31 LOOP
                lcd_data(i) <= x"30";
            END LOOP;
        ELSIF CLK = '1' AND CLK'event THEN
            IF X /= 0 THEN
                FOR i IN 0 TO 15 LOOP
                    IF X(15-i) = '0' THEN   
                        lcd_data(i) <= x"30";
                    END IF;
                    IF X(15-i) ='1' THEN 
                        lcd_data(i) <= x"31";
                    END IF;
                END LOOP;
            END IF;

            IF char_count > 15 AND lcd_y = '1' THEN 
                lcd_data(to_integer(char_count)) <= x"31";
            END IF;
        END IF;
END PROCESS CREATE_STRING;
CREATE_字符串:进程(CLK,重置)
开始
如果重置='1',则
对于0到31循环中的i

lcd_数据(i)您在流程的计时部分之外做了太多事情。Juergen的答案看起来不错……正如Juergen建议您在
lcd_y='1'
时也必须将赋值放入
ELSIF CLK='1'和CLK'事件中,然后
块。您在流程的计时部分之外做了太多的工作。Juergen的答案看起来不错……正如Juergen建议的,当
lcd_y='1'
进入
ELSIF CLK='1'和CLK'事件时,你也必须将赋值放入
ELSIF CLK='1'和
块中。当我这样写时,我得到错误:error(10821):seqdec.vhd处的HDL error(76):无法推断“lcd_data[15][0]的寄存器。”因为它的行为与任何支持的寄存器模型都不匹配,而且我必须承认,带有X的部分不应该用CLK触发,而只能用XMake确保您的目标FPGA技术支持异步重置。如果可以,您应该只使用同步重置(我个人的意见)。同样的事情也适用于你的X信号:使它同步工作(或者详细解释为什么你认为有必要异步)。我承认它可以同步,但我认为对于一个进程来说太多了,我读过一篇文章,这可能会让他想到两个不同的时钟,但这是不可能的。但现在我不知道如何在一个过程中以不同的方式处理这个问题。我想让他建立一个字符串,上面16个位置,下面16个位置,但有不同的要求。@DaPole在Juergen发布了他的答案后,你已经对你的问题进行了编辑。它看起来几乎相同,但在最后一次
ELSIF
时不同。当
lcd_y='1'
时,您还必须将赋值放入
ELSIF CLK='1'和CLK'事件中,然后
块。我建议给一个时钟边缘触发寄存器一个异步复位的代码模式。当我这样写的时候,我得到了错误:error(10821):seqdec的HDL错误。vhd(76):无法推断“lcd_数据[15][0]的寄存器”因为它的行为与任何支持的寄存器模型都不匹配,而且我必须承认,带有X的部分不应该用CLK触发,而只能用XMake确保您的目标FPGA技术支持异步重置。如果可以,您应该只使用同步重置(我个人的意见)。同样的事情也适用于你的X信号:使它同步工作(或者详细解释为什么你认为有必要异步)。我承认它可以同步,但我认为对于一个进程来说太多了,我读过一篇文章,这可能会让他想到两个不同的时钟,但这是不可能的。但现在我不知道如何在一个过程中以不同的方式处理这个问题。我想让他建立一个字符串,上面16个位置,下面16个位置,但有不同的要求。@DaPole在Juergen发布了他的答案后,你已经对你的问题进行了编辑。它看起来几乎相同,但在最后一次
ELSIF
时不同。当
lcd_y='1'
时,您还必须将赋值放入
ELSIF CLK='1'和CLK'事件中,然后
块。我建议给出一个时钟边缘触发寄存器的异步复位代码模式。