FPGA分频电路设计(2)
2023-12-26 18:59:23
实验要求:
采用 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类型转换成整数
文章来源:https://blog.csdn.net/weixin_43638873/article/details/135184984
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!