|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-5-5 21:51:39
|
显示全部楼层
把除法器和余数器一去,我勒个去,去掉了50%的单元。这样就是显示16进制的数。
然后有优化了一下,把状态机精简一下(只适合两位数码管),然后把查表写成一个模块,然后调用(我知道不应该在模块中使用模块,不过这样的确好用,以前写C写习惯了)。
问题基本上解决,现在只占用了30%的单元(数码管驱动只用了总量的12%,NND,那计时器用了18%),附上代码。
module seg7dirver(
clk,rst_n,
sm_cs1_n,sm_cs2_n,sm_db,
sm_data
);
input clk;
input rst_n;
input [7:0] sm_data;
output sm_cs1_n,sm_cs2_n;
output[6:0] sm_db;
reg [3:0]wei1,wei2;
reg [7:0]sm_data_r;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
sm_data_r<=0;
wei1<=0;
wei2<=0;
end
else
begin
if(sm_data_r!=sm_data)
begin
sm_data_r<=sm_data;
wei1<=sm_data;
wei2<=sm_data>>4;
end
end
reg sm_cs1_nr,sm_cs2_nr;
assign sm_cs1_n = sm_cs1_nr;
assign sm_cs2_n = sm_cs2_nr;
reg [3:0]cntds;
always @(posedge clk or negedge rst_n)
if(!rst_n)cntds<=0;
else
begin
cntds<=cntds+1;
if(cntds>9)cntds<=0;
end
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
weitemp<=0;
sm_cs1_nr<=1;
sm_cs2_nr<=1;
clk_r<=1;
end
else
begin
case(cntds)
4'd0,4'd5:
begin
sm_cs1_nr<=1;
sm_cs2_nr<=1;
clk_r<=1;
end
4'd1:
begin
weitemp<=wei1;
clk_r<=0;
sm_cs1_nr<=0;
end
4'd6:begin
weitemp<=wei2;
clk_r<=0;
sm_cs2_nr<=0;
end
default:clk_r<=1;
endcase
end
reg[4:0]weitemp;
reg clk_r;
tst trans(.wei(weitemp),
.sm_db(sm_db),
.clk(clk_r),
.rst_n(rst_r));
endmodule
/*****************************查表模块*********************************************************/
module tst(wei,sm_db,clk,rst_n);
input [3:0]wei,clk,rst_n;
output [6:0]sm_db;
reg [3:0]weidata;
reg [6:0]sm_dbr;
always @(posedge clk or negedge rst_n)
begin
weidata<=wei;
case (weidata)
4'h0: sm_dbr <= seg0;
4'h1: sm_dbr <= seg1;
4'h2: sm_dbr <= seg2;
4'h3: sm_dbr <= seg3;
4'h4: sm_dbr <= seg4;
4'h5: sm_dbr <= seg5;
4'h6: sm_dbr <= seg6;
4'h7: sm_dbr <= seg7;
4'h8: sm_dbr <= seg8;
4'h9: sm_dbr <= seg9;
4'ha: sm_dbr <= sega;
4'hb: sm_dbr <= segb;
4'hc: sm_dbr <= segc;
4'hd: sm_dbr <= segd;
4'he: sm_dbr <= sege;
4'hf: sm_dbr <= segf;
default: ;
endcase
end
parameter seg0 = 7'h3f,
seg1 = 7'h06,
seg2 = 7'h5b,
seg3 = 7'h4f,
seg4 = 7'h66,
seg5 = 7'h6d,
seg6 = 7'h7d,
seg7 = 7'h07,
seg8 = 7'h7f,
seg9 = 7'h6f,
sega = 7'h77,
segb = 7'h7c,
segc = 7'h39,
segd = 7'h5e,
sege = 7'h79,
segf = 7'h71;
assign sm_db=sm_dbr;
endmodule |
|