【发布时间】:2013-01-11 10:21:41
【问题描述】:
我正在为我的 Nexys2 开发板编写 RS232 模块。我目前的波特率控制器有问题,我想将其设置为 19200。
为此,我使用的是 Mod-M 计数器,经过多次 ISim 模拟后,我的代码的问题在于 mod-m 计数器,因为它没有产生任何滴答声。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity baud_rate is
generic (
N: integer := 8;
M: integer :=163);
Port (clk, reset : in STD_LOGIC;
tick : out STD_LOGIC;
q : out STD_LOGIC_VECTOR(N-1 downto 0));
end baud_rate;
architecture Behavioral of baud_rate is
signal r_reg : unsigned(N-1 downto 0);
signal r_next : unsigned(N-1 downto 0);
begin
process(clk,reset)
begin
if (reset ='1') then
r_reg <= (others=>'0');
elsif(clk'event and clk='1') then
r_reg <= r_next;
end if;
end process;
r_next <= (others =>'0') when r_reg=(M-1) else r_reg+1;
tick <='1' when r_reg=(M-1) else '0';
q <= std_logic_vector(r_reg);
end Behavioral;
我已经测试了所有的 clk 输入并且运行良好,问题似乎出在 r_reg 和 r_next 寄存器上。在 ISim 中,当在 q 上输出其中任何一个时,我得到 UUUUUUUU,因此它们似乎没有产生信号。由此我可以推断出两个 r_reg 和 r_next 寄存器没有被创建或存储值,使用 unsigned 时是否有问题?
为了确保三重确保我什至从使用 VHDL 的 FPGA Prototyping 一书中复制了 mod-m 计数器(这是显示的代码)但是这仍然不起作用并且 q 输出是 UUUUUUUU。
如果有任何更好的方法可以从 nexys2 50mz 时钟创建波特率,也将不胜感激!
干杯
【问题讨论】:
-
由于您没有向我们展示测试平台,我不得不问:您是否应用了复位信号?当你这样做时,r_reg 发生了什么?另外:这是非常糟糕的VHDL(虽然还不错,但它已经坏了);真的是来自乒乓书吗?
-
我没有应用任何复位信号,是的,它来自书中,因为我想确保它有效!但我确实尝试在 clk 事件之外使用 r_reg
-
我没有设置测试台,因为它只是传递一个 clk 信号并读出滴答声和 q (如果你能指出一些更好的代码,我将不胜感激,即使一个新手,我发现这很丑!)
-
嗯,你有你的答案。 r_reg = "UUUU" 的唯一出路是在 Reset 子句中。我将添加一个更整洁但未经测试的 VHDL 的答案。
-
非常感谢,我只是在 ISim 上强制重置为“1”,当我输出 r_reg 时,我现在得到 XXXXXXXX,所以我认为它现在归结为 r_next 在我执行 r_reg