📄 control.vhd
字号:
LIBRARY IEEE; --打开库文件
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY control IS
PORT(
DSP_IS,DSP_IOSTRB,DSP_MSTRB: IN STD_LOGIC; --DSP的选通信号
DSP_DS,DSP_A7,DSP_A15,DSP_A19:IN STD_LOGIC; --DSP的地址信号
DSP_RW,DSP_PS:IN STD_LOGIC; --DSP的控制信号
DSP_D: IN STD_LOGIC_VECTOR( 2 DOWNTO 0); --DSP的数据信号
DSP_XF: IN STD_LOGIC; --DSP的控制信号
FLASH_OE: OUT STD_LOGIC; --Flash的读信号
FLASH_WE: OUT STD_LOGIC; --Flash的写信号
FLASH_CE: OUT STD_LOGIC; --Flash的片选信号
SRAM_CE: OUT STD_LOGIC; --SRAM的片选信号
HCE,HOE: OUT STD_LOGIC; --245,244的选择信号
XDC0,XDC1:OUT STD_LOGIC; --SRAM1,SRAM2的片选信号
Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --扩展页信号
--DSP_XF: IN STD_LOGIC;
CLK: IN STD_LOGIC; --外部时钟信号
RESET: IN STD_LOGIC; --外部复位信号
S1: IN STD_LOGIC;
S2: IN STD_LOGIC; --DSP发出的状态选择信号
IN_DATA: IN STD_LOGIC_VECTOR(5 DOWNTO 0); --AD数据输入
ADCLK: OUT STD_LOGIC; --AD转换时钟
ADCE1: OUT STD_LOGIC; --AD片选信号1
ADCE2: OUT STD_LOGIC; --AD片选信号2
SRAM_ADDR: OUT STD_LOGIC_VECTOR(20 DOWNTO 0); --SRAM地址信号
SRAM_CE1: OUT STD_LOGIC; --第一个SRAM的片选信号
SRAM_CE2: OUT STD_LOGIC; --第二个SRAM的片选信号
SRAM_WR: OUT STD_LOGIC; --SRAM的写信号
SRAM_OE: OUT STD_LOGIC;
OUT_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --AD数据输出
SN_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--74,273输入
READY: OUT STD_LOGIC; --向dsp发送的中断信号
D_CLK: OUT STD_LOGIC); --74,273的时钟信号
END ENTITY control;
ARCHITECTURE ONE OF control IS
--SIGNAL STATE: STD_LOGIC_VECTOR(1 DOWNTO 0); --定义状态信号
SIGNAL ADCLK_P:STD_LOGIC; --AD时钟信号
SIGNAL DCLK_P:STD_LOGIC; --D的时钟信号
SIGNAL PCLK:STD_LOGIC; --数据同步信号,便于地址同步
SIGNAL ADDR:STD_LOGIC_VECTOR(20 DOWNTO 0); --SRAM的地址产生信号
SIGNAL FLAG:STD_LOGIC; --溢出标志信号
SIGNAL H: STD_LOGIC; --地址的高位,用于SRAM的选择
SIGNAL CNTT: STD_LOGIC_VECTOR(5 DOWNTO 0); --40路的计数
SIGNAL SN1: STD_LOGIC_VECTOR( 2 DOWNTO 0); --7个4051的选择端
SIGNAL SN2: STD_LOGIC_VECTOR( 2 DOWNTO 0); --5个4051的选择端
SIGNAL M: STD_LOGIC; --电机运行的选择信号
SIGNAL N: STD_LOGIC;
SIGNAL NUM: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL OUT_DATA_P: STD_LOGIC_VECTOR(7 DOWNTO 0); --XIUGAI JIARU 4.5
SIGNAL SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P: STD_LOGIC;
SIGNAL CPLD_CS:STD_LOGIC; --CPLD的选通信号
SIGNAL CPLD_CS_IO:STD_LOGIC;
SIGNAL CPLD_CS_M:STD_LOGIC;
SIGNAL CPLD_RAMM: STD_LOGIC;
SIGNAL QQ:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
CPLD_CS<=DSP_IS OR (NOT DSP_A7);
CPLD_CS_IO<=CPLD_CS OR DSP_RW OR DSP_IOSTRB;
CPLD_CS_M<=DSP_DS OR DSP_MSTRB OR DSP_RW;
CPLD_RAMM<=DSP_XF OR DSP_PS OR DSP_MSTRB;
FLASH_OE<=DSP_MSTRB OR (NOT DSP_RW);
FLASH_WE<=DSP_MSTRB OR DSP_RW;
HCE<=DSP_MSTRB OR DSP_XF;
HOE<=NOT DSP_RW;
SRAM_CE<=DSP_DS OR DSP_A15;
FLASH_CE<=DSP_DS OR (NOT DSP_A15);
--STATE<= S2 & S1;
ADCLK<=ADCLK_P; --根据s2、s1选择状态
D_CLK<=DCLK_P;
--SRAM_ADDR<=ADDR; --XIUGAI SHANCHU 4.5
SN_DATA<=M & SN1 & M & SN2;
-- SN1<="0001"; SN2<="0000"; --测试用
adconver: PROCESS(CLK,RESET,FLAG,DSP_XF) --AD时钟产生进程
VARIABLE CNT: STD_LOGIC_VECTOR(5 DOWNTO 0); --计数进行48分频
BEGIN
IF (RESET='0' OR FLAG='1' or DSP_XF='0') THEN --复位初始化AD时钟信号、
ADCLK_P<='0';CNT:="000000"; --AD片选信号
ADCE1<='1'; ADCE2<='0';
NUM<="00";N<='0';
ELSE
IF CLK'EVENT AND CLK='1' THEN
IF (S2='0') THEN --00为读卡指令, 01为进纸指令
IF CNT>"101111" THEN CNT:="000001"; --48分频
ELSE CNT:=CNT+1;
END IF;
IF CNT>"011100" THEN ADCLK_P<='0'; --产生ADCLK
ELSE ADCLK_P<='1';
END IF;
IF NUM>"10" THEN NUM<=NUM; N<='1'; --这里计数用来延时,便于产生DCLK
ELSE NUM<=NUM+1;N<='0';
END IF;
ELSE --10双张指令,11采集完毕
CNT:="000000";ADCLK_P<='0';
NUM<="00";N<='0'; -- 进纸时间超过1S,停止采集,出错
END IF;
END IF;
ADCE1<='0'; ADCE2<='1';
END IF;
END PROCESS adconver;
sys: PROCESS(CLK,N) --DCLK、PCLK产生进程
VARIABLE NUMM: STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
IF N='0' THEN DCLK_P<='0';PCLK<='0'; --信号变量初始化
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUMM>"1011111" THEN NUMM:="0000001"; --96分频
ELSE NUMM:=NUMM+1;
END IF;
IF NUMM>"1001100" THEN --DCLK在数据稳定后出现下降沿
DCLK_P<='0';PCLK<='1'; --同时产生PCLK信号
ELSE DCLK_P<='1'; PCLK<='0';
END IF;
END IF;
END PROCESS sys;
int: process(pclk,reset,s2,s1) --DSP的中断信号产生进程
begin
if reset='0' or s2='1' then --复位初始化
cntt<="000000";ready<='0';
else
if pclk'event and pclk='1' then
if s1='0' then
if cntt<"100111" then --当计数至40时,产生READY信号
cntt<=cntt+1; ready<='0';
else cntt<="000001"; ready<='1';
end if;
else cntt<="000000"; ready<='0';
end if;
end if;
end if;
end process int;
address: PROCESS(RESET,PCLK,S1,S2,IN_DATA) --地址产生进程
BEGIN
H<=ADDR(19); --由第20位决定所选SRAM
IF (RESET='0' OR S2='1' ) THEN
ADDR<="000000000000000000000"; --复位初始化
SRAM_CE1_P<='1'; SRAM_CE2_P<='1';
FLAG<='0';SRAM_WR_P<='1';SRAM_OE_P<='0';
ELSE
IF PCLK'EVENT AND PCLK='1' THEN
-- if CPLD_RAM='1' then
IF ( S1='0') THEN --读卡指令,采集一行,至40清零
IF ADDR<"000000000000000110001" THEN
ADDR<=ADDR+1;
ELSE ADDR<="000000000000000000000";
END IF;
FLAG<='0';
ELSIF(s1='1') THEN --进纸指令,采集,地址连续递增
IF ADDR>"011111111111111111111" THEN --超过1M,溢出
FLAG<='1';ADDR<="000000000000000000000";
ELSE ADDR<=ADDR+1;FLAG<='0';
END IF;
ELSE ADDR<=(others=>'0'); FLAG<='1'; --出错或者采集完毕,地址清零
END IF;
OUT_DATA_P(7 DOWNTO 2)<=IN_DATA(5 DOWNTO 0);
OUT_DATA_P(1 DOWNTO 0)<="00";
SRAM_WR_P<='0';SRAM_OE_P<='1';
IF H='0' THEN SRAM_CE1_P<='0';SRAM_CE2_P<='1'; --H=0,选择存储器1,
ELSE SRAM_CE1_P<='1'; SRAM_CE2_P<='0'; --否则,选择存储器2
END IF;
-- else
-- ADDR<="ZZZZZZZZZZZZZZZZZZZZZ";
-- out_data<="ZZZZZZZZ";SRAM_WR<='Z';
-- SRAM_CE1<='Z';SRAM_CE2<='Z';SRAM_OE<='Z';
-- end if;
END IF;
END IF;
END PROCESS address;
puts: PROCESS(DSP_XF,SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P,ADDR,OUT_DATA_P)
BEGIN
IF DSP_XF='1' THEN
SRAM_ADDR<=ADDR;OUT_DATA<=OUT_DATA_P;
SRAM_CE1<=SRAM_CE1_P;SRAM_CE2<=SRAM_CE2_P;
SRAM_OE<=SRAM_OE_P; SRAM_WR<=SRAM_WR_P;
ELSE
SRAM_ADDR<="ZZZZZZZZZZZZZZZZZZZZZ";
OUT_DATA<="ZZZZZZZZ";SRAM_WR<='Z';
SRAM_CE1<='Z';SRAM_CE2<='Z';SRAM_OE<='Z';
END IF;
END PROCESS puts;
drive: PROCESS(RESET,S2,FLAG) --写信号、电机驱动信号进程
BEGIN
IF (RESET='0' OR S2='1' OR FLAG='1') THEN
M<='1';
ELSE
M<='0';
END IF;
END PROCESS drive;
sn: PROCESS(ADCLK_P,N) -- 4051选择信号进程
variable aa: std_logic;
BEGIN
IF (N='0') THEN
SN1<="000";SN2<="000"; aa:='0';
ELSE
IF ADCLK_P'EVENT AND ADCLK_P='1' THEN
if aa='0' then aa:='1';
IF SN2<"100" THEN
SN2<=SN2+1; SN1<=SN1;
ELSE
IF SN1<"111" THEN
SN1<=SN1+1;
ELSE SN1<="000";
END IF;
SN2<="000";
END IF;
elsif aa='1' then aa:='0';
sn2<=sn2;sn1<=sn1;
end if;
END IF;
--SN1<="000";
END IF;
END PROCESS sn;
--CPLD_RAM<=DSP_XF;
PROCESS(CPLD_RAMM,DSP_A19)
BEGIN
IF CPLD_RAMM='0' THEN
IF DSP_A19='0' THEN
XDC0<='0';XDC1<='1';
ELSE XDC0<='1';XDC1<='0';
END IF;
ELSE XDC0<='1'; XDC1<='1';
END IF;
END PROCESS;
PROCESS(CPLD_CS_IO,CPLD_CS_M,DSP_D)
BEGIN
IF CPLD_CS_IO='0' THEN
QQ<=DSP_D;
END IF;
IF CPLD_CS_M='0' THEN
Q<=QQ;
END IF;
END PROCESS;
END ONE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -