iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
0
自我挑戰組

Verilog 從放棄到有趣系列 第 22

[Day22]BCD計數器

  • 分享至 

  • xImage
  •  

今天要來分享BCD計數器,如果對BCD不瞭解的人可以參考一下維基百科,我們先來看一下原本1-bit加法器的構造
https://ithelp.ithome.com.tw/upload/images/20180102/20107543kIINgPilBY.png

所以如果你寫一個a = b + c的運算,會根據你的bit數去用1-bit加法器組成,

https://ithelp.ithome.com.tw/upload/images/20180102/20107543FFhuBjmhuF.png

像上圖這樣,如果是4bit的運算就會用4個加法器組起來,像上圖這樣,1-bit的加法器會包成一個module,所以今天我們要做一個BCD計數器就是要模仿加法器的做法,先做出十進位的BCD計數器去組出四位元的BCD計數器.

十進位BCD計數器:

module BCD(
  input clk,
  input rst,
  input Cin,
  output reg[3:0]sum,
  output Cout
    );
	
always@(posedge clk)begin
  if(rst)
    sum <= 0;
  else if(Cin)
    sum <= (sum == 9) ? 0 : sum+1;   
end

assign Cout = (sum == 9 & Cin);

endmodule

利用十進位BCD計數器組出從0計數到9999的BCD計數器:

module BCD_counter(
  input clk,
  input rst,
  output [15:0]result
);

genvar i;
wire Ci[3:0];
wire Co[3:0];

assign Ci[0] = 1;
assign Ci[1] = Co[0];
assign Ci[2] = Co[1];
assign Ci[3] = Co[2];

assign result = {sum[3],sum[2],sum[1],sum[0]};

wire [3:0]sum[3:0];
generate
  for(i=0;i<4;i=i+1)begin
    BCD 
    B(
      .clk(clk),
      .rst(rst),
	  .Cin(Ci[i]),
	  .sum(sum[i]),
	  .Cout(Co[i])  
    );
  end
endgenerate  

把十進位的BCD計數器複製四份,並把input output接好,包括進位等等的訊號線,接下來就能跑模擬看結果了,因為沒有其他input,所以testbench只要給clock訊號就可以work了.

https://ithelp.ithome.com.tw/upload/images/20180102/20107543QQgspctGyV.jpg


上一篇
[Day21]插入排序法
下一篇
[Day23] generate
系列文
Verilog 從放棄到有趣30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言