FPGA编程基础之实验程序.docx
《FPGA编程基础之实验程序.docx》由会员分享,可在线阅读,更多相关《FPGA编程基础之实验程序.docx(9页珍藏版)》请在冰豆网上搜索。
![FPGA编程基础之实验程序.docx](https://file1.bdocx.com/fileroot1/2023-3/19/57299677-7e3d-466a-b29c-5878fd34ee77/57299677-7e3d-466a-b29c-5878fd34ee771.gif)
FPGA编程基础之实验程序
目录
分频器实验:
2
1、分频倍数为2N2
2、分频倍数为偶数,但不是2N2
(1)10分频,每10个clk输出一个高脉冲。
2
(2)10分频,占空比为50%3
(3)一般偶数分频程序4
3、分频倍数为奇数5
串并-并串变换实验6
1、数字信源模块:
6
2、串并变换模块:
6
3、串并-并串顶层电路图8
4、仿真波形8
正选信号发生器实验:
9
分频器实验:
1、分频倍数为2N
例如:
32分频
--============================
--计数器(0~31)
--============================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.all;
ENTITYcounter32IS
PORT(clk:
INSTD_LOGIC;
d:
BUFFERSTD_LOGIC_VECTOR(4DOWNTO0));--进行32计数,数据类型宽度为5
ENDcounter32;
ARCHITECTUREbehavOFcounter32IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
d<=d+1;
ENDif;
ENDPROCESS;
ENDbehav;
2、分频倍数为偶数,但不是2N
例如:
10分频
(1)10分频,每10个clk输出一个高脉冲。
--================================
--10分频,每10个clk输出一个高脉冲。
--================================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
--USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpin10IS
PORT(clk:
INSTD_LOGIC;
clkout:
OUTSTD_LOGIC);
ENDfenpin10;
ARCHITECTUREbehavOFfenpin10IS
BEGIN
PROCESS(clk)
VARIABLEn:
INTEGERrange0to9:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFn<9THEN--10分频
n:
=n+1;
clkout<='0';
ELSE
n:
=0;
clkout<='1';
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehav;
(2)10分频,占空比为50%
--================================
--10分频,占空比为50%。
--================================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
--USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpin_10IS
PORT(clk:
INSTD_LOGIC;
clkout:
BUFFERSTD_LOGIC);
ENDfenpin_10;
ARCHITECTUREbehavOFfenpin_10IS
BEGIN
PROCESS(clk)
VARIABLEn:
INTEGERRANGE0to4:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFn<4THEN--10分频
n:
=n+1;
ELSE
n:
=0;
clkout<=NOTclkout;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehav;
(3)一般偶数分频程序
--================================
--i分频(i为偶数),占空比为50%。
--定义常数m,m=i/2-1
--================================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYfenpin_iIS
PORT(clk:
INSTD_LOGIC;
clkout:
BUFFERSTD_LOGIC);
ENDfenpin_i;
ARCHITECTUREbehavOFfenpin_iIS
CONSTANTm:
integer:
=4;--设置参数m=i/2-1,实现i分频
BEGIN
PROCESS(clk)
VARIABLEn:
INTEGERRANGE0tom:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFnn:
=n+1;
ELSE
n:
=0;
clkout<=NOTclkout;--i分频
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehav;
3、分频倍数为奇数
例如,7分频
mod=分频数/2+0.5=7/2+0.5=4
串并-并串变换实验
1、数字信源模块:
libraryieee;
useieee.std_logic_1164.all;
entitym_15is
port(clk:
instd_logic;
m:
outstd_logic);
endm_15;
architecturebehavofm_15is
constantm_15:
std_logic_vector(0to14):
="000111101011001";
begin
process(clk)
variablen:
integerrange0to14:
=0;
begin
ifclk'eventandclk='1'then
m<=m_15(n);
ifn=14then
n:
=0;
elsen:
=n+1;
endif;
endif;
endprocess;
endbehav;
2、串并变换模块:
--===================================
--串并变换
--1路串行码输入(m),4路并行码输出(dataout1_4[3..0])
--en为串行输入使能端,高电平有效
--oe为并行输出使能端,高电平指示输出起始时刻,持续一个时钟周期
--s用于循环计数(0,1,2,3),并串变换时有用
--====================================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYs_p_1_4IS
PORT(clk,m,en:
INSTD_LOGIC;
dataout1_4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
oe:
BUFFERSTD_LOGIC;
s:
BUFFERINTEGERRANGE0TO3);
ENDs_p_1_4;
ARCHITECTUREbehavOFs_p_1_4IS
SIGNALy:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(clk,en)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(en='0')THEN--en为串行输入使能端,高电平有效
s<=0;
ELSE
y(s)<=m;--先移入的为低位
s<=s+1;
IF(s=3)THEN
oe<='1';
ELSE
oe<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(oe)
BEGIN
IF(oe='1')THEN--oe为并行输出使能端
dataout1_4<=y;
ENDIF;
ENDPROCESSP2;
ENDbehav;
3、串并-并串顶层电路图
4、仿真波形
正选信号发生器实验:
--=============================
--正弦信号产生模块;
--输入信号:
时钟clk,使能端ena(低电平有效),输出8bit采样值编码:
s:
[7..0];
--8个采样点,量化后取值分别为0,54,76,54,0,-54,-76,-54;
--每个采样点进行8bit二进制编码;
--最高位'1'表示正数,'0'表示负数,负数用补码表示(正数取反+1)。
--==============================
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
ENTITYsinIS
PORT(clk:
INSTD_LOGIC;
ena:
INSTD_LOGIC;
s:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDsin;
ARCHITECTUREbehavOFsinIS
SIGNALn:
INTEGERRANGE0TO7;
BEGIN
PROCESS(ena,clk)
BEGIN
IFena='1'THEN
n<=0;
ELSE
IF(clk'EVENTANDclk='1')THEN
CASEnIS
WHEN0=>s<="10000000";
WHEN1=>s<="10110110";
WHEN2=>s<="11001100";
WHEN3=>s<="10110110";
WHEN4=>s<="10000000";
WHEN5=>s<="01001010";
WHEN6=>s<="00110100";
WHEN7=>s<="01001010";
ENDCASE;
n<=n+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehav;