LIBRARY\u0020IEEE;
--\u0020打开IEEE库
USE\u0020IEEE.STD_LOGIC_1164.ALL;
--程序中有STD_LOGIC和STD_LOGIC_VECTOR数据类型,这两种数据类型都在STD_LOGIC_1164
--程序包中定义。
USE\u0020IEEE.STD_LOGIC_UNSIGNED.ALL;
--程序中有\u0022+\u0022运算符,无符号数的算术运算在STD_LOGIC_UNSIGNED程序包中定义。

ENTITY\u0020ERSHIWUFENPING\u0020IS
PORT(
\u0020\u0020\u0020\u0020CLR,CLK_SOURCE:\u0020IN\u0020STD_LOGIC;
--输入端口,数据类型为STD_LOGIC。
\u0020\u0020\u0020\u0020\u0020CLK_TARGET:OUT\u0020STD_LOGIC);
--输出端口,数据类型为STD_LOGIC。
END\u0020ENTITY\u0020ERSHIWUFENPING;

ARCHITECTURE\u0020RTL\u0020OF\u0020ERSHIWUFENPING\u0020IS
SIGNAL\u0020X1,X2:STD_LOGIC_VECTOR(4\u0020DOWNTO\u00200);
--定义信号X1、X2,五位的位矢量,数据类型为STD_LOGIC_VECTOR。
SIGNAL\u0020TMP1,TMP2:STD_LOGIC;
--定义信号TMP1、TMP2,数据类型为STD_LOGIC。
BEGIN
\u0020\u0020PROCESS(CLK_SOURCE)
--进程,实现一个二十五进制计数器
\u0020\u0020BEGIN
\u0020\u0020\u0020\u0020IF\u0020(CLR='0')\u0020THEN
\u0020\u0020\u0020\u0020\u0020\u0020X1<="00000";
\u0020\u0020\u0020\u0020ELSIF(CLK_SOURCE'EVENT\u0020AND\u0020CLK_SOURCE='1')THEN
--判断输入的时钟信号是否有上升沿来
\u0020\u0020\u0020\u0020\u0020\u0020IF(X1="11000")THEN
--判断计数结果是否达到24,如果计数结果达到24
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020X1<="00000";
--则二十五进制计数器清零
\u0020\u0020\u0020\u0020\u0020\u0020ELSE
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020X1<=X1+1;
--输入时钟信号有上升沿来,但计数结果不为24,计数器加1
\u0020\u0020\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020END\u0020PROCESS;
\u0020\u0020PROCESS(CLK_SOURCE)
--进程,实现一个二十五进制计数器
\u0020\u0020BEGIN
\u0020\u0020\u0020\u0020IF\u0020(CLR='0')\u0020THEN
\u0020\u0020\u0020\u0020\u0020\u0020X2<="00000";
\u0020\u0020\u0020\u0020ELSIF(CLK_SOURCE'EVENT\u0020AND\u0020CLK_SOURCE='0')THEN
--判断输入的时钟信号是否有下降沿来
\u0020\u0020\u0020\u0020\u0020\u0020IF(X2="11000")THEN
--输入信号有下降沿来,且计数结果为24
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020X2<="00000";
--二十五进制计数器清零
\u0020\u0020\u0020\u0020\u0020\u0020ELSE
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020X2<=X2+1;
--输入时钟信号有下降沿来,但计数结果不为24,计数器加1
\u0020\u0020\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020END\u0020PROCESS;
\u0020\u0020PROCESS(CLK_SOURCE)
--进程,其敏感信号为输入的时钟信号,根据计数器计数结果确定信号TMP1的结果
\u0020\u0020BEGIN
\u0020\u0020\u0020\u0020IF(CLK_SOURCE'EVENT\u0020AND\u0020CLK_SOURCE='1')THEN
--判断输入的时钟信号是否有上升沿来
\u0020\u0020\u0020\u0020\u0020\u0020IF(X1="00000")THEN
--输入时钟信号有上升沿来,且计数器X1计数结果为0
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020TMP1<='1';
--信号TMP1输出高电平
\u0020\u0020\u0020\u0020\u0020\u0020ELSIF(X1="01100")THEN
--输入时钟信号有上升沿来,且计数器X1计数结果为12
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020TMP1<='0';
--信号TMP1输出低电平
\u0020\u0020\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020END\u0020PROCESS;
\u0020\u0020PROCESS(CLK_SOURCE)
--进程,其敏感信号为输入的时钟信号,根据计数器计数结果确定信号TMP2的结果
\u0020\u0020BEGIN
\u0020\u0020\u0020\u0020IF(CLK_SOURCE'EVENT\u0020AND\u0020CLK_SOURCE='0')THEN
--判断输入的时钟信号是否有下降沿来
\u0020\u0020\u0020\u0020\u0020\u0020IF(X2="00000")THEN
--输入时钟信号有下降沿来,且计数器X2计数结果为0
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020TMP2<='1';
--信号TMP2输出高电平
\u0020\u0020\u0020\u0020\u0020\u0020ELSIF(X2="01100")THEN
--输入时钟信号有下降沿来,且计数器X2计数结果为12
\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020TMP2<='0';
--信号TMP2输出低电平
\u0020\u0020\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020\u0020\u0020END\u0020IF;
\u0020\u0020END\u0020PROCESS;
\u0020\u0020CLK_TARGET<=TMP1\u0020OR\u0020TMP2;
--二十五分频模块输出为信号TMP1和信号TMP2相或的结果
END\u0020ARCHITECTURE\u0020RTL;
将VHDL转换为verilog HDL内容:module\u0020ERSHIWUFENPING(
\u0020\u0020input\u0020CLR,
\u0020\u0020input\u0020CLK_SOURCE,
\u0020\u0020output\u0020reg\u0020CLK_TARGET
);
\u0020\u0020reg\u0020[4:0]\u0020X1,X2;
\u0020\u0020reg\u0020TMP1,TMP2;
\u0020\u0020
\u0020\u0020always\u0020@(posedge\u0020CLK_SOURCE)\u0020begin
\u0020\u0020\u0020\u0020if\u0020(CLR\u0020==\u00201'b0)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X1\u0020<=\u00205'b00000;
\u0020\u0020\u0020\u0020end\u0020else\u0020if\u0020(X1\u0020==\u00205'b11000)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X1\u0020<=\u00205'b00000;
\u0020\u0020\u0020\u0020end\u0020else\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X1\u0020<=\u0020X1\u0020+\u00205'b00001;
\u0020\u0020\u0020\u0020end
\u0020\u0020end
\u0020\u0020
\u0020\u0020always\u0020@(negedge\u0020CLK_SOURCE)\u0020begin
\u0020\u0020\u0020\u0020if\u0020(CLR\u0020==\u00201'b0)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X2\u0020<=\u00205'b00000;
\u0020\u0020\u0020\u0020end\u0020else\u0020if\u0020(X2\u0020==\u00205'b11000)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X2\u0020<=\u00205'b00000;
\u0020\u0020\u0020\u0020end\u0020else\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020X2\u0020<=\u0020X2\u0020+\u00205'b00001;
\u0020\u0020\u0020\u0020end
\u0020\u0020end
\u0020\u0020
\u0020\u0020always\u0020@(posedge\u0020CLK_SOURCE)\u0020begin
\u0020\u0020\u0020\u0020if\u0020(X1\u0020==\u00205'b00000)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020TMP1\u0020<=\u00201'b1;
\u0020\u0020\u0020\u0020end\u0020else\u0020if\u0020(X1\u0020==\u00205'b01100)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020TMP1\u0020<=\u00201'b0;
\u0020\u0020\u0020\u0020end
\u0020\u0020end
\u0020\u0020
\u0020\u0020always\u0020@(negedge\u0020CLK_SOURCE)\u0020begin
\u0020\u0020\u0020\u0020if\u0020(X2\u0020==\u00205'b00000)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020TMP2\u0020<=\u00201'b1;
\u0020\u0020\u0020\u0020end\u0020else\u0020if\u0020(X2\u0020==\u00205'b01100)\u0020begin
\u0020\u0020\u0020\u0020\u0020\u0020TMP2\u0020<=\u00201'b0;
\u0020\u0020\u0020\u0020end
\u0020\u0020end
\u0020\u0020
\u0020\u0020always\u0020@(TMP1\u0020or\u0020TMP2)\u0020begin
\u0020\u0020\u0020\u0020CLK_TARGET\u0020<=\u0020TMP1\u0020|\u0020TMP2;
\u0020\u0020end
endmodule

VHDL 实现 25 分频器:代码解析及 Verilog 转换

原文地址: https://www.cveoy.top/t/topic/pzRm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录