--fraction_div.vhd
Library ieee;Useieee.std_logic_1164.all,ieee.std_logic_unsigned.all;
Library ucxLib; Use ucxLib.ucx_2008pkg.all;
Entity fraction_div is port(
clock :in std_logic;
q :out std_logic
);
End fraction_div;
Architecture myFavor of fraction_div is
signal parts : std_vector(0to 6);
signal share : std_vector(0to 2);
signalclk32256K,clk_en : std_logic :='0';
Begin
Process(clock) begin
if rising_edge(clock)then
RstIncDec(share,share(0), '1');
RstIncDec(parts,share(0) and parts=124, share(0));
clk_en <=not share(0) or parts=0 or parts=31 or parts=62 or parts=93;
end if;
End process;
Process(clock, clk_en) begin
if rising_edge(clock)and clk_en then
clk32256K<= not clk32256K;
end if;
End process;
q <= clk32256K;
End myFavor;
fraction_div.vhd实现的功能是输入clock为80MHz,输出q为32.256M。即表明程序中rising_edge(clock) and clk_en实现64.512M时钟功能。不过q的占空比不是固定50%。
代码行18表明parts在parts=124和share >=4时清零,否则在share>=4条件下增1计数。
行19中not share(0)表示share=0,1,2,3四个周期,parts=0or parts=31 or parts=62 or parts=93表示均匀选取4个parts。
行18中与运算share(0)and parts=124第一个参数share(0)是std_logic型,第二个参数parts=124是boolean。这样书写可以编译通过,因为在ucx_2008pkg.vhd中重载了and运算符。
Function"and"(bL: std_logic; bR:boolean) return std_logic is
begin
return bLand STDZ(bR);
End;
Function"and"(bL: boolean; bR:std_logic) return boolean is
begin
return bLand bR='1';
End;
运算符and重载后,boolean和std_logic两个不同类型的变量运算后结果同第一个变量。类似地可以重载or,xor,nand,nor和xnor。并加入到自定义库中。