VHDL 百分频器设计与Verilog实现:使用STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包
VHDL 百分频器设计与Verilog实现:使用STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包
本文章将介绍如何使用VHDL设计一个百分频器,并将其转换为Verilog代码。
VHDL代码:
USE IEEE.STD_LOGIC_1164.ALL; --程序中有STD_LOGIC和STD_LOGIC_VECTOR数据类型,这两种数据类型都在STD_LOGIC_1164
--程序包中定义。
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --程序中有“+”运算符,无符号数的算术运算在STD_LOGIC_UNSIGNED程序包中定义。
ENTITY BAIFENPING IS
PORT(
CLR,CLK_SOURCE: IN STD_LOGIC; --输入端口,数据类型为STD_LOGIC。
CLK_TARGET:OUT STD_LOGIC); --输出端口,数据类型为STD_LOGIC。
END ENTITY BAIFENPING;
ARCHITECTURE RTL OF BAIFENPING IS
SIGNAL CNT:STD_LOGIC_VECTOR(5 DOWNTO 0);
CONSTANT M:INTEGER:=49; --设置一控制计数器的常量,该值为(分频数/2)-1
SIGNAL TMP:STD_LOGIC; --引入信号TMP,用来存储反相器输出结果,即输出信号
BEGIN
PROCESS(CLK_SOURCE) --进程,其敏感信号为输入的时钟信号
BEGIN
IF (CLR='0') THEN --如清零信号为低电平,五十进制计数器清零,中间信号置低电平;
CNT<="000000";TMP<='0';
ELSIF(CLK_SOURCE'EVENT AND CLK_SOURCE='1')THEN --判断输入时钟信号有无上升沿到来
IF(CNT=M)THEN --输入信号有上升沿到来,且计数结果为49
TMP<=NOT TMP;CNT<="000000"; --信号TMP反相,计数器清零
ELSE --输入信号有上升沿到来,计数结果不为49
CNT<=CNT+1; --信号TMP保持,计数结果加1
END IF;
END IF; --输入时钟信号无上升沿到来,计数结果保持,信号TMP保持
END PROCESS;
CLK_TARGET<=TMP; --将信号TMP的值赋值给输出
END ARCHITECTURE RTL;
Verilog代码:
`timescale 1ns/1ns
module BAIFENPING (
input wire CLR, CLK_SOURCE,
output reg CLK_TARGET
);
reg [5:0] CNT;
parameter M = 49;
reg TMP;
always @(posedge CLK_SOURCE or negedge CLR) begin
if (CLR == 0) begin
CNT <= 6'b000000;
TMP <= 1'b0;
end else if (posedge CLK_SOURCE) begin
if (CNT == M) begin
TMP <= ~TMP;
CNT <= 6'b000000;
end else begin
CNT <= CNT + 1;
end
end
end
assign CLK_TARGET = TMP;
endmodule
解释:
- VHDL代码:
- USE语句: 程序中使用了
STD_LOGIC_1164和STD_LOGIC_UNSIGNED两个程序包。STD_LOGIC_1164定义了STD_LOGIC和STD_LOGIC_VECTOR数据类型,而STD_LOGIC_UNSIGNED则提供了无符号数的算术运算功能。 - 实体定义: 定义了名为
BAIFENPING的实体,该实体包含两个输入端口CLR和CLK_SOURCE,以及一个输出端口CLK_TARGET。 - 结构体定义: 定义了一个名为
RTL的结构体,其中包含了一个计数器信号CNT,一个常量M和一个中间信号TMP。 - 进程定义: 使用
PROCESS语句定义了一个敏感信号为CLK_SOURCE的进程,该进程用来实现计数器的逻辑。 - 计数器逻辑: 当清零信号
CLR为低电平时,计数器清零,中间信号置低电平。当输入时钟信号有上升沿到来时,如果计数结果为M,则中间信号反相,计数器清零。否则,计数结果加1。 - 输出信号赋值: 最后,将中间信号
TMP的值赋值给输出信号CLK_TARGET。
- Verilog代码:
- 模块定义: 定义了一个名为
BAIFENPING的模块,包含了两个输入端口CLR和CLK_SOURCE,以及一个输出端口CLK_TARGET。 - 信号定义: 定义了计数器信号
CNT,一个常量M和一个中间信号TMP。 - always语句: 使用
always语句定义了敏感信号为CLK_SOURCE上升沿或CLR下降沿的逻辑。该逻辑与VHDL代码中的PROCESS语句逻辑相同。 - 输出信号赋值: 最后,使用
assign语句将中间信号TMP的值赋值给输出信号CLK_TARGET。
总结:
本文章介绍了如何使用VHDL设计一个百分频器,并将其转换为Verilog代码。文章中详细解释了VHDL代码的各个部分,包括使用STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包,以及进程和敏感信号的设置。最后,文章提供了等效的Verilog代码,方便用户进行对比学习。
原文地址: https://www.cveoy.top/t/topic/py0f 著作权归作者所有。请勿转载和采集!