2 apprentices apprentices 于 2016.02.28 21:50 提问

这段代码中二,四,八分频和十六分频有什么意思?

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

ENTITY LED IS
PORT (clk,rst:IN std_logic;
inp: in std_logic_vector(1 downto 0);
output : OUT std_logic_vector(7 downto 0) );
END LED;

ARCHITECTURE ONE OF LED IS
SIGNAL clk_2,clk_4,clk_8,clk_16,q:STD_LOGIC;
SIGNAL OUTPUT3: std_logic_vector(6 downto 0);
SIGNAL output1 :std_logic;
SIGNAL output2 :std_logic_vector(6 downto 0) ;
SIGNAL e:integer range 0 to 33;
Begin

--2分频
p1:process(clk,rst)
variable a:integer range 0 to 20;

begin
if rst='1' then clk_2<='0';

else if clk'event and clk='1'then

if a>=1 then

a:=0;
clk_2<='1';
else a:=a+1;
clk_2<='0';
end if;
end if;
end if;
end process p1;

--4分频
p2:process(clk,rst)

    variable b:integer range 0 to 20;  
    begin 
        if rst='1' then
          clk_4<='0'; 
        else 
             if clk'event and clk='1'then   
                 if b>=3 then  
                      b:=0;
                    clk_4<='1';  
                 else  
                      b:=b+1;  
                      clk_4<='0'; 
                end if; 
            end if;  
       end if; 
  end process p2; 

--8分频
p3:process(clk,rst)

variable c:integer range 0 to 20;

begin
if rst='1' then
clk_8<='0';

else
if clk'event and clk='1'then

if c>=7 then

c:=0;

clk_8<='1';

else
c:=c+1;
clk_8<='0';

end if;
end if;
end if;
end process p3;

--16分频
p4:process(clk,rst)

variable d:integer range 0 to 20;
begin
if rst='1' then

clk_16<='0';

else if (clk'event and clk='1')then

if d>=15 then
d:=0;
clk_16<='1';

else d:=d+1;
clk_16<='0';
end if;

end if;

end if;
end process p4;

--4选1

PROCESS (rst,inp)
BEGIN
if(rst='1') then output1<='0';
else
case inp is
when "00"=>output1<=clk_2;OUTPUT3<="0111111";

           when "01"=>output1<=clk_4;OUTPUT3<="0000110"; 
           when "10"=>output1<=clk_8;OUTPUT3<="1011011"; 
           when "11"=>output1<=clk_16;OUTPUT3<="1001111";  
           when others=>null;
     end case;
  end if;
  output2<=OUTPUT3;
END PROCESS;

--33进制计数器
PROCESS (rst,q)

variable temp:integer range 0 to 33;

      BEGIN  
       q<=output1;
         IF rst='1' THEN temp:=0;   
           ELSIF (q'event and q='1') THEN         
                  temp:=temp+1;  
               if(temp=33) then temp:=0;            
               end if;  
         END IF; 
      e<=temp; 
   END PROCESS; 

    PROCESS (e)   
    BEGIN 
          if rst='1' then output<="11111110"; 
          else 
           case e is 
             when 0=>output<="11111110";    
             when 1=>output<="01111111"; 
             when 2=>output<="10111111";  
             when 3=>output<="11011111"; 
             when 4=>output<="11101111";
             when 5=>output<="11110111";   
             when 6=>output<="11111011";   
             when 7=>output<="11111101";
             when 8=>output<="11111110"; 
             when 9=>output<="11111111";  
             when 10=>output<="01111111";   
             when 11=>output<="00111111";  
             when 12=>output<="00011111";  
             when 13=>output<="00001111";   
             when 14=>output<="00000111";   
             when 15=>output<="00000011";   
             when 16=>output<="00000001";
             when 17=>output<="00000000";
             when 18=>output<="10000000"; 
             when 19=>output<="11000000";  
             when 20=>output<="11100000";   
             when 21=>output<="11110000"; 
             when 22=>output<="11111000";   
             when 23=>output<="11111100"; 
             when 24=>output<="11111110";
             when 25=>output<="10000000";
             when 26=>output<="01000000"; 
             when 27=>output<="00100000";   
             when 28=>output<="00010000";
             when 29=>output<="00001000";   
             when 30=>output<="00000100";   
             when 31=>output<="00000010";
             when 32=>output<="00000001";   
             when others=>null; 
          end case; 
        end if;
   end process; 

end ONE;

2个回答

caozhy
caozhy   Ds   Rxr 2016.02.28 22:52

就是给一个时钟信号,产生一个时钟信号,产生的时钟速度是原来的1/4 1/8 1/16...
原理是增加一个计数器,比如8分频,如果计数器计数在0-7,就输出0,8-15输出1,结果就是产生了一个1/8的0-1时钟信号。

apprentices
apprentices   2016.03.03 14:40

那么如何设定时间呢?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Verilog任意整数分频电路
任意整数分频Verilog代码
一个比较简单的D触发器4分频verilog程序
转自 http://blog.sina.com.cn/s/blog_605fa0af0100djnz.html 将两个D触发器级联起来,前一个D触发器的输出做为下一个触发器的时钟输入,就构成了一个由两个D触发器形成的4分频程序,代码如下所示: module D_ff_4div(clkin,reset_n,clkout);     input clkin,reset_n;     o
Verilog HDL分频器 2分频 4分频, 8 分频,16分频
Verilog HDL分频器 2分频 4分频, 8 分频,16分频。
verilog入门经验(二)--分频及counter的巧用
1. 偶数倍,整数分频:     对原时钟进行偶数倍整数分频,可对其计数,计数器不同bit位即为各分频时钟,bit0 = 原时钟、bit1 = 2分频、bit2 = 4分频、bit3 = 8分频...     example:     reg[5:0] div_cnt;   // 本例到16分频,如需更高增加counter位数即可,位数按分频倍数需要定义     always @ (pos
【数电】如何使用74LS112(或74LS74)构成一个十四分频器(模七计数器)
ITji大家都学过
关于利用D触发器实现2/4分频的思路与VERILOG代码
首先要理解的是利用D触发器实现2分频的思路:verilog代码如下:module div_2 ( input clk_in,input rst ,output clk_out);reg clk;always @( posedge clk or negedge rst )beginif( !rst )clk&amp;lt;= 1'h0;else clk&amp;lt;=~clk;endassign clk_out ...
【FPGA】时钟分频设计
以前做的一些FPGA的一些简单设计,做个记录,比较基础。 本文是讲述时钟分频电路设计,可以分为偶数分频和奇数分频;
分频电路
第一次写技术性的blog,就先选择一个看似简单的话题吧。      无论从算法上还是逻辑上,这个题目都非常简单,但是对于ASIC工程师,恐怕却是一个不小的挑战。       首先,看看我们的目标:          很简单吧,只要在响应的输入时钟沿上产生输出的翻转就可以了。但是对于ASIC工程师,却有很多东西是值得讨论的。        1.行为级的实现是非常简单的,只要你会写
verilog二分频代码&verilog三分频代码
1.二分频 首先要明白,二分频分的是输入时钟的频率,即CLK的频率。 思路:在每次CLK的上升沿或者下降沿让输出Q翻转不就完成频率的二分了吗? 代码:     module div_2 (q,clk,reset); //   输出q,输入时钟CLK,同步复位信号RESET.     output q;     input reset;     input clk;
verilog 语言实现任意分频
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器。下面以Verilog HDL 语言为基础介绍占空比为50%的分