)
本实验用的开发板是野火的开发板用的是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 6b000_010 ; //不显示小数点assign sign 1b0 ;///不显示负数reg [23:0] cnt_100ms ;//0.1s计数器always (posedge clk, negedge rst_n)beginif(~rst_n)cnt_100ms 24d0;else if(cnt_100ms time_100ms )cnt_100ms 24d0 ;elsecnt_100ms cnt_100ms 1;end//data 显示数据 0-999_999always (posedge clk ,negedge rst_n)beginif(~rst_n)data 1b0;else if( data datamax cnt_100ms time_100ms)data 1b0 ;else if(cnt_100ms time_100ms)data data 1 ;elsedata data ;end//seg_enalways (posedge clk,negedge rst_n)beginif(~rst_n)seg_en 0 ;elseseg_en 1 ;endendmodule四、数码管解析模块核心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_shiftalways (posedge clk ,negedge rst_n)beginif(~rst_n)cnt_shift 0;else if(cnt_shift 5d21 shift_flag 1b1 )cnt_shift 0 ;else if(shift_flag 1 )cnt_shift cnt_shift 1;elsecnt_shift cnt_shift ;end//data_shift 移位判断寄存器always (posedge clk ,negedge rst_n)beginif(~rst_n)data_shift data_shift ;else if( cnt_shift 5d0 )data_shift {24b0, data}; //{ data_shift[40],data_shift[39],data_shift[38],,,data_shift[0]]}else if(shift_flag 0 cnt_shift 20)begindata_shift[23:20] { data_shift[23:20] 4? (data_shift[23:20]2d3):(data_shift[23:20])};//提取unitdata_shift[27:24] { data_shift[27:24] 4? (data_shift[27:24]2d3):(data_shift[27:24])};//提取tendata_shift[31:28] { data_shift[31:28] 4? (data_shift[31:28]2d3):(data_shift[31:28])};//提取hundata_shift[35:32] { data_shift[35:32] 4? (data_shift[35:32]2d3):(data_shift[35:32])};//提取thodata_shift[39:36] { data_shift[39:36] 4? (data_shift[39:36]2d3):(data_shift[39:36])};//提取wandata_shift[43:40] { data_shift[43:40] 4? (data_shift[43:40]2d3):(data_shift[43:40])};//提取shiwanendelse if(cnt_shift 20 shift_flag 1 )data_shift data_shift 1 ;elsedata_shift data_shift;end//shift_flagalways (posedge clk,negedge rst_n)beginif(~rst_n)shift_flag 0 ;elseshift_flag ~shift_flag ;end// 当计数器等于20时移位判断操作完成对各个位数的BCD 码进行赋值always (posedge clk,negedge rst_n)beginif(~rst_n)beginunit 4b0 ;ten 4b0 ;hun 4b0 ;tho 4b0 ;wan 4b0 ;shiwan 4b0 ;endelse if(cnt_shift 5d21)beginunit 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] ;endend/*//假设 data 123456 ;assign unit data % 10 ;assign ten (data /20d10)%10 ;assign hun (data /20d100)%10 ;assign tho (data /20d1000)%10 ;assign wan (data /20d10000)%10 ;assign shiwan data /20d100000 ;*/endmodule