目录
3、设置数码管显示,利用行扫描的办法,每次刷新一位阳极数据(各十百千位),快到人眼无法看见,实现显示,value实现显示每位具体的值
一、调用block ip核
在内存类型那里选择存储器类型,这次用到的是single port ROM单端口ROM,接口类型为本地
传输的数据
宽度为8,深度为20,启用端口类型为始终启用
选择文件的位置
二、代码实现部分
将生成的代码复制到文件中
1、通过按键消抖产生一个稳定的flag信号
reg [29:0] cnt_key;
wire key_flag;
always@(posedge clk)
begin
if(!rst)
cnt_key<=0;
else if(key==0)
begin
if(cnt_key==500)
cnt_key<=cnt_key;
else
cnt_key<=cnt_key+1;
end
else
cnt_key<=0;
end
assign key_flag=(cnt_key==499)?1:0;
2、传递addra地址的值
reg [4 : 0] addra;
wire [7 : 0] douta;
always@(posedge clk)
begin
if(!rst)
addra<=0;
else if(key_flag)
begin
if(addra==19)
addra<=0;
else
addra<=addra+1;
end
else
addra<=addra;
end
3、设置数码管显示,利用行扫描的办法,每次刷新一位阳极数据(各十百千位),快到人眼无法看见,实现显示,value实现显示每位具体的值
reg [29:0] cnt_hang;
reg [1:0] hang;//4行刷新显示
reg [3:0] value;//0-9显示
always@(posedge clk)
begin
if(!rst)
cnt_hang<=0;
else if(cnt_hang==5000)
cnt_hang<=0;
else
cnt_hang<=cnt_hang+1;
end
always@(posedge clk)
begin
if(!rst)
hang<=0;
else if(cnt_hang==5000)
begin
if(hang==3)
hang<=0;
else
hang<=hang+1;
end
else
hang<=hang;
end
always@(posedge clk)
begin
if(!rst)
begin
yang<=4'b0001;
value<=0;
end
else
begin
case(hang)
0:begin
yang<=4'b0001;
value<=douta%10;//个位
end
1:begin
yang<=4'b0010;
value<=douta/10%10;//十位
end
2:begin
yang<=4'b0100;
value<=douta/100%10;//百位
end
3:begin
yang<=4'b1000;
value<=douta/1000%10;//千位
end
default: begin
yang<=4'b0001;
value<=0;
end
endcase
end
end
always@(posedge clk)
begin
if(!rst)
yin<=8'b1111_1111;
else
begin
case(value)
0: yin<=8'b0100_0000;
1: yin<=8'b0111_1001;
2: yin<=8'b0010_0100;
3: yin<=8'b0011_0000;
4: yin<=8'b0001_1001;
5: yin<=8'b0001_0010;
6: yin<=8'b0010_0000;
7: yin<=8'b0111_1000;
8: yin<=8'b0000_0000;
9: yin<=8'b0001_0000;
endcase
end
end
例化ROM的数据
blk_mem_gen_0 your_instance_name (
.clka(clk), // input wire clka
.addra(addra), // input wire [4 : 0] addra
.douta(douta) // output wire [7 : 0] douta
);
Verilog初学者,欢迎各位指出问题!!!!