FPGA大作業(yè)實驗報告
本實驗報告分為實驗?zāi)繕?biāo),設(shè)計概述,細(xì)節(jié)詳述,常見問題分析,總結(jié),完整代碼等部分。
實驗?zāi)繕?biāo)
- 實驗基本要求
設(shè)計一個簡單的自動售飲料機(jī)的邏輯電路。它的投幣口每次只能投入一枚五角或一元的硬幣。投入一元五角錢硬幣后機(jī)器自動給出一杯飲料。投入兩元(兩枚一元)硬幣后,在給出飲料的同時找出一枚五角的硬幣。 - 實驗擴(kuò)展要求
用數(shù)碼管顯示輸入的金額,以及要找出的金額。
多物價系統(tǒng)。具體要求如下:
兩個按鈕,表示5角硬幣和1元硬幣。
可無限投入硬幣,數(shù)碼管動態(tài)顯示當(dāng)前金額(帶小數(shù))。
3個按鈕,代表3種飲料:可口可樂2元,午后紅茶3.5元,烏龍茶3元。
每種飲料初始存貨各5罐。
當(dāng)按下某種飲料按鈕后,如果投入錢幣金額足夠,則減去相應(yīng)的金額,并以數(shù)碼管顯示應(yīng)找的錢幣數(shù)目;如果不夠,顯示飲料價格并閃動,持續(xù)2秒,然后仍然顯示當(dāng)前金額;如果飲料數(shù)目不夠,用數(shù)碼管顯示。當(dāng)按下退幣按鈕后,顯示應(yīng)找的錢幣數(shù)目。
設(shè)計概述
代碼結(jié)構(gòu)主要用了模塊分解和函數(shù)復(fù)用的思想,雖然這是老生常談的內(nèi)容,但只有在實踐的過程中(一次次debug中)才發(fā)現(xiàn)他們?nèi)绱酥匾?/p>
模塊分解
一開始編寫大作業(yè)的時候,因為Verilog里面并行的特性,想到什么功能就寫一段代碼,加一個always塊。結(jié)果在debug的時候萬分痛苦,在代碼之間跳來跳去。
因此我后來把功能做了分塊處理,一個功能就在一個大的always的代碼塊里面實現(xiàn),方便調(diào)試,也可以解決一個reg變量不能在不同的always塊里面賦值的問題。
自動售貨機(jī)主要可以分為4個模塊,分別為商品選擇模塊,投幣模塊,交易處理模塊,數(shù)碼管顯示模塊。其中前三個模塊具有一定的時序關(guān)系,數(shù)碼管顯示模塊與其余三個模塊并行。
商品選擇通過板子上的三個撥桿開關(guān)來實現(xiàn),在代碼中表示為如下變量:
input wire [2:0]sel_goods
撥動相應(yīng)的開關(guān)即表示選擇相應(yīng)的商品。投幣通過板子上的兩個按鈕實現(xiàn),在代碼中表示為如下變量
input[1:0] key
key[1]按一下表示輸入1元,key[0]按一下表示輸入5角當(dāng)輸入完金額后,按下板子上的一個按鈕便進(jìn)行交易結(jié)算,交易按鈕在代碼中表示為
input deal
交易結(jié)算在內(nèi)部處理,假如交易成功,則顯示找零;假如輸入金額不足,數(shù)碼管則會閃爍2秒;假如庫存不足,則會顯示當(dāng)前的庫存數(shù)量假如在使用過程中出現(xiàn)了問題,比如想要重新輸入金額,可以按rst鍵,這個按鈕可以將自動售貨機(jī)從任意狀態(tài)跳轉(zhuǎn)到最開始的商品選擇狀態(tài)。同時,這個按鈕也可以同時起到退幣的功能。rst按鈕在代碼中表示為
input rst
可用以下圖來表示:
函數(shù)復(fù)用
函數(shù)復(fù)用主要是在數(shù)碼管顯示模塊。
- 因為數(shù)碼管的顯示原理(以較高的頻率不斷顯示單個數(shù)碼管),顯示一種狀態(tài)就要有10-20行代碼。
- 一開始寫第一個模塊的時候感覺還行,然而隨著模塊的增加和代碼復(fù)雜度的升高,跟數(shù)碼管顯示有關(guān)的代碼一遍又一遍的復(fù)制粘貼,導(dǎo)致數(shù)碼管顯示模塊一度達(dá)到了100多行。滿眼的
case,begin,end和大量相似的代碼讓人感覺十分臃腫。 - 于是我將數(shù)碼管顯示的三個關(guān)鍵參數(shù)———顯示數(shù)字,顯示小數(shù)點,點亮的數(shù)碼管,
分別寫成了3個函數(shù)disp_num_get(),dot_get(),an_get(), 用來精簡代碼。 - 具體的代碼見下文細(xì)節(jié)詳述
細(xì)節(jié)詳述
Part1:變量定義
在這一部分中,主要對程序中用到的input, output變量,以及程序中要用到但不參與輸入輸出的變量進(jìn)行了定義。
Part2:商品選擇
代碼如下:
//=========================商品選擇=============================================
//001代表可樂 對應(yīng)的數(shù)字為20
//010代表紅茶 對應(yīng)的數(shù)字為35
//100代表烏龍茶 對應(yīng)的數(shù)字為30
always @(posedge clk)
begin
case(sel_goods)
1:num[15:8] = 8'b00100000;
2:num[15:8] = 8'b00110101;
4:num[15:8] = 8'b00110000;
default:num[15:8] = 8'b00000000;
endcase
end
這一部分還是比較簡單的,上文提到的input wire [2:0]sel_goods為選擇商品的變量,根據(jù)選擇的商品種類,賦給num[15:8](對應(yīng)左側(cè)兩個數(shù)碼管)不同的值,以供數(shù)碼管顯示。
Part3: 輸入金額
代碼如下:
//=========================輸入金額===========================================
//輸入5角
always @(posedge key[0] or posedge rst)
begin
if (rst)
num_5_jiao = 4'b0;
else
begin
if (key[0])
num_5_jiao = num_5_jiao + 1;
end
end
//輸入1元
always @(posedge key[1] or posedge rst)
begin
if (rst)
num_1_yuan = 4'b0;
else
begin
if (key[1])
num_1_yuan = num_1_yuan + 1;
end
end
// 匯總金額
always @(posedge clk)
begin
//個位數(shù)字(小數(shù)部分)只與5角的數(shù)量有關(guān)
//5角的個數(shù)為奇數(shù),則為5;個數(shù)為偶數(shù),則為0
if (num_5_jiao[0])
num[3:0] = 4'b0101;
else
num[3:0] = 4'b0;
//十位數(shù)字則與1元和5角的數(shù)量有關(guān)
//因為2個5角就是1元,所以只要取5角的個數(shù)的前三位
num[7:4] = num_1_yuan + num_5_jiao[3:1];
end
- 這一部分的實現(xiàn)思路是先記錄
key[1]和key[0]輸入1元和5角的個數(shù),然后匯總總的輸入金額,并把相應(yīng)的值賦給num[7:4](對應(yīng)右側(cè)兩個數(shù)碼管),供數(shù)碼管顯示。
其中,在always @(posedge key[0] or posedge rst)可以看到,只有當(dāng)按下key[0]或者rst時,才會上升沿觸發(fā)里面的代碼執(zhí)行。而在匯總金額的時候,采用clk觸發(fā),保證5角和1元的數(shù)量變化能立刻改變輸入金額的顯示。 - 其實這一部分我一開始走了彎路,一開始想的是按鈕按下直接改變對應(yīng)的
num里面的值,但這樣就要考慮num[3:0]的值和進(jìn)位的關(guān)系。再加上按鍵遇到的問題(見后文)一直沒法解決,以及一個reg變量只能在一個always塊的約束,最終還是采用先記錄個數(shù)再匯總金額的方法。
Part4: 交易處理
代碼如下
//=========================交易===================================================
assign deal_success_flag = ch_flag & goods_flag;
always @(posedge deal or posedge rst)
begin
//按下rst按鍵,重置交易記錄
if (rst)
begin
ch_flag <= 0;
deal_flag <= 0;
goods_flag <= 1;
end
else
begin
deal_flag <= 1;
//輸入金額大于等于商品價格
if (num[7:0] >= num[15:8])
begin
changes[15:8] <= 8'b0;
//找零
if (num[3:0] >= num[11:8])
changes[7:0] <= num[7:0] - num[15:8];
else
begin
changes[3:0] <= 4'b0101;
changes[7:4] <= num[7:4] - num[15:12] - 1;
end
//找零標(biāo)志位
ch_flag <= 1;
//減去庫存
case(sel_goods)
1:
begin
if (num_goods[3:0] >= 1)
begin
num_goods[3:0] <= num_goods[3:0] - 1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
2:
begin
if (num_goods[7:4] >= 1)
begin
num_goods[7:4] <= num_goods[7:4] - 4'b1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
4:
begin
if (num_goods[11:8] >= 1)
begin
num_goods[11:8] <= num_goods[11:8] - 1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
default: num_goods <= num_goods;
endcase
end
//輸入金額小于商品價格
else
ch_flag <= 0;
end
end
- 這一部分是處理交易的模塊。這一塊內(nèi)容主要是要更新
assign deal_success_flag,交易成功標(biāo)志
ch_flag,找零標(biāo)志
goods_flag,庫存標(biāo)志
changes,找零金額
num_goods,庫存 - 第一行
assign deal_success_flag = ch_flag & goods_flag;說明交易成功需要滿足兩個條件:輸入金額大于等于商品價格,商品有庫存。 - 當(dāng)按下
rst鍵時,觸發(fā)posedge rst,重置上次的交易結(jié)果。 - 當(dāng)按下
deal鍵時,觸發(fā)posedge deal,開始交易相關(guān)執(zhí)行代碼。
先比較輸入金額和價格的關(guān)系,假如輸入金額>=商品價格,則將輸入金額-商品價格即為找零,同時更新找零標(biāo)志,接著查看選擇的商品的庫存,更新庫存數(shù)量和庫存標(biāo)志;假如輸入金額<商品價格,那么直接更新找零標(biāo)志,然后結(jié)束。
Part5: 庫存查詢
代碼如下
always @(posedge clk)
begin
if (goods_num_query)
begin
case(sel_goods)
1:num_goods_disp = num_goods[3:0];
2:num_goods_disp = num_goods[7:4];
4:num_goods_disp = num_goods[11:8];
endcase
end
end
這部分其實我是順手寫的,本來除了庫存查詢以外,還計劃通過按鍵實現(xiàn)庫存加減的功能,后來覺得先把主要的功能實現(xiàn)再說,估計也不會新加別的功能了。。。
Part6: 數(shù)碼管顯示
代碼較長,而且有不少相似的部分,因此具體見之后的完整代碼。
- 這部分內(nèi)容的大致思路為根據(jù)之前的交易處理得到的各種標(biāo)志,得到需要顯示的內(nèi)容,將一些參數(shù)傳給
clk_sw_7seg_sub,從而顯示不同的內(nèi)容。 - 可以看到,基本每一種情況都會有下面三行代碼,用來得到顯示的內(nèi)容
disp_dot = dot_get(clk_cnt, 4'b1101);
disp_num = disp_num_get(clk_cnt, changes);
an = an_get(clk_cnt);
其實這三個函數(shù)的原理基本一致,就以disp_num_get(clk_cnt, changes)為例
//=========================得到顯示數(shù)字函數(shù)=========================================
//根據(jù)計數(shù)器交替輸出顯示數(shù)字
function [3:0] disp_num_get;
input [23:0] clk_cnt;
input [16:0] num;
begin
case (clk_cnt[15:14])
0:disp_num_get = num[3:0];
1:disp_num_get = num[7:4];
2:disp_num_get = num[11:8];
3:disp_num_get = num[15:12];
endcase
end
endfunction
這么寫是根據(jù)數(shù)碼管的顯示原理。要在四個數(shù)碼管上同時顯示不同的數(shù)字,需要以較高的頻率依次點亮每個數(shù)碼管。因此在這個函數(shù)中,根據(jù)輸入的clk_cnt中第16和15位的數(shù)字,實現(xiàn)分頻的效果,并依次將要顯示的數(shù)字傳給clk_sw_7seg_sub中的NUM;再配合控制點亮數(shù)碼管的an_get(clk_cnt),最終實現(xiàn)實時在數(shù)碼管上顯示數(shù)字。
- 至于閃爍的效果的實現(xiàn),也是大致的思路,再加一個
blink_clk_cnt計數(shù)器用來控制閃爍的時間。時鐘是50MHZ,閃爍時間為2秒的話,就是要計數(shù)到100M,而一次閃爍計數(shù)為2^24,大約6次閃爍為2秒,因此將blink_clk_cnt[26] && blink_clk_cnt[25]作為閃爍結(jié)束的條件。
編程中遇到的問題
- 要搞清楚
wire和reg類型的區(qū)別,一開始的報錯大部分是因為這兩個變量的類型搞錯引起的。簡單的說,wire變量要用assign賦值,不能在always塊里面賦值;而reg變量是在always塊里面賦值 - 一個
reg變量只能在一個always里面賦值?。?!這也是我一開始引發(fā)報錯的最主要原因。假如想要在不同的always塊改變一個reg變量的值,我能想到的就是設(shè)兩個變量,將一個變量作為溝通的橋梁。比如想讓a在一個模塊里面加1,然后在另外一個模塊里面加1,可以這樣寫
always @(*posedge xx)
a_0 <= a_0 + 1;
always @(*posedge yy)
a_1 <= a_0 + 1;
- 在寫輸入金額部分的時候,我看網(wǎng)上的一些教程需要按鍵消抖,所以一開始我也寫了按鍵消抖的模塊,但調(diào)用模塊的時候經(jīng)常會報錯,
not a net lvalue之類的錯誤,好久都沒有解決。然后我就把消抖模塊給刪了,發(fā)現(xiàn)還能用,就先擱置這個錯誤,以后再說。 - 我之前嘗試過寫成
always @(posedge key[0] or posedge key[1] or posedge rst)這樣的觸發(fā)條件。但不知道為什么,如果這樣寫,在實際操作中,按下一個按鍵往往會得不到預(yù)想的結(jié)果,感覺觸發(fā)了不止一次??赡苁莾?nèi)部電路的問題,或者是消抖的問題?但是把觸發(fā)條件分開寫,則不會出現(xiàn)類似的問題。 - G12按鈕在編譯的時候可能會出現(xiàn) I/O的錯誤,好像跟時間的輸入有關(guān),這時候要在.ucf文件里面加上一行
NET "deal" CLOCK_DEDICATED_ROUTE = FALSE;
總結(jié)
- 這次FPGA大作業(yè)給我?guī)淼挠∠筮€是很深刻的,畢竟在這兩周里在這個大作業(yè)上面花了好多時間。
- 從一開始為verilog的語法頭疼、寫幾行代碼就報錯,到后面能較快地實現(xiàn)功能、并運用函數(shù)對代碼進(jìn)行優(yōu)化,其中是在一次次debug中的成長。如何在較短的時間內(nèi)學(xué)習(xí)一門陌生的語言并運用所學(xué)的知識完成特定的功能,是本次大作業(yè)給我的最大的收獲。
- 在寫代碼的過程中我意識到,寫代碼之前既要對總體有規(guī)劃,合理分解功能,又要快速建立原型,在一次次的迭代中實現(xiàn)最終的目標(biāo)。這次大作業(yè)也為我處理好局部和整體的關(guān)系提供了寶貴的經(jīng)驗。
- 要多與他人交流,同學(xué)會給你不少有用的意見。
- 寫代碼寫得心情不好的時候不妨先放一放,可能過一個晚上就會有新的想法出現(xiàn)。
完整代碼
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
module main(key, clk, rst, a_to_g, an, sel_goods, deal, goods_num_query, disp_dot, led);
//=========================輸入和輸出===========================================
input[1:0] key; //投幣按鈕
input clk; //計時器
input rst; //重置交易記錄和數(shù)碼管顯示
input deal; //交易按鈕
output [6:0] a_to_g; //數(shù)碼管數(shù)字顯示
output reg[3:0] an; //用來點亮數(shù)碼管
output reg disp_dot; //小數(shù)點
input wire [2:0]sel_goods; // 用來選擇商品 001代表可樂 011代表紅茶 100代表烏龍茶
input goods_num_query; //庫存查詢
output reg [7:0] led;//燈光效果!
//=========================變量================================================
//把金額以角為單位
//num[15:12]表示商品價格的十位
//num[11:8]表示商品價格的個位
//num[7:4]表示輸入金額的十位
//num[3:0]表示輸入金額的個位
reg [15:0] num = 16'b0;
reg [3:0]disp_num; //數(shù)碼管顯示數(shù)字
reg [11:0]num_goods = 12'h555; //初始設(shè)置庫存都為
reg [23:0]clk_cnt = 24'b0; //時鐘計數(shù)
reg [26:0]blink_clk_cnt = 27'b0;//用于計數(shù)閃爍時間
reg [15:0] changes; //找零金額
reg ch_flag = 0; //找零標(biāo)志位
reg goods_flag = 1; //庫存標(biāo)志位
reg deal_flag = 0; //交易是否進(jìn)行的標(biāo)志位
wire deal_success_flag; //交易是否成功的標(biāo)志
reg [3:0] num_goods_disp; //用于顯示庫存
reg [4:0] num_5_jiao = 4'b0; //投入的5角的數(shù)量
reg [4:0] num_1_yuan = 4'b0; //投入的1元的數(shù)量
reg blink_flag = 1; //閃爍標(biāo)志
reg blink_rst;//閃爍重置
//=========================商品選擇=============================================
//001代表可樂 對應(yīng)的數(shù)字為20
//010代表紅茶 對應(yīng)的數(shù)字為35
//100代表烏龍茶 對應(yīng)的數(shù)字為30
always @(posedge clk)
begin
case(sel_goods)
1:num[15:8] = 8'b00100000;
2:num[15:8] = 8'b00110101;
4:num[15:8] = 8'b00110000;
default:num[15:8] = 8'b00000000;
endcase
end
//=========================輸入金額===========================================
//輸入5角
always @(posedge key[0] or posedge rst)
begin
if (rst)
num_5_jiao = 4'b0;
else
begin
if (key[0])
num_5_jiao = num_5_jiao + 1;
end
end
//輸入1元
always @(posedge key[1] or posedge rst)
begin
if (rst)
num_1_yuan = 4'b0;
else
begin
if (key[1])
num_1_yuan = num_1_yuan + 1;
end
end
// 匯總金額
always @(posedge clk)
begin
//個位數(shù)字(小數(shù)部分)只與5角的數(shù)量有關(guān)
//5角的個數(shù)為奇數(shù),則為5;個數(shù)為偶數(shù),則為0
if (num_5_jiao[0])
num[3:0] = 4'b0101;
else
num[3:0] = 4'b0;
//十位數(shù)字則與1元和5角的數(shù)量有關(guān)
//因為2個5角就是1元,所以只要取5角的個數(shù)的前三位
num[7:4] = num_1_yuan + num_5_jiao[3:1];
end
//=========================交易===================================================
assign deal_success_flag = ch_flag & goods_flag;
always @(posedge deal or posedge rst)
begin
//按下rst按鍵,重置交易記錄
if (rst)
begin
ch_flag <= 0;
deal_flag <= 0;
goods_flag <= 1;
blink_rst <= 1;
end
else
begin
blink_rst <= 0;
deal_flag <= 1;
//輸入金額大于等于商品價格
if (num[7:0] >= num[15:8])
begin
changes[15:8] <= 8'b0;
//找零
if (num[3:0] >= num[11:8])
changes[7:0] <= num[7:0] - num[15:8];
else
begin
changes[3:0] <= 4'b0101;
changes[7:4] <= num[7:4] - num[15:12] - 1;
end
//標(biāo)志位
ch_flag <= 1;
//減去庫存
case(sel_goods)
1:
begin
if (num_goods[3:0] >= 1)
begin
num_goods[3:0] <= num_goods[3:0] - 1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
2:
begin
if (num_goods[7:4] >= 1)
begin
num_goods[7:4] <= num_goods[7:4] - 4'b1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
4:
begin
if (num_goods[11:8] >= 1)
begin
num_goods[11:8] <= num_goods[11:8] - 1;
goods_flag <= 1;
end
else
goods_flag <= 0;
end
default: num_goods <= num_goods;
endcase
end
//輸入金額小于商品價格
else
ch_flag <= 0;
end
end
//=========================庫存查詢以及庫存改變=====================================
always @(posedge clk)
begin
if (goods_num_query)
begin
case(sel_goods)
1:num_goods_disp = num_goods[3:0];
2:num_goods_disp = num_goods[7:4];
4:num_goods_disp = num_goods[11:8];
endcase
end
end
//=========================數(shù)碼管顯示==============================================
always @(posedge clk)
begin
if (clk_cnt == 24'hFFFFFF)
clk_cnt <= 24'b0;
else
clk_cnt <= clk_cnt + 1;
//重置閃爍標(biāo)志
if (blink_rst)
blink_flag = 1;
//未進(jìn)行交易時
if (!deal_flag)
begin
//查詢庫存
if (goods_num_query)
begin
disp_num = disp_num_get(clk_cnt, num_goods_disp);
an = an_get(clk_cnt);
end
else
begin
disp_dot = dot_get(clk_cnt, 4'b0101);
disp_num = disp_num_get(clk_cnt, num);
an = an_get(clk_cnt);
end
end
//交易后
else
begin
//交易成功,顯示零錢
if (deal_success_flag)
begin
//交易成功的燈光閃爍效果
case (clk_cnt[23:21])
0:led = 8'b00000001;
1:led = 8'b00000010;
2:led = 8'b00000100;
3:led = 8'b00001000;
4:led = 8'b00010000;
5:led = 8'b00100000;
6:led = 8'b01000000;
7:led = 8'b10000000;
endcase
disp_dot = dot_get(clk_cnt, 4'b1101);
disp_num = disp_num_get(clk_cnt, changes);
an = an_get(clk_cnt);
end
//金額不足交易失敗,閃爍數(shù)字6次,大約2秒
else if (!ch_flag)
begin
if (blink_flag)
begin
blink_clk_cnt = blink_clk_cnt + 1;
if (blink_clk_cnt[26] && blink_clk_cnt[25])
begin
blink_flag = 0;
blink_clk_cnt = 0;
end
if (clk_cnt[23])
begin
disp_dot = dot_get(clk_cnt, 4'b0101);
disp_num = disp_num_get(clk_cnt, num);
an = an_get(clk_cnt);
end
end
else
begin
disp_dot = dot_get(clk_cnt, 4'b0101);
disp_num = disp_num_get(clk_cnt, num);
an = an_get(clk_cnt);
end
end
//庫存不足交易失敗,顯示庫存,肯定是0啊
else if(!goods_flag)
begin
disp_dot = dot_get(clk_cnt, 4'b1111);
disp_num = disp_num_get(clk_cnt, 16'b0);
an = an_get(clk_cnt);
end
end
end
//=========================得到顯示數(shù)字函數(shù)=========================================
//根據(jù)計數(shù)器交替輸出顯示數(shù)字
function [3:0] disp_num_get;
input [23:0] clk_cnt;
input [16:0] num;
begin
case (clk_cnt[15:14])
0:disp_num_get = num[3:0];
1:disp_num_get = num[7:4];
2:disp_num_get = num[11:8];
3:disp_num_get = num[15:12];
endcase
end
endfunction
//=========================小數(shù)點顯示函數(shù)==========================================
function dot_get;
input [23:0] clk_cnt;
input [3:0] dot;
begin
case (clk_cnt[15:14])
0:dot_get = dot[0];
1:dot_get = dot[1];
2:dot_get = dot[2];
3:dot_get = dot[3];
endcase
end
endfunction
//=========================數(shù)碼管交替點亮函數(shù)=======================================
//根據(jù)計數(shù)器交替輸出應(yīng)該點亮的數(shù)碼管
function [3:0] an_get;
input [23:0] clk_cnt;
begin
case (clk_cnt[15:14])
0:an_get = 4'b1110;
1:an_get = 4'b1101;
2:an_get = 4'b1011;
3:an_get = 4'b0111;
endcase
end
endfunction
clk_sw_7seg_sub A1( .NUM(disp_num),
.a_to_g(a_to_g));
endmodule
//=========================數(shù)碼管顯示模塊===========================================
module clk_sw_7seg_sub(
input [3:0]NUM,
output reg[6:0]a_to_g
);
always @(*)
case(NUM)
0:a_to_g=7'b0000001;
1:a_to_g=7'b1001111;
2:a_to_g=7'b0010010;
3:a_to_g=7'b0000110;
4:a_to_g=7'b1001100;
5:a_to_g=7'b0100100;
6:a_to_g=7'b0100000;
7:a_to_g=7'b0001111;
8:a_to_g=7'b0000000;
9:a_to_g=7'b0000100;
'hA: a_to_g=7'b0001000;
'hB: a_to_g=7'b1100000;
'hC: a_to_g=7'b0110001;
'hD: a_to_g=7'b1000010;
'hE: a_to_g=7'b0110000;
'hF: a_to_g=7'b0111000;
default: a_to_g=7'b0000001;
endcase
endmodule