本实验用的开发板是野火的开发板,用的是EP4CE10F17C8这个芯片,还有两片74HC595芯片和一个六位八段的数码管。
一、整体的结构框图

二、单个模块结构框图和时序图


三、数据生成模块的代码
module data_gen(
input wire clk ,
input wire rst_n ,
output reg [19:0] data ,
output wire [5:0] point ,
output wire sign ,
output reg seg_en
);
parameter time_100ms = 4999_999 ;
parameter datamax = 999_999 ;
assign point = 6'b000_010 ; //不显示小数点
assign sign = 1'b0 ;///不显示负数
reg [23:0] cnt_100ms ;
//0.1s计数器
always @ (posedge clk, negedge rst_n)
begin
if(~rst_n)
cnt_100ms <= 24'd0;
else if(cnt_100ms == time_100ms )
cnt_100ms <= 24'd0 ;
else
cnt_100ms <= cnt_100ms + 1;
end
//data 显示数据 0-999_999
always @ (posedge clk ,negedge rst_n)
begin
if(~rst_n)
data <= 1'b0;
else if( data == datamax && cnt_100ms == time_100ms)
data <= 1'b0 ;
else if(cnt_100ms == time_100ms)
data <= data + 1 ;
else
data <= data ;
end
//seg_en
always @ (posedge clk,negedge rst_n)
begin
if(~rst_n)
seg_en <= 0 ;
else
seg_en <= 1 ;
end
endmodule
四、数码管解析模块(核心)

3.1bcd8421时序图和程序设计

3.2程序设计
module bcd_8421(
input wire clk ,
input wire rst_n ,
input wire[19:0] data ,
output reg [3:0] unit ,
output reg [3:0] ten ,
output reg [3:0] hun ,
output reg [3:0] tho ,
output reg [3:0] wan ,
output reg [3:0] shiwan
);
reg [4:0] cnt_shift ;//移位计数器
reg [43:0] data_shift ; //移位判断寄存器
//判断信号先,移位计数后
reg shift_flag ;
//cnt_shift
always @ (posedge clk ,negedge rst_n)
begin
if(~rst_n)
cnt_shift <= 0;
else if(cnt_shift == 5'd21 && shift_flag == 1'b1 )
cnt_shift <= 0 ;
else if(shift_flag == 1 )
cnt_shift <= cnt_shift +1;
else
cnt_shift <= cnt_shift ;
end
//data_shift 移位判断寄存器
always @ (posedge clk ,negedge rst_n)
begin
if(~rst_n)
data_shift <= data_shift ;
else if( cnt_shift == 5'd0 )
data_shift <= {24'b0, data}; //{ data_shift[40],data_shift[39],data_shift[38],,,data_shift[0]]}
else if(shift_flag == 0 && cnt_shift <= 20)
begin
data_shift[23:20] <= { data_shift[23:20] >4? (data_shift[23:20]+2'd3):(data_shift[23:20])};//提取unit
data_shift[27:24] <= { data_shift[27:24] >4? (data_shift[27:24]+2'd3):(data_shift[27:24])};//提取ten
data_shift[31:28] <= { data_shift[31:28] >4? (data_shift[31:28]+2'd3):(data_shift[31:28])};//提取hun
data_shift[35:32] <= { data_shift[35:32] >4? (data_shift[35:32]+2'd3):(data_shift[35:32])};//提取tho
data_shift[39:36] <= { data_shift[39:36] >4? (data_shift[39:36]+2'd3):(data_shift[39:36])};//提取wan
data_shift[43:40] <= { data_shift[43:40] >4? (data_shift[43:40]+2'd3):(data_shift[43:40])};//提取shiwan
end
else if(cnt_shift <= 20 && shift_flag== 1 )
data_shift <= data_shift << 1 ;
else
data_shift <= data_shift;
end
//shift_flag
always @ (posedge clk,negedge rst_n)
begin
if(~rst_n)
shift_flag <= 0 ;
else
shift_flag <= ~shift_flag ;
end
// 当计数器等于20时,移位判断操作完成,对各个位数的BCD 码进行赋值
always @ (posedge clk,negedge rst_n)
begin
if(~rst_n)
begin
unit <= 4'b0 ;
ten <= 4'b0 ;
hun <= 4'b0 ;
tho <= 4'b0 ;
wan <= 4'b0 ;
shiwan <= 4'b0 ;
end
else if(cnt_shift == 5'd21)
begin
unit <= data_shift[23:20] ;
ten <= data_shift[27:24] ;
hun <= data_shift[31:28] ;
tho <= data_shift[35:32] ;
wan <= data_shift[39:36] ;
shiwan <= data_shift[43:40] ;
end
end
/*
//假设 data == 123456 ;
assign unit = data % 10 ;
assign ten = (data /20'd10)%10 ;
assign hun = (data /20'd100)%10 ;
assign tho = (data /20'd1000)%10 ;
assign wan = (data /20'd10000)%10 ;
assign shiwan = data /20'd100000 ;
*/
endmodule
1万+

被折叠的 条评论
为什么被折叠?



