📄 arm+fpga.txt
字号:
#include "config.h"
#include "math.h"
#define PIN_21 0x200000
#define CLR 0xffffff
#define BEEPCON (1<<7)//0x00000080
#define sel0 (1<<8) //p3.8
#define sel1 (1<<9) //p3.9
#define sel2 (1<<10)//p3.10
#define clr (1<<11)//p3.11
#define SPUL (1<<12)//p3.12
#define CL (1<<13)//p3.13
#define START (1<<14)//p3.14
#define EEND (1<<15)//p3.15
#define YEJI 0xf0
#define E 0x200
#define RS 0x80
#define RW 0x100
#define PSB 0x40000
#define RES 0x80000
#define PB 0xdffff
#define PD 0x10000
#define WY 0x3fc00
#define M 0x6d //MHZ的简写//
#define K 0x6b //KHZ的简写//
#define h 0x68 //HZ 的简写//
#define ns 0x6e
#define us 0x75
#define s 0x73
const uint8 qing[]={0x34,0x30,0x30,0x06,0x0c,0x34} ;/*画图命令*/
const uint8 song[]={0x30,0x31,0x80,0x40,0x0c} ;/*字库命令*/
void dely(uint32 dly) //延时函数。
{uint32 i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);}
void caizhi(uint32 x,uint8 c[])//将X的整数按位放入C[]中。
{uint32 u;
uint32 ii;
uint32 iii;
for(ii=0;ii<8;ii++)
{
switch(ii)
{case 0:
{iii = 10000000;}break;
case 1:
{iii = 1000000;}break;
case 2:
{iii = 100000;}break;
case 3:
{iii = 10000;}break;
case 4:
{iii = 1000;}break;
case 5:
{iii = 100;}break;
case 6:
{iii = 10;} break;
case 7:
{iii = 1;}break;
default:break;}
u = x/iii;
c[ii] = u;
u = x;
u = u%iii;
x = u;
}}
void delay(void) //短延时函数。
{uint32 i;
for(i=0;i<500;i++);}
void fasong(uint32 data) //发送数据到LCD中。
{ uint32 da;
uint32 ys;
IO2DIR = PB;
for(ys=100;ys>0;ys--);
while(IO2PIN&PD!=0);
IO2DIR = 0xfffff;
da = data<<10;
da = da&WY;
IO2SET = RS;
delay();
IO2CLR = RW;
delay();
IO2CLR = WY;
IO2SET = da;
delay();
IO2SET = E;
delay();
IO2CLR = E;}
void fasong1(uint32 zhidu) //发送命令到LCD中。
{uint32 da1;
IO2DIR = PB;
delay();
while(IO2PIN&PD!=0);
IO2DIR = 0xfffff;
da1 = zhidu<<10;
da1 = da1&WY;
IO2CLR = RS;
delay();
IO2CLR = RW;
delay();
IO2CLR = WY;
IO2SET = da1;
delay();
IO2SET = E;
delay();
IO2CLR = E;
}
void Uint(uint8 x,uint8 tit[])//发送单位//
{if(x==0){fasong(tit[0]);fasong(0x68);fasong(0x7a);}
else {fasong(tit[1]);fasong(0x73);}}
void dao1(fp32 a[],uint8 tit[],uint8 tiit[])//发送频率,周期的数据//
{uint8 i;
uint8 x;
uint8 order;
uint8 y[8];
IO2DIR=0xfffff; //设置P2口全为输出//
IO2CLR =0xffffffff; //清0P2全为0输出//
IO2CLR = RES;
delay();
IO2SET = RES;
delay();
IO2SET = PSB;
delay();
for(i=0;i<6;i++) //发送画图命令//
{fasong1(qing[i]);
delay();}
for(i=0;i<4;i++)
{fasong1(song[i]);
delay();}
fasong1(0x80);
fasong(0x46);
fasong(0x3a);
fasong1(0x90);
fasong(0x54);
fasong(0x3a);
for(x=0;x<2;x++)
{caizhi(a[x],y);
if(x==0)fasong1(0x81);
else fasong1(0x91);
for(i=0;i<8;i++)
{switch(y[i])
{case 0:
{fasong(0x30);}break;
case 1:
{fasong(0x31);}break;
case 2:
{fasong(0x32);}break;
case 3:
{fasong(0x33);}break;
case 4:
{fasong(0x34);}break;
case 5:
{fasong(0x35);}break;
case 6:
{fasong(0x36);}break;
case 7:
{fasong(0x37);}break;
case 8:
{fasong(0x38);}break;
case 9:
{fasong(0x39);}break;
default:break;}
if(x==0){if(tiit[0]==(i+1))fasong(0x2e);}
else if(x==1){if(tiit[1]==(i+1))fasong(0x2e);}}
Uint(x,tit);}
fasong1(0x30);}
kc(fp32 x,uint8 pd,uint8 tit[],uint8 tiit[]) //单位转化函数//
{
if(x<0.1){x=x*1000000000;tit[1]=ns;tiit[1]=2;}
else if(x<1){x=x*100000000;if(pd==0) {tit[0]=h;tiit[0]=1;}
else {tit[1]=ns;tiit[1]=3;}}
else if(x<10){x=x*10000000;if(pd==0) {tit[0]=h;tiit[0]=1;}
else {tit[1]=us;tiit[1]=1;}}
else if(x<100){x=x*1000000;if(pd==0) {tit[0]=h;tiit[0]=2;}
else {tit[1]=us;tiit[1]=2;}}
else if(x<1000){x=x*100000;if(pd==0) {tit[0]=h;tiit[0]=3;}
else {tit[1]=us;tiit[1]=3;}}
else if(x<10000){x=x*10000;if(pd==0) {tit[0]=K;tiit[0]=1;}
else {tit[1]=us;tiit[1]=4;}}
else if(x<100000){x=x*1000;if(pd==0) {tit[0]=K;tiit[0]=2;}
else {tit[1]=us;tiit[1]=5;}}
else if(x<1000000){x=x*100;if(pd==0) {tit[0]=K; tiit[0]=3;}
else {tit[1]=us;tiit[1]=6;}}
else if(x<10000000){x=x*10;if(pd==0) {tit[0]=M; tiit[0]=1;}
else {tit[1]=s; tiit[1]=1;}}
else if(pd==0) {tit[0]=M; tiit[0]=2;}
else {tit[1]=s;tiit[0]=2;}
return(x);}
dao(uint8 addx) //从FPGA中取数据函数//
{uint32 zc;
uint32 Ns;
IO3DIR=(clr|sel2|sel1|sel0);
IO3CLR=(sel2|sel1|sel0);
switch(addx)
{ case 0:{ zc=IO3PIN&0xff;
zc=zc<<24;
Ns=Ns|zc;
IO3SET=sel0;
zc=IO3PIN&0xff;
zc=zc<<16;
Ns=Ns|zc;
IO3CLR=sel0;
IO3SET=sel1;
zc=IO3PIN&0xff;
zc=zc<<8;
Ns=Ns|zc;
IO3SET=sel0;
IO3SET=sel1;
zc=IO3PIN&0xff;
Ns=Ns|zc;}break;
case 1:{ IO3CLR=sel0;
IO3CLR=sel1;
IO3SET=sel2;
zc=IO3PIN&0xff;
zc=zc<<24;
Ns=Ns|zc;
IO3SET=sel2;
IO3SET=sel0;
zc=IO3PIN&0xff;
zc=zc<<16;
Ns=Ns|zc;
IO3CLR=sel0;
IO3SET=sel1;
IO3SET=sel2;
zc=IO3PIN&0xff;
zc=zc<<8;Ns=Ns|zc;
IO3SET=sel0;
IO3SET=sel1;
IO3SET=sel2;
zc=IO3PIN&0xff;
Ns=Ns|zc;};break;
default:break;}
return(Ns);}
void pl(void)//测频开始函数//
{fp32 Ns;
fp32 Nx;
fp32 Fx;
fp32 period;
fp32 a[2];
uint8 tit[2];
uint8 tiit[2];
IO3DIR=(SPUL|CL|clr);
IO3SET=SPUL;
IO3SET=CL;
while(IO3PIN&START==0);
dely(650);
IO3CLR=CL;
while(IO3PIN&START==1);
dely(10);
Ns=dao(0);
Nx=dao(1);
Fx=30000000/Ns;
Fx=Fx*Nx;
period=1000000/Fx;//微秒//
Fx=kc(Fx,0,tit,tiit);
period=kc(period,1,tit,tiit);
a[0]=Fx;
a[1]=period;
dao1(a,tit,tiit);}
int main()
{PINSEL0 = 0x00000000;
IO0DIR = BEEPCON;
IO0CLR = 0xfffff;
IO3DIR=(SPUL|CL|clr);
IO3CLR=CLR;
IO3CLR=START;
while(1)
{IO0SET = BEEPCON;
dely(100);
IO0CLR = BEEPCON;
dely(100);
if((PIN_21&IO0PIN)==0)//键判断//
{IO3SET=clr;//FPGA清理
delay();
IO3CLR=clr;
pl();
delay();
while((PIN_21&IO0PIN)==0);//键判断//
delay();
}}
return(0);}
********************************************************************************
LIBRARY IEEE; -- 2003/7/21 GWDVPB
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY pingliji IS
PORT (CLK0 : IN STD_LOGIC; --CLOCK0 标准频率时钟信号
TCLK : IN STD_LOGIC; --PIO27 待测频率时钟信号
CLR : IN STD_LOGIC; --PIO0 清零和初始化信号
CL : IN STD_LOGIC; --PIO1 当SPUL为高电平时,CL为预置门控信号,用于测频计数时间控制
--当SPUL为低电平时,CL为测脉宽控制信号,CL高电平时测高电平脉宽
--而当CL为低电平时,测低电平脉宽。
SPUL : IN STD_LOGIC; --PIO2 测频或测脉宽控制
START : OUT STD_LOGIC; --PIO2
EEND : OUT STD_LOGIC; --PIO3 由低电平变到高电平时指示脉宽计数结束,
SEL : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --PIO6/PIO5/PIO4
--两个32位计数器计数值分8位读出多路选择控制
DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --PIO8/9/10/11/12/13/14/15 8位数据读出
CONT : OUT STD_LOGIC --计数分频
);
END ;
ARCHITECTURE behav OF pingliji IS
SIGNAL BZQ : STD_LOGIC_VECTOR(31 DOWNTO 0); --标准计数器
SIGNAL TSQ : STD_LOGIC_VECTOR(31 DOWNTO 0); --测频计数器
SIGNAL ENA : STD_LOGIC; -- 计数使能
SIGNAL CNT : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL LL : STD_LOGIC;
SIGNAL MA : STD_LOGIC;
SIGNAL CLK1,CLK4 : STD_LOGIC;
SIGNAL CLK2 : STD_LOGIC;
SIGNAL CLK3 : STD_LOGIC;
SIGNAL Q1 : STD_LOGIC;
SIGNAL Q2 : STD_LOGIC;
SIGNAL Q3 : STD_LOGIC;
SIGNAL BENA : STD_LOGIC;
SIGNAL PUL : STD_LOGIC; --脉宽计数使能
SIGNAL Q : STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL SS : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
START <= ENA ;
DATA <= BZQ(31 DOWNTO 24) WHEN SEL = "000" ELSE -- 标准频率计数低8位输出
BZQ(23 DOWNTO 16) WHEN SEL = "001" ELSE
BZQ(15 DOWNTO 8) WHEN SEL = "010" ELSE
BZQ(7 DOWNTO 0) WHEN SEL = "011" ELSE -- 标准频率计数最高8位输出
TSQ(31 DOWNTO 24) WHEN SEL = "100" ELSE --待测频率计数值最低8位输出
TSQ(23 DOWNTO 16) WHEN SEL = "101" ELSE
TSQ(15 DOWNTO 8) WHEN SEL = "110" ELSE
TSQ(7 DOWNTO 0) WHEN SEL = "111" ELSE --待测频率计数值最高8位输出
TSQ(7 DOWNTO 0) ;
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
BZH : PROCESS(CLK0, CLR) --标准频率测试计数器,标准计数器
BEGIN
IF CLR = '1' THEN BZQ <= ( OTHERS=>'0' ) ;
ELSIF CLK0'EVENT AND CLK0 = '1' THEN
IF BENA = '1' THEN BZQ <= BZQ + 1;
END IF;
END IF;
END PROCESS;
-- gggggggggggggggggggggggggggggggggggggggggggggggggggg
TF : PROCESS(TCLK, CLR, ENA) --待测频率计数器,测频计数器
BEGIN
IF CLR = '1' THEN TSQ <= ( OTHERS=>'0' );
ELSIF TCLK'EVENT AND TCLK = '1' THEN
IF ENA = '1' THEN TSQ <= TSQ + 1;
END IF;
END IF;
END PROCESS;
--FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
PROCESS(TCLK,CLR) --计数控制使能触发器,CL为预置门控信号,同时兼作正负脉宽测试控制信号
BEGIN
IF CLR = '1' THEN ENA <= '0' ;
ELSIF TCLK'EVENT AND TCLK = '1' THEN
ENA <= CL ;
END IF;
END PROCESS;
--OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
MA <= (TCLK AND CL) OR NOT(TCLK OR CL) ; --测脉宽逻辑
CLK1 <= NOT MA ;
CLK2 <= MA AND Q1 ;
CLK3 <= NOT CLK2 ;
SS <= Q2 & Q3 ;
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
DD1: PROCESS(CLK1,CLR)
BEGIN
IF CLR = '1' THEN Q1 <= '0' ;
ELSIF CLK1'EVENT AND CLK1 = '1' THEN Q1 <= '1' ;
END IF;
END PROCESS;
DD2: PROCESS(CLK2,CLR)
BEGIN
IF CLR = '1' THEN Q2 <= '0' ;
ELSIF CLK2'EVENT AND CLK2 = '1' THEN Q2 <= '1' ;
END IF;
END PROCESS;
DD3: PROCESS(CLK3,CLR)
BEGIN
IF CLR = '1' THEN Q3 <= '0' ;
ELSIF CLK3'EVENT AND CLK3 = '1' THEN Q3 <= '1' ;
END IF;
END PROCESS;
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
GT :
PUL <= '1' WHEN SS = "10" ELSE --当SS=“10”时,PUL高电平,允许标准计数器计数,
'0' ; --禁止计数
EEND <= '1' WHEN SS = "11" ELSE --EEND为低电平时,表示正在计数,由低电平变到高电平
'0' ; --时,表示计数结束,可以从标准计数器中读数据了
--UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
BENA <= ENA WHEN SPUL = '1' ELSE --标准计数器时钟使能控制信号,当SPUL为1时,测频率
PUL WHEN SPUL = '0' ELSE --当SPUL为0时,测脉宽和占空比
PUL ;
--UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
PROCESS(CLK0)
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN Q<=Q+1; IF Q="1111111" THEN Q<="0000000";
LL<=NOT LL;
END IF;
END IF;
END PROCESS;
CONT<=LL;
END behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -