问一个关于VHDL写的I2C协议的问题

问一个关于VHDL写的I2C协议的问题,第1张

这里有一个C语言版的,你可以自己改造一下。如果你的系统速度快的话,可在SCL、SDA赋值指令后加一定的延时。

//******************启动IIC总线**************************

void IICStart(void)

{

SCL=0

SDA=1

SCL=1

SDA=0

SCL=0

SDA=1

}

//*************************停止IIC总线********************

void IICStop(void)

{

SCL=0

SDA=0

SCL=1

SDA=1

SCL=0

}

//************************检查应答位**********************

bit IICRecAck(void)

{

SCL=0

SDA=1

SCL=1

CY=SDA //返回值放在CY中

SCL=0

return(CY)

}

//***************************对IIC总线产生应答**********

void IICACK(void)

{

SDA=0

SCL=1

SCL=0

SDA=1

}

//****************************不对IIC总线产生应答************

void IICNoAck(void)

{

SDA=1

SCL=0

SCL=0

}

//*************************向IIC总线写数***********

void IICSendByte(uchar sendbyte)

{

uchar data j=8

for(j>0j--)

{

SCL=0

sendbyte<<=1 //会使CY=sendbyte^7

SDA=CY

SCL=1

}

SCL=0

}

//***********************从IIC总线读数据****************

uchar IICReceiveByte(void)

{

register receivebyte,i=8

SCL=0

while(i--)

{

SCL=1

receivebyte=(receivebyte<<1)|SDA

SCL=0

}

return(receivebyte)

}

process(clr)--- 进程语句,不过括号中要写入进程中所有的输入

信号,因此应该改成(clr,clk,clkdiv)

begin --进程开始

if(clr='1') then --如果复位信号=1,clkdiv每一位全为0

clkdiv <= (others =>'0')

elsif(rising_edge(clk)) then --否则在时钟上升沿到来

clkdiv <= clkdiv + 1 clkdiv+1

end if--if语句结束

end process ---进程结束

这段进程就是实现clkdiv的计数功能,在清零信号clr有效时,对clkdiv清零,否则加1

std_logic_vector type does not match integer literal这个错误是说std_logic_vector类型与整形不匹配 主要原因是因为你的q1<= q1+1这句 std_logic_vector不能直接做加法运算。需要先转换成整型,运算之后再转换回来,这需要调用conv_integer 和 conv_std_logic_vector这两个函数。

至于其他还有很多语法错误 不多赘述 我在程序中直接给你做了更改 注意if的匹配

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

USE IEEE.STD_LOGIC_ARITH.ALL --添加一个库 使用它里面的函数

USE IEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY cnt315 IS

PORT(clk , clrn : IN STD_LOGIC

q : out std_logic_vector(11 downto 0)) --定义十二位

END cnt315

ARCHITECTURE one OF cnt315 IS

SIGNAL q1 : STD_LOGIC_VECTOR (3 downto 0)

SIGNAL q2 : STD_LOGIC_VECTOR (3 downto 0)

SIGNAL q3 : STD_LOGIC_VECTOR (3 downto 0)

BEGIN

PROCESS(clk,clrn)

--variable cnt : INTEGER RANGE 0 TO 315不知道你设这个变量干嘛

begin

if(clrn = '1') then

q1<= "0000"

q2<= "0000"

q3<= "0000"

elsif(clk'EVENT AND clk = '1') then

if q1= "0100" and q2= "0001" and q3= "0011" then

q1<= "0000"

q2<= "0000"

q3<= "0000"

elsif q1="1001" then

q1<= "0000"

if q2 = "1001" then

q2<= "0000"

q3<= conv_logic_vector(conv_integer(q3) + 1,4)--conv_logic_vector(x,y) x是value y是size

else

q2<= conv_logic_vector(conv_integer(q2) + 1,4)

end if

else

q1<= conv_logic_vector(conv_integer(q1) + 1,4)

end if

q <= q3&q2&q1

end if

end process

end one


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11267227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存