WTHR.VHD作为整个芯片的发送模块,其中包括发送保持器、并/串转换。
端口描述如下:
entity wthr is
port (sen:in STD_LOGIC; --发送使能信号
whtr: in STD_LOGIC; --写发送保持器信号
dbus: in STD_LOGIC_VECTOR (7 downto 0;
--8位数据线,单向
rsthr:in STD_LOGIC; --清发送保持器
thre:out STD_LOGIC; --发送保持器数据空
thre:out STD_LOGIC; --发送串行数据线
clkout:out STD_LOGIC; --发送数据同步时钟信号
sclk: in STD_LOGIC); --波特率发生器产生的分频信号
end wthr;
当发送保持器无数据时,thre信号有效,通知CPU可写。一旦CPU写入数据且sen有效,便根据波特率发生器产生的sclk信号将数据并/串转换,并通过dout和clkout将串行数据和同步时钟发送。
process (rsthr,sclk,sen,sef) --parallel data to serial data variable l:integer range 0 to 7;
begin
if rsthr='1' then
m<=0;
1:=7;
sef<='1';
elsif wthr='1'then
sef<='0';
elsif sen='1'and sef='0' then
if sclk'event and sclk='1' then
dout<=w_p(1);
m<=m+1;
l:=1-1;
if m=7 then
m<=0;
1:=7;
esf=<='1';
end if;
end if;
end if;
end process;
3 实现难点及使用VHDL应注意的一些问题
由于VHDL语言是描述硬件行为的,相对其它开发软件的高级语言而言,在编程过程中有一些特殊性,所以经常会出现语法正确但无法综合的问题。其原因多半因为编程者对硬件内部的工作原理了解不够,写出的代码硬件无法实现。通过这块芯片的设计,在此总结出一些应注意的问题,供大家参考:
(1)在一个进程中只允许一个信号上升沿作为触发条件。
(2)信号值改变后要经过一个小的延时才能生效,同个信号不能在多个进程中赋值(因为多个信号源不能同时对同一个信号驱动)。
(3)时序电路和组合电路最好不要在同一个进程中,以免费资源。
(4)一个功能模块最好按上升沿信号分多个进程完成,各进程间用信号联系。
(5)同一个信号在进程中的值改变后,要注意该值改变前后该进程中其它变量的变化,避免逻辑死锁。
(6)在顺序语句中,注意信号因赋值后需延时改变而与变量的不同。
(7)设计双向三态数据线时,内部数据线最好读写分开。与外部结合时,不同读数据线之间,读写数据线之间应使用三态门,且由读信号控制。
本设计由于采用了VHDL语言作为输入方式并细合可编程逻辑门阵列CPLD,大大缩短了设计周期,提高了设计的可靠性、灵活性,使用户可根据自己的需求,方便、高效地设计出适合的串行通信芯片。