基于VHDL 的串口程序Word文档格式.docx
- 文档编号:22255441
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:27
- 大小:21.91KB
基于VHDL 的串口程序Word文档格式.docx
《基于VHDL 的串口程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于VHDL 的串口程序Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
outstd_logic;
--sendbit
--txd_buff:
instd_logic_vector(7downto0);
--bufferwritein
--write_data:
--writedata
en:
outstd_logic_vector(7downto0);
seg_data:
--rxd_buff:
key_input:
instd_logic
--testout:
outstd_logic
--read_data:
instd_logic
);
endentitymyserial;
architecturebhvofmyserialis
SIGNALdiv_reg:
integerrange0to2**16-1;
--分频计数器,分频值由波特率决定。
分频后得到频率8倍波特率的时钟
SIGNALdiv8_tras_reg:
std_logic_vector(2DOWNTO0);
--该寄存器的计数值对应发送时当前位于的时隙数
SIGNALdiv8_rec_reg:
--寄存器的计数值对应接收时当前位于的时隙数
SIGNALstate_tras:
std_logic_vector(3DOWNTO0);
--发送状态寄存器
SIGNALstate_rec:
--接受状态寄存器
SIGNALclkbaud_tras:
std_logic;
--以波特率为频率的发送使能信号
SIGNALclkbaud_rec:
--以波特率为频率的接受使能信号
SIGNALclkbaud8x:
--以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙
SIGNALrecstart:
--开始发送标志
SIGNALrecstart_tmp:
--开始接受标志
SIGNALtrasstart:
--
SIGNALrxd_reg:
std_logic_vector(7downto0);
--接收寄存器1
SIGNALtxd_reg:
--发送寄存器
SIGNALrxd_buf:
std_logic_vector(7DOWNTO0);
--接受数据缓存
SIGNALtxd_buf:
--发送数据缓存
SIGNALsend_state:
--每次按键给PC发送"
Welcome"
字符串,这是发送状态寄存器
SIGNALcnt_delay:
integerrange0to2**20-1;
--std_logic_vector(19DOWNTO0);
--延时去抖计数器
SIGNALstart_delaycnt:
--开始延时计数标志
SIGNALkey_entry1:
--确定有键按下曛?
SIGNALkey_entry2:
--确定有键按下标志
CONSTANTdiv_par:
integer:
=8;
--fortest:
=clk_rate/(8*boud_rate);
--分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8
begin
en<
="
01010101"
;
--7段数码管使能信号赋值
txd<
=txd_reg;
PROCESS(clk,rstn)--delaycounter
BEGIN
IF(rstn='
0'
)THEN
cnt_delay<
=0;
start_delaycnt<
='
;
key_entry1<
ELSIF(clk'
EVENTANDclk='
1'
)THEN
IF(key_entry2='
)THEN--starttransmitandclearkey_entry1
key_entry1<
--
ELSE
IF(cnt_delay=98)THEN
IF(key_input='
)THEN
='
ENDIF;
IF(start_delaycnt='
)THEN--keypress
IF(cnt_delay<
99)THEN--20D800000
=cnt_delay+1;
ELSE--rejudgekey
start_delaycnt<
IF((key_input='
)AND(cnt_delay=0))THEN--judgekeypressstart
ENDPROCESS;
PROCESS(clk,rstn)--recyclecounter分频得到8倍波特率的时钟div_par
IF(rstn='
div_reg<
clkbaud8x<
EVENTANDclk='
IF(div_reg=div_par-1)THEN
=NOTclkbaud8x;
=div_reg+1;
PROCESS(clkbaud8x,clkbaud8x,rstn)
div8_rec_reg<
="
000"
div8_tras_reg<
ELSEIF(clkbaud8x'
EVENTANDclkbaud8x='
IF(recstart='
)THEN--接收开始标志
=div8_rec_reg+"
001"
--接收开始后,时隙数在8倍波特率的时钟下加1循环
IF(trasstart='
=div8_tras_reg+"
--发送开始后,时隙数在8倍波特率的时钟下加1循环
PROCESS(div8_rec_reg,div8_tras_reg)--creatreceiveandtransmitdataclk
IF(div8_rec_reg="
111"
clkbaud_rec<
--在第7个时隙,接收
IF(div8_tras_reg="
clkbaud_tras<
--在第7个时隙,发送使能信号有效,将数据发出
PROCESS(clkbaud8x,rstn)--trsnsmitdata
txd_reg<
trasstart<
txd_buf<
00000000"
state_tras<
0000"
send_state<
key_entry2<
IF(key_entry2='
IF(key_entry1='
01110111"
--"
w"
ELSE--key_entry2='
havekeypressstarttransmit
CASEstate_trasIS
WHEN"
=>
--发送起始位
IF((trasstart='
)AND(send_state<
"
))THEN--haven'
tsendalldatathencontinuetransmit
IF(send_state<
)THEN--send_stateischarcounter
IF(clkbaud_tras='
)THEN--enabletransmiteverydatabitflag
--startbit
=state_tras+"
0001"
--state_trasisbitcounter
ELSE--=7
--发送第1位
=txd_buf(0);
--undersendregis
txd_buf(6DOWNTO0)<
=txd_buf(7DOWNTO1);
--bitaddone
0010"
--发送第2位
0011"
--发送第3位
0100"
--发送第4位
0101"
--发送第5位
0110"
--发送第6位
0111"
--发送第7位
1000"
--发送第8位
1001"
--发送停止位
1010"
--1111runto15
--state_tras+"
--nextis0000
=send_state+"
--judgesendbyte
CASEsend_stateIS
01100101"
--"
e"
01101100"
--"
l"
010"
01100011"
c"
011"
01101111"
o"
100"
01101101"
m"
101"
WHENOTHERS=>
ENDCASE;
--runto10and14
--state_tras<
//old
PROCESS(clkbaud8x,rstn)--receivePC机的数据
variabletemp:
integerrange0to8;
variablercv_data:
IF(rstn='
rxd_reg<
=(others=>
'
);
rxd_buf<
--everyphase
state_rec<
recstart<
recstart_tmp<
EVENTANDclkbaud8x='
=rxd_reg(6downto0)&
rxd;
IF(state_rec="
IF(recstart_tmp='
)THEN--havecapturestartbit
=state_rec+"
IF(rxd_reg(7downto4)="
1100"
)THEN--检测到起始位的下降沿,进入接受状态
--setcapturestartbitflag
ELSE--detectotherbit
IF(state_rec>
ANDstate_rec<
IF(clkbaud_rec='
temp:
foriin1to3loop--data6,7012345
temp:
=temp+conv_integer(rxd_reg(i));
iftemp>
=2then
rcv_data:
else
endif;
endloop;
rxd_buf(7)<
=rcv_data;
rxd_buf(6DOWNTO0)<
=rxd_buf(7DOWNTO1);
ELSE--stopbit
IFrxd_reg
(2)='
THEN--stopbiterror
rxd_buf<
=(others=>
ENDIF;
PROCESS(rxd_buf,clk)--将接受的数据用数码管显示出来
ifclk'
eventandclk='
then
CASErxd_bufIS
00110000"
seg_data<
00000011"
--00x30
00110001"
seg_data;
--1
00110010"
00100101"
--2
00110011"
00001101"
--3
00110100"
--4
00110101"
01001001"
--5
00110110"
01000001"
--6
00110111"
00011111"
--7
00111000"
00000001"
--8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于VHDL 的串口程序 基于 VHDL 串口 程序