⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrl_rom.v

📁 用SmartGen生成一个256*8的大小同步FIFO
💻 V
字号:
// ctrl_ROM.v
/************** ctrl_ROM.v***************************
**模块名称:ctrl_ROM
**功能描述:ROM的读控制,及发数据到上位机校验
****************************************************/

module ctrl_ROM(key,clk,TI,sendwr,rst,Raddress);
//--input------------------------------
input           key;   //按键输入,产生串口发送使能
input           clk;   //系统同步时钟
input           TI;    //串口发送数据,TI = 0,表示正在发送数据;
                       //------------  TI = 1,表示等待发送数据或发送数据完毕;
//--output--------------------------------
output          sendwr;    //(从RAM读数据后)写数据到发送缓存区的使能标志
output          rst;       //指示信号,key输入电平切换指示
output [6:0]    Raddress;  //读RAM的地址

//--中间变量声明-----------------------------
reg [6:0] Raddress;

reg       rst_reg;               //指示信号寄存器--

wire      key_negedge;            //按键的下降沿
reg       key_buff;               //键值缓存

wire      rst_posedge;           //指示信号的上升沿
reg       rst_buff;              //指示电平缓存--

wire      sendclk;               //发送时钟
reg[15:0] sendclkdiv;           //发送时钟分频计数器

wire      TI_posedge;           //发送标志上升沿
reg       TI_buff;              //发送标志缓存
reg       rd_en;
//------------------------------------------

//--锁存键值----------------
always@( posedge clk)
begin
  key_buff <= key;    
end
assign key_negedge = key_buff & (~key);  //取键值的下降沿,该电平的宽度在一个clk周期以内

//--产生复位信号,将琴键开关转换为乒乓开关
//--即保持一个电平输出,直到下一次按键按下
always@(posedge clk)
begin
  if(key_negedge)
    rst_reg <=~rst_reg;
end
assign rst = rst_reg;                  //将指示信号赋给输出端口

//========================================================
//读地址控制程序
//========================================================

always@(posedge clk)
begin
   rst_buff <= rst_reg;
end

always@(posedge clk)
begin
    TI_buff <= TI;
end
assign TI_posedge = (TI) & (~TI_buff);       //取发送标志的上升沿
assign rst_posedge = rst_reg & (~rst_buff);  //取复位信号的上升沿


always@(posedge clk)
begin
  if(rst_posedge)        //复位信号上升沿
    begin
      Raddress <= 0;     //读读地址清0
      rd_en = 1;
    end
  else 
    if(TI_posedge)       //发送表示上升沿,将读指针指向下一个地址
      begin
        if(Raddress < 127)
          begin
            Raddress <= Raddress+1;
            rd_en = 1;
          end
        else
          rd_en = 0;
      end
end
//================================================
//产生发送数据使能信号sendwr,该信号高电平有效
//================================================
assign sendclk = (sendclkdiv == 16'd65535);
always@(posedge clk)   //对clk分频
begin
  if(sendclk)
    sendclkdiv = 0;
  else 
    sendclkdiv = sendclkdiv + 16'd1;
end

//--产生sendwr信号,通过按键KEY的切换产生沿信号,产生发送使能信号
assign sendwr = rd_en & sendclk;  

//=======================================================               

endmodule


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -