📄 ceshi3.vhd
字号:
LIBRARY IEEE; --打开库文件
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY Ceshi3 IS
PORT( DSP_XF1: 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 Ceshi3;
ARCHITECTURE ONE OF Ceshi3 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;
BEGIN
--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_XF1) --AD时钟产生进程
VARIABLE CNT: STD_LOGIC_VECTOR(5 DOWNTO 0); --计数进行48分频
BEGIN
IF (RESET='0' OR FLAG='1' or DSP_XF1='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 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在数据稳定后出现下降沿
PCLK<='1'; --同时产生PCLK信号
ELSE 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) --地址产生进程
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 ( 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;
END IF;
END IF;
END PROCESS address;
puts: PROCESS(DSP_XF1,SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P,ADDR,OUT_DATA_P)
BEGIN
IF DSP_XF1='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;
END ONE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -