Vhdl Mod-M计数器无符号值没有信号

Vhdl Mod-M计数器无符号值没有信号,vhdl,fpga,hdl,Vhdl,Fpga,Hdl,我正在为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 Unsi

我正在为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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
--如果使用,请取消注释以下库声明
--具有有符号或无符号值的算术函数
使用IEEE.NUMERIC_STD.ALL;
--如果正在实例化,请取消对以下库声明的注释
--此代码中的任何Xilinx原语。
--UNISIM图书馆;
--使用UNISIM.VComponents.all;
实体波特率为
一般的(
N:整数:=8;
M:整数:=163);
端口(时钟,复位:在标准逻辑中;
勾选:勾选标准逻辑;
q:输出标准逻辑向量(N-1到0);
终端波特率;
波特率的结构是
信号r_reg:无符号(N-1向下至0);
信号r_next:无符号(N-1向下至0);
开始
过程(时钟、复位)
开始
如果(reset='1'),则
r_reg“0”);
elsif(clk'事件和clk='1'),然后

r_reg坦白地说,如果人们期望从一本书中学习VHDL,我会感到震惊,书中给出了这样的例子。我知道作者有一本类似的关于Verilog的书:人们最终会认为VHDL只是一本更冗长的Verilog吗

具体的批评(实际上7,8是更多的观察):

1) 虚假的类型转换。 Q表示一个无符号数。所以让它不签名

波特发生器不是FPGA中唯一的东西,所以Q不太可能是片外端口。制作顶级片外端口std_逻辑_向量有很好的理由,但即使这样也不是强制性的。但是,如果客户的规范或编码风格坚持在端口上进行虚假的类型转换;跟着它走

2) 干燥原理:

package CPU_types is
    subtype baud_count is unsigned(7 downto 0);
end CPU_types;
在维护中发现简化。
如果在多个位置使用子类型,请将其放入包中;通用代码重用工具

3) 缩进,格式化。(我认识到这可能被编辑器设置弄得乱七八糟)。阅读它会增加大脑的负荷。但我在这里所做的并不是唯一的方法

4) 逻辑表达式周围的假括号。无害,但看起来像是C程序员的拐杖

5) 古董时钟的事件风格。明年,rising_edge功能将成熟到可以饮用(在美国,在英国,它已经在几年前的每个星期六晚上都被涂上了……)

6) 带有r_reg和r_next的“两个过程”样式。他是否也在下一个状态上使用单独的组合进程编写状态机?考虑到这一点,我想是的。单进程状态机更容易、更小(编写:它们不会生成更小的硬件)和更安全


7) 我作弊了,我的滴答声比原来晚了一个周期。如果这很关键,请恢复外部“勾选”分配。我还做了一些有助于提高性能的工作。有些人更喜欢勾选,因为您没有向我们展示测试台,我不得不问:您是否应用了重置信号?你这样做的时候,r_reg怎么了?另外:这是相当糟糕的VHDL(虽然不是那么糟糕,它已经坏了);它真的来自《庞珠》这本书吗?我没有应用重置信号,是的,它来自这本书,因为我想确保它工作!但我确实试过使用r_reg,我没有搭建测试台,因为它只是传递一个时钟信号,然后读出滴答声和q(如果你能给我指出一些更好的代码,我会非常感激,即使是新手,我也觉得这很难看!)好了,你有答案了。退出r_reg=“uuu”的唯一方法是在Reset子句中。我将用更整洁但未经测试的VHDL添加一个答案。非常感谢,我只是在ISim上强制重置为“1”,当我输出r_reg时,我现在得到了XXXXXXXX,所以我想现在应该是r_下一个被破坏的时候,我做r_reg为一个伟大的答案干杯,非常感谢<代码>单进程状态机更容易、更小(写起来:它们不会生成更小的硬件)
-它们也不会生成更大的硬件:)@BrianDrummond考虑到原始代码有多难看,我很可能忽略了一些东西,但是如果r_reg=M,那么
行不应该是
如果r_reg=M-1,那么
?我认为你的编码方式会导致r_reg从0到M(包括0到M)计数,这会导致你的滴答声比原来的间隔长一个周期。请注意,r_reg不是一个变量,因此赋值
r_reg@Zennehoy:非常正确!现在,如果R_Reg是一个变量而不是一个信号,我的代码应该是正确的!(因为它是在增量之后测试的)。当然,我们不知道M的神奇值来自哪里。通用的应该是波特率,M应该是一个内部常数,由它和时钟周期计算出来……嗨,我现在正在测试它,抱歉我下午很忙,但我会告诉你它是怎么回事!
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.NUMERIC_STD.ALL;
    use CPU_types.all;

    entity baud_rate is
        generic (
            M: integer := 163);
        Port (
            clk, reset : in  STD_LOGIC;
            tick : out  STD_LOGIC;
            q    : out baud_count);  
    end baud_rate;

    architecture Behavioral of baud_rate is
        signal r_reg : baud_count;
    begin

    process(clk,reset)
    begin
        if reset ='1' then
            r_reg <= (others=>'0');
        elsif rising_edge(clk) then 
            tick  <= 0;
            r_reg <= r_reg+1;
            if r_reg = M then 
                tick  <= '1';
                r_reg <= (others=>'0');
            end if;
        end if;
    end process;

--    tick <='1' when r_reg = M-1 else '0';
--    or simpler, when r_reg = 0
    q <= r_reg;

    end Behavioral;