FPGA分频电路设计(2)

实验要求:
采用 4 个开关以二进制形式设定分频系数(1-10),实现对已知信号的分频。

类似实验我之前做过一次,但那次的方法实在是太笨了:
利用VHDL实现一定系数范围内的信号分频电路
需要重做以便将来应对更大的分频系数

先画个图分析下:
在这里插入图片描述
做偶数系数的分频,你只要关注上升沿或下降沿中的其中一种即可,但如果是奇数系数分频,你必须同时关注两种变化。
我的代码:

library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ;
use ieee.std_logic_unsigned.all ;
use ieee.numeric_std.all ;

entity Division2 is 
	port (
		input : in std_logic ;
		sw : in std_logic_vector(3 downto 0) ;
		output : buffer std_logic
	) ;
end Division2 ;

architecture divide of Division2 is
	signal mid : std_logic := '0' ;
	signal midt : std_logic := '0' ;
	signal num : integer := 0 ;
begin
	
	process(input, sw, mid, midt)
		variable upside : integer := 0 ;	-- how many rising edges ?
		variable downside : integer := 0 ;	-- how many falling edges ?
	begin
		num <= conv_integer(sw) ;			-- this function can change vector to integer
		if rising_edge(input) then
			upside := upside + 1 ;
			if (num MOD 2 = 1) then
				if ((upside = ((num + 1)/2)) or ((upside - ((num + 1)/2)) MOD num = 0)) then
					mid <= NOT mid ;
				end if ;
			end if ;
		elsif falling_edge(input) then
			downside := downside + 1 ;
			if ((num MOD 2 = 0) and (num>0)) then
				if (downside MOD (num/2) = 0) then
					midt <= NOT midt ;
				end if ;
			elsif (num MOD 2 = 1) then
				if (downside MOD num = 0) then
					midt <= NOT midt ;
				end if ;
			end if ;
		end if ;
		output <= mid xor midt ;
	end process ;
	
end divide ;

参考资料:
VHDL和Verilog中数组定义、初始化、赋值方法
FPGA之道(27)VHDL的操作符号
VHDL VHDL语言中buffer与inout的区别
(关于VHDL中的buffer,我以后还需要查阅专业资料进一步学习)
quartusⅡ中出现的警告及原因(不断收集中…)
VHDL vector转integer
在VHDL中,可以使用conv_integer函数将std_logic_vector类型转换成整数


继续更新,万一用户将分频系数设为0怎么办?0分频是没有意义的,我的思路是,遇到这种情况,维持原信号输出,我的代码:

library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ;
use ieee.std_logic_unsigned.all ;
use ieee.numeric_std.all ;

entity Division2 is 
	port (
		input : in std_logic ;
		sw : in std_logic_vector(3 downto 0) ;
		output : buffer std_logic
	) ;
end Division2 ;

architecture divide of Division2 is
	signal mid : std_logic := '0' ;
	signal midt : std_logic := '0' ;
	signal num : integer := 0 ;
begin
	
	process(input, sw, mid, midt)
		variable upside : integer := 0 ;	-- how many rising edges ?
		variable downside : integer := 0 ;	-- how many falling edges ?
	begin
		num <= conv_integer(sw) ;			-- this function can change vector to integer
		if num = 0 then
			mid <= input ;
			midt <= '0' ;
		else
			if rising_edge(input) then
				upside := upside + 1 ;
				if (num MOD 2 = 1) then
					if ((upside = ((num + 1)/2)) or ((upside - ((num + 1)/2)) MOD num = 0)) then
						mid <= NOT mid ;
					end if ;
				end if ;
			elsif falling_edge(input) then
				downside := downside + 1 ;
				if ((num MOD 2 = 0) and (num>0)) then
					if (downside MOD (num/2) = 0) then
						midt <= NOT midt ;
					end if ;
				elsif (num MOD 2 = 1) then
					if (downside MOD num = 0) then
						midt <= NOT midt ;
					end if ;
				end if ;
			end if ;
		end if ;
		output <= mid xor midt ;
	end process ;
	
end divide ;
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值