📄 baud_div.vhd
字号:
--/*****************************************************************************-- * 源文件: baud_div.vhd-- * 模块: 波特率时钟发生器-- * 版权:-- * Copyright(C) 北京联华众科科技有限公司-- * www.lianhua-zhongke.com.cn-- * 版本: Version 1.0-- * -- * 功能说明:-- * 为串口发送产生工作时钟,产生的时钟的频率为波特率的 16倍,在-- * 接收时可以直接使用,在发送时通过 8分频产生2位波特率时钟。-- *-- * 参数说明:-- * 输出-- * baudrate_clock - 波特率的 16倍时钟-- *-- * 输入-- * baudrate - 选择不同波特率的外部配置数据-- * clock - 时钟输入,如 24MHz-- * reset - 复位信号,低电平有效-- *-- * 参数-- *-- * 变更记录: -- * 2006.01.28, 新建-- *-- *****************************************************************************/LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY baud_div IS PORT ( baudrate_clock : BUFFER STD_LOGIC;--baudrate*26, for instance, when baudrate is 9600, baudrate_clock is 9600*16 baudrate : IN STD_LOGIC_VECTOR(3 downto 0):="1111"; clock : IN STD_LOGIC;--24M reset : IN STD_LOGIC );END baud_div;ARCHITECTURE baud_div_architecture OF baud_div IS --SIGNAL divisor : INTEGER := 0;BEGIN PROCESS(clock) VARIABLE delay_counter: INTEGER RANGE 0 TO 26000; VARIABLE divisor : INTEGER RANGE 0 TO 26000; BEGIN IF ( reset = '0') THEN baudrate_clock <= '1'; delay_counter := 0; ELSIF(clock = '1' AND clock'EVENT) THEN CASE baudrate IS--(24M/baudrate)/16 WHEN "0000" => divisor := 13636;--110 WHEN "0001" => divisor := 5000;--300 WHEN "0010" => divisor := 1250;--1200 WHEN "0011" => divisor := 625;--2400 WHEN "0100" => divisor := 312;--4800 WHEN "0101" => divisor := 156;--9600 WHEN "0110" => divisor := 78;--19200 WHEN "0111" => divisor := 39;--38400 WHEN "1000" => divisor := 19;--57600 WHEN "1001" => divisor := 9;--115200 WHEN "1010" => divisor := 4;--230400 WHEN "1011" => divisor := 2;--460800 WHEN "1100" => divisor := 1;--921600 WHEN OTHERS => divisor := 156;--9600 END CASE; IF (divisor = 1) THEN baudrate_clock <= clock; ELSIF (divisor = 3) THEN IF (delay_counter = 0) THEN delay_counter := delay_counter+1; ELSIF(delay_counter = 1) THEN delay_counter := delay_counter+1; baudrate_clock <= NOT baudrate_clock; ELSE delay_counter := 0; baudrate_clock <= NOT baudrate_clock; END IF; ELSE IF (delay_counter = divisor/2-1) THEN delay_counter := 0; baudrate_clock <= NOT baudrate_clock; ELSE delay_counter := delay_counter+1; END IF; END IF; END IF; END PROCESS;END baud_div_architecture;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -