?? 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 + -