⭐目的:使用VHDL实现串口通信
⭐使用芯片:EP1C3T144C8
⭐实现结果:两块FPGA通信板均可作为发送方和接收方。按下复位键后,发送方根据拨码开关显示选择发送的数据,按下发送键后发送;接收方立马接收到数据并显示(特别快)
一、具体步骤
1.数码管显示
这个地方个人使用的是测试法,大家也可以查看原理图一步到位。
- 分清位码/段码引脚,给位码引脚0/1判断0/1谁是使能点亮?各个位码对应哪个数码管?
- 给段码引脚0/1判断0/1谁是使能点亮?各个段码对应数码管的哪条边?
测试结果表明0是点亮。
--------------------数据输入及显示部分-----------------------------------------------------
process(Rx_Valid,CLK)
begin
if RESET='0' then
case button is
when "000"=>Datarx<="01000000";
when "001"=>Datarx<="01111001";
when "010"=>Datarx<="00100100";
when "011"=>Datarx<="00110000";
when "100"=>Datarx<="00011001";
when "101"=>Datarx<="00010010";
when "110"=>Datarx<="00000010";
when "111"=>Datarx<="01111000";
when others=>null;
end case;
Data00<='1'&Datarx&'0';
else
if rising_edge(Rx_Valid) then
Datarx<=Rx_Data;
end if;
end if;
end process;
--------------------数据输入及显示部分-----------------------------------------------------
2.波特率发生器
波特率发生器实质是设计一个分频器,用于产生和RS232通信同步的时钟。在系统中用一个计数器来完成这个功能,系统时钟为40MHz,9600波特率时钟的周期约等于4167个系统时钟周期,则需要计数器为4167时输出高电平,同时令计数器为0,计数器为其他值时输出时钟保持低电平不变。由于接收方隔16个接收时钟接收一次,所以接受方的频率应该是发送方的16倍,即接受方需生成16倍于波特率的时钟,4167/16≈260。
--------------------产生波特率-----------------------------------------------------
process(CLK,RESET,Rx_Hold) --时钟产生进程
variable ClockCount : integer range 0 to 4167:=0;
variable ClockCount_Rx : integer range 0 to 260:=0;
begin
if (rising_edge(CLK)) then
ClockCount:=ClockCount+1;
ClockCount_Rx:=ClockCount_Rx+1;
--产生9600时钟,1/40MHZ*4167=1/9600
if ClockCount=4167 then Clock9600<='1';ClockCount:=0;
else Clock9600<='0';
end if;
--4167/16=260
if ClockCount_Rx=260 then Clock3<='1';ClockCount_Rx:=0;
else Clock3<='0';
end if;
end if;
end process;
--------------------产生波特率-----------------------------------------------------
3.串口发送部分
发送器的设计较容易,设置发送使能Send_en以及发送结束Send_over标志位,当复位键按下时,发送不使能,发送信号为"1000000000";复位键未按下时,当Clock9600上升沿到来时,发送使能,并按照拨码开关模式选择发送信号。如果发送使能,则发送起始位‘1’,并开始计数发送Bit数目,当Clock9600上升沿到来时,依次发送数据。如果发送Bit计数器为9时,则发送结束位‘0’,同