Vhdl 为lcd数据创建字符串
我想创建动态字符串阵列,以便将其传输到Altera DE2-115板上的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;
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'事件中,然后
块。我建议给出一个时钟边缘触发寄存器的异步复位代码模式。