5.1波特率发生器和采样时钟的设计
为完成3次采样,除了频率为9600Hz的接收时钟外,还要有一个3倍频的采样时钟。下面是实现上述功能的VHDL源程序:
library ieee;
use ieee.std_logic_1164.all;
entity count625 is
port(clk,en:in std_logic;
Clock1,Clock3:out std_logic);
end count625;
architecture count625_arc of count625 is
begin
process(clk,en)
variable count:integer range 0 to 625 :=0;
begin
if en='0' then
NUll;
elsif (rising_edge(clk)) then
count:=count+1;
if count=625 then
Clock1<='1';
count:=0;
else
Clock1<='0';
end if;
if (count=100 or count=300 or count=500 ) then
Clock3<='1';
else
Clock3<='0';
end if;
end if;
end process;
end count625_arc;
其中clk为6MHz的时钟;en控制波形的产生;Clock1为9600Hz的接收时钟;Clock3为3倍频的采样时钟,也就是频率为28800Hz。在QuartusII中的RTL级视图如图4-3所示。
图5-2 波特率发生器和采样时钟的RTL级视图
下面是波特率发生器和采样时钟在QuartusII 10.1下的时序仿真波形图,由于仿真的时间都不可能设得太长,所以在仿真时,我将相应的数值改小了一些,这样只是方便在软件下进行仿真,对实际的结果没有什么影响。
图5-3 波特率发生器和采样时钟仿真图
5.2接收电路的设计
串行接收电路首先要能判断接收数据的到来,即每一帧的开始,然后对数据进行3次采样,最后判决输出。为简化设计,帧格式仍然采用1位开始位+8位数据位+1位停止位。下面是设计的接收电路VHDL程序:
library ieee;
use ieee.std_logic_1164.all;
entity com_receive10 is
port(com,clr,clk1,clk3:in std_logic;
Q:out std_logic_vector(0 to 9);
Valid:out std_logic);
end com_receive10;
architecture com_receive10_arc of com_receive10 is
Signal Enable:std_logic :='1';
Signal Hold:std_logic :='0';
Signal N:std_logic_vector(0 to 2) :="000";
begin
751com.cn range 0 to 9 :=0;
begin
if clr='0' then
Enable<='1';
Num:=0;
Q<="0000000000";
elsif (rising_edge(clk1)) then
Q(Num)<=(N(0) and N(1)) or (N(1) and N(2)) or (N(0) and N(2));
if Num=9 then
Enable<='0';
Num:=0;
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页