📄 data_source.v
字号:
/**********************************************************************************
/模块用途:用于产生数据来测试直方图均衡化模块
/模块功能:产生100行、64列数据,数据范围为1-64(8位)
/ 同时产生有效数据标志信号,在数据有效时,为高电平,否则为低电平
/时序描述:若输入时钟信号为50M,数据的时序如下所示:
/mark_cnt:0 1 2 3 ... 31 32 33 34 ... 93 94 95 96 ... 127 0 1 2 3 ... 31 32 33...
/data :0 0 0 0 ... 0 1 2 3 ... 62 63 64 0 ... 0 0 0 0 0 ... 0 1 2 ...
/data_valuable:__________|-----------|____________________________|---
/
/data_end:于第100行数据最后一个数据结束后的第14个50M周期开始为高电平,此前为低电平
/
/
/
/
/
**********************************************************************************/
module data_source(
clk50M,
rstn,
data,
data_valuable,
data_end
);
input clk50M,rstn;
output data_valuable;
output [7:0] data;
output data_end;
reg [7:0] data;
reg data_valuable;
reg data_end;
reg [6:0] mark_cnt,row_cnt;
//产生标度信号mark_cnt,其范围为0~127,循环计数。
always@(posedge clk50M or negedge rstn)
if(!rstn)
mark_cnt <= 1'b0;
else if(row_cnt != 'd101)
mark_cnt <= mark_cnt + 1'b1;
else
mark_cnt <= 1'b0;
//产生有效数据data 及有效数据标志信号data_valuable
always@(posedge clk50M or negedge rstn)
begin
if(!rstn)
begin
data_valuable <= 1'b0;
data <= 1'b0;
end
else if(mark_cnt >= 31 && mark_cnt <= 94)
begin
data_valuable <= 1'b1;
data <= data + 1'b1;
end
else
begin
data_valuable <= 1'b0;
data <= 1'b0;
end
end
//行计数器row_cnt
always@(posedge clk50M or negedge rstn)
if(!rstn)
row_cnt <= 1'b0;
else
begin
if(mark_cnt == 127)
row_cnt <= row_cnt + 1'b1;
if(row_cnt == 101)
row_cnt <= 101;
end
//全部有效数据发送结束标志信号
always@(posedge clk50M or negedge rstn)
if(!rstn)
data_end <= 1'b0;
else if(row_cnt == 101)
data_end <= 1'b1;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -