打印

谁帮我看看二分频程序,解释一下,谢了

[复制链接]
1575|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ygsh16|  楼主 | 2007-4-11 21:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
clk_uart:process(clk,rst)
constant CntOne : std_logic_vector(CNTR_SIZE-1 downto 0) := CONV_STD_LOGIC_VECTOR(1,CNTR_SIZE);
variable    Cntr   : std_logic_vector(CNTR_SIZE-1 downto 0);
  begin
     if Rising_Edge(clk) then
            if rst = '1' then
                Cntr := (others => '0');
                s_uart_clk <= '0';
            else
                Cntr := Cntr + CntOne;

                if Cntr = CONV_STD_LOGIC_VECTOR(BAUD_DIVIDER,CNTR_SIZE) then 
                    s_uart_clk <= not s_uart_clk;
                        Cntr := (others => '0');
                else   
                    s_uart_clk <= s_uart_clk;
                end if;
        end if;
     end if;
  end process;
CONV_STD_LOGIC_VECTOR(1,CNTR_SIZE)是啥意思?是0000000........1还是32个1?
其中BAUD_DIVIDER=1,
这是别人的程序,我的理解是这样:Cntr为
0000.......................1
0000......................10
..........................11
.
.
.
这样好像不是二分频了

相关帖子

沙发
hideid| | 2007-4-14 06:18 | 只看该作者

答:

(1)CONV_STD_LOGIC_VECTOR(1,CNTR_SIZE)就是把integer型的数值1转换成用CNTR_SIZE位表示的std_logic_vector类型的数值,如果CNTR_SIZE是4的话,那么就是0001。

(2)这个程序里面,用来产生clk 的2分频的是s_uart_clk信号,并不是Cntr,因为BAUD_DIVIDER=1,所以2个 Rising_Edge(clk)才会产生一次s_uart_clk <= not s_uart_clk;而Cntr只是个计数信号。

这个程序如果用来2分频,效果还可以,但是这个结构如果用来做Cntr的计数器,那就太糟糕了。

使用特权

评论回复
板凳
ygsh16|  楼主 | 2007-4-14 23:46 | 只看该作者

怎样计数

我就是不知道:Cntr怎样计数的,
如果刚开始Cntr全0,加一后变为0000.....1,会产生一次s_uart_clk <= not s_uart_clk,如果再加一会变成00000....10,再加一会变成000000.....11,这样好多次后才有可能使Cntr重新变成0000.....1,我这样理解错在哪里?

CTR只可能取全0或0000.....1,这是怎样的加法做到的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝