最近在看VHDL的UART实验,本人愚笨,看得不是很懂。<br />首先一个问题:40Mhz的时钟,要获得9600波特率。假如我发送一位数据就用一个时钟周期,那么就要获得9600Hz的时钟吗? 40M/9600=4167,我采用一个4167计数器分频,应该就可以得到时钟了吧?我那实验例子里是获得9600*8的时钟,以方便位同步。我在网上参考了一段程序,试了一下,不过发送失败了。<br /><br />entity s is<br /> Port ( <br /> clk : in std_logic;<br /> rst : in std_logic;<br /> dout : out std_logic<br /> );<br />end s;<br /><br /><br /><br />architecture Behavioral of s is<br /><br />signal div_reg : std_logic_vector(15 downto 0);--分频计数器<br />signal clk2: std_logic;--分频后时钟信号<br /><br />constant div_par: std_logic_vector(15 downto 0):="0001000001000110";--波特率参数,x1046,将40M分成9600hz<br />constant data: std_logic_vector(9 downto 0):="1010101010";--自己定义的一个数据<br /><br />begin<br /><br />process(clk,rst)--产生9600hz时钟<br />begin<br /> if(not rst='1')then<br /> div_reg<="0000000000000000";<br /> elsif(clk'event and clk='1')then<br /> if(div_reg=div_par)then<br /> div_reg<="0000000000000000";<br /> clk2<=not clk2;<br /> else<br /> div_reg<=div_reg+"0000000000000001";<br /> end if;<br /> end if;<br />end process;<br /><br /><br />process(clk2,rst)--发送一个十位数据(起始位是0,结束位是1)<br />variable count:integer range 0 to 9 :=0;<br /><br />begin<br /> if (not rst='1') then<br /> count:=0;<br /> dout<='1';<br /> elsif rising_edge(clk2) then<br /> if count=9 then<br /> dout<=data(9);<br /> else<br /> dout<=data(count);<br /> count:=count+1;<br /> end if;<br /> end if;<br />end process;<br /><br /><br />end Behavioral; |
|