之前接触过一些硬件描述语言以及VHDL/CPLD的单片机的设计实验,那时是2022年了
这里补写一篇笔记,以记录一下那十多个小时 万年历实验 研究中的心得体会:
说明解释都是个人理解,与标准描述有较大出入......
目录
实体(ENTITY)定义和架构(ARCHITECTURE)的开头部分:
输入输出器件的编写:
想必大家都听说过一些单片机外围电路上的芯片:
比如74HC138(三选八)芯片,74HC573扩展芯片等,这些芯片在硬件上定义一些输入与输出相联系的逻辑来实现他们的功能,
而这里的编程则是在软件上自己先使用硬件描述语言进行对输入输出逻辑的组合,自己编写出类似于分频器、片选芯片类似功能的器件模块,然后再将它们与具体的输入输出线引脚相组合,最后编译无报错下载进板子查看效果的过程。
分频器点亮不同频率LED:
这里展示了一个编写简单的分频器的硬件描述语言的逻辑代码,下面分布解释:
引用头文件:
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
实体(
ENTITY
)定义和架构(ARCHITECTURE
)的开头部分:PORT 描述了一个具有时钟分离功能的模块,
它接收一个输入时钟信号
CLK
,并产生两个输出时钟信号:
CLK_1HZ
(1赫兹的时钟)和CLK_1KHZ
(1千赫兹的时钟)ENTITY CLK_SEP IS PORT(CLK:IN STD_LOGIC; CLK_1HZ:OUT STD_LOGIC; CLK_1KHZ:OUT STD_LOGIC); END CLK_SEP; ARCHITECTURE BHV OF CLK_SEP IS
主体:变量定义与时钟事件检查:
COUNT1
:一个24位的STD_LOGIC_VECTOR
,用于产生1Hz的时钟信号。
COUNT2
:一个14位的STD_LOGIC_VECTOR
,用于产生1kHz的时钟信号。
IF CLK'EVENT AND CLK = '1' THEN
:这一行检查CLK
信号是否有一个事件(上升沿0变为1)
COUNT1
与COUNT2
在每个CLK
上升沿递增。当
COUNT1
的值在"010110111000110110000000"
(二进制表示,对应于某个十进制数)和"101101110001101100000000"
之间时,CLK_1HZ
被设置为'1'
。这个范围代表了从某个特定开始点到结束点的时间段,用于产生1Hz的时钟周期。当
COUNT1
的值小于或等于结束点且大于或等于"000000000000000000000000"
(即开始点)时,CLK_1HZ
被设置为'0'
。当
COUNT1
达到结束点"101101110001101100000000"
时,它被重置为"000000000000000000000000"
,以便开始下一个1Hz周期。当
COUNT2
的值在"01011101110000"
和"10111011100000"
之间时,CLK_1KHZ
被设置为'1'
。这个范围代表了从某个特定开始点到结束点的时间段,用于产生1kHz的时钟周期。当
COUNT2
的值小于或等于结束点且大于或等于"00000000000000"
时,CLK_1KHZ
被设置为'0'
。当
COUNT2
达到结束点"10111011100000"
时,它被重置为"00000000000000"
,以便开始下一个1kHz周期。BEGIN PROCESS(CLK) VARIABLE COUNT1:STD_LOGIC_VECTOR(23 DOWNTO 0); VARIABLE COUNT2:STD_LOGIC_VECTOR(13 DOWNTO 0); BEGIN IF CLK'EVENT AND CLK = '1' THEN COUNT1:=COUNT1+1; COUNT2:=COUNT2+1; IF ((COUNT1>="010110111000110110000000") AND (COUNT1<="101101110001101100000000") ) THEN CLK_1HZ<='1'; ELSIF ((COUNT1<="010110111000110110000000") AND(COUNT1>="000000000000000000000000")) THEN CLK_1HZ<='0'; IF