




免费预览已结束,剩余3页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
- VHDL SD card interface- by Steven J. Merrifield, June 2008- Reads and writes a single block of data, and also writes continuous data- Tested on Xilinx Spartan 3 hardware, using Transcend and SanDisk Ultra II cards- Read states are derived from the Apple II emulator by Stephen Edwards library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity sd_controller isport ( cs : out std_logic; mosi : out std_logic; miso : in std_logic; sclk : out std_logic; rd : in std_logic; wr : in std_logic; dm_in : in std_logic; - data mode, 0 = write continuously, 1 = write single block reset : in std_logic; din : in std_logic_vector(7 downto 0); dout : out std_logic_vector(7 downto 0); clk : in std_logic - twice the SPI clk);end sd_controller;architecture rtl of sd_controller istype states is ( RST, INIT, CMD0, CMD55, CMD41, POLL_CMD, IDLE, - wait for read or write pulse READ_BLOCK, READ_BLOCK_WAIT, READ_BLOCK_DATA, READ_BLOCK_CRC, SEND_CMD, RECEIVE_BYTE_WAIT, RECEIVE_BYTE, WRITE_BLOCK_CMD, WRITE_BLOCK_INIT, - initialise write command WRITE_BLOCK_DATA, - loop through all data bytes WRITE_BLOCK_BYTE, - send one byte WRITE_BLOCK_WAIT - wait until not busy);- one start byte, plus 512 bytes of data, plus two FF end bytes (CRC)constant WRITE_DATA_SIZE : integer := 515;signal state, return_state : states;signal sclk_sig : std_logic := 0;signal cmd_out : std_logic_vector(55 downto 0);signal recv_data : std_logic_vector(7 downto 0);signal address : std_logic_vector(31 downto 0);signal cmd_mode : std_logic := 1;signal data_mode : std_logic := 1;signal response_mode : std_logic := 1;signal data_sig : std_logic_vector(7 downto 0) := x00;begin process(clk,reset) variable byte_counter : integer range 0 to WRITE_DATA_SIZE; variable bit_counter : integer range 0 to 160; begin data_mode = dm_in; if rising_edge(clk) then if (reset=1) then state = RST; sclk_sig sclk_sig = 0; cmd_out 1); address = x00000000; byte_counter := 0; cmd_mode = 1; - 0=data, 1=command response_mode = 1; - 0=data, 1=command bit_counter := 160; cs = 1; state - CS=1, send 80 clocks, CS=0 if (bit_counter = 0) then cs = 0; state = CMD0; else bit_counter := bit_counter - 1; sclk_sig cmd_out = xFF400000000095; bit_counter := 55; return_state = CMD55; state cmd_out = xFF770000000001; - 55d OR 40h = 77h bit_counter := 55; return_state = CMD41; state cmd_out = xFF690000000001; - 41d OR 40h = 69h bit_counter := 55; return_state = POLL_CMD; state if (recv_data(0) = 0) then state = IDLE; else state if (rd = 1) then state = READ_BLOCK; elsif (wr=1) then state = WRITE_BLOCK_CMD; else state cmd_out = xFF & x51 & address & xFF; bit_counter := 55; return_state = READ_BLOCK_WAIT; state if (sclk_sig=1 and miso=0) then state = READ_BLOCK_DATA; byte_counter := 511; bit_counter := 7; return_state = READ_BLOCK_DATA; state = RECEIVE_BYTE; end if; sclk_sig if (byte_counter = 0) then bit_counter := 7; return_state = READ_BLOCK_CRC; state = RECEIVE_BYTE; else byte_counter := byte_counter - 1; return_state = READ_BLOCK_DATA; bit_counter := 7; state bit_counter := 7; return_state = IDLE; address = std_logic_vector(unsigned(address) + x200); state if (sclk_sig = 1) then if (bit_counter = 0) then state = RECEIVE_BYTE_WAIT; else bit_counter := bit_counter - 1; cmd_out = cmd_out(54 downto 0) & 1; end if; end if; sclk_sig if (sclk_sig = 1) then if (miso = 0) then recv_data 0); if (response_mode=0) then bit_counter := 3; - already read bits 7.4 else bit_counter := 6; - already read bit 7 end if; state = RECEIVE_BYTE; end if; end if; sclk_sig if (sclk_sig = 1) then recv_data = recv_data(6 downto 0) & miso; if (bit_counter = 0) then state = return_state; dout = recv_data(6 downto 0) & miso; else bit_counter := bit_counter - 1; end if; end if; sclk_sig cmd_mode = 1; if (data_mode = 0) then cmd_out = xFF & x59 & address & xFF; - continuous else cmd_out = xFF & x58 & address & xFF; - single block end if; bit_counter := 55; return_state = WRITE_BLOCK_INIT; state cmd_mode = 0; byte_counter := WRITE_DATA_SIZE; state if byte_counter = 0 then state = RECEIVE_BYTE_WAIT; return_state = WRITE_BLOCK_WAIT; response_mode = 0; else if (byte_counter = 2) or (byte_counter = 1) then data_sig = xFF; - two CRC bytes elsif byte_counter = WRITE_DATA_SIZE then if (data_mode=0) then data_sig = xFC; - start byte, multiple blocks else data_sig = xFE; - start byte, single block end if; else - just a counter, get real data here data_sig = std_logic_vector(to_unsigned(byte_counter,8); end if; bit_counter := 7; state if (sclk_sig = 1) then if bit_counter=0 then state = WRITE_BLOCK_DATA; else data_sig = data_sig(6 downto 0) & 1; bit_counter := bit_counter - 1; end if; end if; sclk_sig response_mode = 1; if sclk_sig=1 then if MISO=1 then if (data_mode=0) then state = WRITE_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年企业安全管理能力测评试题(附答案)
- (2025)特种设备安全管理人员安全考核考试题库及答案
- 考试护士心血管护理题及答案
- 超声设备考试题库及答案
- 章丘高三联考试卷及答案
- 火币交易课件
- 2025拖育综合服务中心建设项目合同模板
- 2025年中国消防安全管理与职责能力测评试题(附答案)
- 2025年高处作业高处安装、维护、拆除作业模拟试题及答案
- 健康保险学考试题及答案
- 火灾调查第四章-火灾痕迹物证课件
- 大型医院耗材管理SPD系统
- 精选提高脑卒中偏瘫患者良肢位摆放的正确率品管圈讲义
- 大金龙纯电动车hvcm及bms外网协议
- GB/T 8295-2008天然橡胶和胶乳铜含量的测定光度法
- GB/T 19960.1-2005风力发电机组第1部分:通用技术条件
- 生产作业管理讲义
- 二年级上册《树之歌》优秀课件
- 锅炉安全技术规程
- 初中音乐《快乐的女战士》《水草舞》课件
- 易制毒化学品岗位责任制度
评论
0/150
提交评论