📄 ctrl_rom.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 + -