# 數位系統導論實驗 > 歡迎熱心同學分享自己實作方式,注意不要修改到前人貢獻 > [name=Cat Burglar] - bluster location: `C:\intelFPGA_lite\16.1\quartus\drivers` - 專案名稱不要中文和數字開頭 ## 10/28 Lab #### Full Adder * data flow ```verilog= module FA(x,y,c_in,sum,c_out); input x,y,c_in; output sum,c_out; /* modify the code here*/ wire sum_1,cout_1,cout_2; assign sum_1 = x^y; assign cout_1 = x&y; assign sum = sum_1^c_in; assign cout_2 = sum_1 & c_in; assign c_out = cout_1 | cout_2; endmodule ``` * behavior ```verilog= module FA(x,y,c_in,sum,c_out); input x,y,c_in; output reg sum,c_out; /* modify the code here*/ always@(*) begin {c_out, sum} = x + y + c_in; end endmodule ``` * structure ```verilog= module FA(x,y,c_in,sum,c_out); input x,y,c_in; output sum,c_out; wire s, c1, c2; /* modify the code here*/ HA half_adder1(x,y,s,c1); HA half_adder2(s,c_in,sum,c2); or(c_out , c1, c2); endmodule ``` ## 11/4 ### Lab1 * adder subtrater ```verilog= always@(*)begin if (select == 1) begin {overflow,out} = a+b; end else begin {overflow,out} = a-b; end end ``` ### Lab2 * 忘記叫啥懶得看簡報 ```verilog= module encoder(in, valid, out); input [3:0] in; output reg valid; output reg [1:0]out; always@(*)begin if(in == 4'b0001)begin valid = 1; out = 2'b00; end else if(in == 4'b0010)begin valid = 1; out = 2'b01; end else if(in == 4'b0100)begin valid = 1; out = 2'b10; end else if(in == 4'b1000)begin valid = 1; out = 2'b11; end else begin valid = 0; out = 2'b00; end end endmodule ``` ## 11/6 ### arithmetic shift right ```verilog= module shifter(in, out); input [3:0] in; output reg [3:0] out; /* modify the code here*/ always@(*)begin out = in>>1; out[3] = in[3]; end endmodule ``` ### 3 to 8 decoder ```verilog= module decoder(in, enable, out); input [2:0] in; input enable; output reg [7:0] out; /* modify the code here*/ always@(*)begin out[7:0] = 0; case(enable) 1'b0: out = 0; 1'b1:begin case(in) 3'b000: out[0] = 1; 3'b001: out[1] = 1; 3'b010: out[2] = 1; 3'b011: out[3] = 1; 3'b100: out[4] = 1; 3'b101: out[5] = 1; 3'b110: out[6] = 1; 3'b111: out[7] = 1; default: out = 0; endcase end default: out = 0; endcase end endmodule ``` ## 11/10 ### 學號顯示器 - 他題序跟去年相反然後我就寫掉一半了,抱歉 > 你寫好快 by bowling ```verilog= module lab(out1, out2, out3); output reg [6:0]out1; output reg [6:0]out2; output reg [6:0]out3; //107 always@(*)begin out1=7'b1111001; out2=7'b1000000; out3=7'b1111000; end endmodule ``` ### 3-bit adder ```verilog= module lab(a,b,out); input [2:0]a; input [2:0]b; output reg [6:0]out; reg [3:0]ans; always@(*)begin ans = a + b; end always@(*)begin case(ans) 4'b0000: out = 7'b1000000; 4'b0001: out = 7'b1111001; 4'b0010: out = 7'b0100100; 4'b0011: out = 7'b0110000; 4'b0100: out = 7'b0011001; 4'b0101: out = 7'b0010010; 4'b0110: out = 7'b0000010; 4'b0111: out = 7'b1111000; 4'b1000: out = 7'b0000000; 4'b1001: out = 7'b0010000; 4'b1010: out = 7'b0001000; 4'b1011: out = 7'b0000011; 4'b1100: out = 7'b1000110; 4'b1101: out = 7'b0100001; 4'b1110: out = 7'b0000110; 4'b1111: out = 7'b0001110; default: out = 7'b1111111; endcase end endmodule ``` ## 11/13 週末練習 ```verilog= module special_multiplier(num, result); input [3:0] num; output reg [6:0] result; reg [3:0] ans; /* modify the code here */ always @(*) begin case(num) 4'b0000: ans = num; 4'b0001: ans = num; 4'b0010: ans = num; 4'b0011: ans = ( num + 1 ) * 2; 4'b0100: ans = ( num + 1 ) * 2; 4'b0101: ans = ( num + 1 ) * 2; 4'b0110: ans = ( num - 1 ) * 2; 4'b0111: ans = ( num - 1 ) * 2; default: ans = 0; endcase end always @(*) begin case(ans) 4'b0000: result = 7'b1000000; 4'b0001: result = 7'b1111001; 4'b0010: result = 7'b0100100; 4'b0011: result = 7'b0110000; 4'b0100: result = 7'b0011001; 4'b0101: result = 7'b0010010; 4'b0110: result = 7'b0000010; 4'b0111: result = 7'b1111000; 4'b1000: result = 7'b0000000; 4'b1001: result = 7'b0010000; 4'b1010: result = 7'b0001000; 4'b1011: result = 7'b0000011; 4'b1100: result = 7'b1000110; 4'b1101: result = 7'b0100001; 4'b1110: result = 7'b0000110; 4'b1111: result = 7'b0001110; default: result = 7'b1000000; endcase end endmodule ``` ## 7段顯示器 數字對應表 ```verilog= 7'b1000000 //0 7'b1111001 //1 7'b0100100 //2 7'b0110000 //3 7'b0011001 //4 7'b0010010 //5 7'b0000010 //6 7'b1111000 //7 7'b0000000 //8 7'b0010000 //9 7'b0001000 //A 7'b0000011 //b 7'b1000110 //c 7'b0100001 //d 7'b0000110 //E 7'b0001110 //F ``` ## 11/18 Lab6 Sequential Circuit 計數器 * Note: module 呼叫不能放在always@裡面 * <= 代表同步改變 ### Frequency Divider(clock) > sequencial circuit ```verilog= `define TimeExpire 32'd25000000//define寫法後面不能加分號 module Frequency_div(clk,rst,div_clk); input clk,rst; output div_clk; reg div_clk; reg [31:0] count; always@(posedge clk) begin if(!rst) begin count <= 32'd0; div_clk <= 1'b0; end else begin if(count == 32'd25000000) begin count <= 32'd0; div_clk <= ~div_clk; end else begin count <= count + 32'd1; end end end endmodule ``` * Counter > sequencial circuit ```verilog= module Counter(div_clk,rst,count); input div_clk; input rst; output reg [3:0]count; always@(posedge div_clk or negedge rst)//posedge clk vs. clk, 一個只會感受到一瞬間的變化,一個是半個週期 begin if(!rst) begin count <= 4'd0; end else if(count == 4'd15) begin count <= 4'd0; end else begin count <= count + 4'd1; end end endmodule ``` * Seven Display > combinatial circuit ```verilog= module Seven_display(count,out); input [3:0] count; output reg [6:0] out; always@(count) begin case(count) 4'b0000: out = 7'b1000000; 4'b0001: out = 7'b1111001; 4'b0010: out = 7'b0100100; 4'b0011: out = 7'b0110000; 4'b0100: out = 7'b0011001; 4'b0101: out = 7'b0010010; 4'b0110: out = 7'b0000010; 4'b0111: out = 7'b1111000; 4'b1000: out = 7'b0000000; 4'b1001: out = 7'b0010000; 4'b1010: out = 7'b0001000; 4'b1011: out = 7'b0000011; 4'b1100: out = 7'b1000110; 4'b1101: out = 7'b0100001; 4'b1110: out = 7'b0000110; 4'b1111: out = 7'b0001110; default: out = 7'b1000000; endcase end endmodule ``` * Top Module ```verilog= module Top_module(clk,rst,out);//要加分號 input clk; input rst; //port 對接 module 用wire連接 //以判斷是否有用到always@為主,有always用reg output wire [6:0] out;//會默認wire wire div_clk; wire [3:0] count; Frequency_div u_FreqDiv (.clk(clk),.rst(rst),.div_clk(div_clk)); Counter u_counter(.div_clk(div_clk),.rst(rst),.count(count)); Seven_display u_display(.count(count),.out(out)); endmodule ``` ## 11/20週末練習 其他部份和11/18要求差不多,counter變化大 除頻器在這邊可以不用用到rst(除頻器會留著rst是因為要初始化裝置,只是FPGA有幫你初始化),不然最好設定2個rst 如果只有一個rst,在按按鈕的時候clk和div_clk都會一直是0,這樣div_clk沒有變化,沒辦法進行下一部份的歸0 * Frequency_div ```verilog= module Frequency_div(clk,rst,div_clk); input clk,rst; output div_clk; reg div_clk; reg [31:0] count; always@(posedge clk) begin if(count == 32'd25000000) begin count <= 32'd0; div_clk <= ~div_clk; end else begin count <= count + 32'd1; end end endmodule ``` * Counter ```verilog= module Counter(div_clk,rst,sel,count); input div_clk; input rst, sel; output reg [3:0]count; always@(posedge div_clk)//posedge clk vs. clk, 一個只會感受到一瞬間的變化,一個是半個週期 //需要同步重置,所以只需要管posedge即可 begin if(!rst)//rst=0 begin count = 4'd0; end else begin//rst = 1 case(sel) 1'd1:begin if(count == 4'd15) begin count = 4'd0; end else begin count = count + 1; end end 1'd0:begin if(count == 4'd0) begin count = 4'd15; end else begin count = count - 1; end end endcase end end endmodule ``` * Top module ```verilog= module Top_module(clk,rst,out);//要加分號 input clk; input rst; //port 對接 module 用wire連接 //以判斷是否有用到always@為主,有always用reg output wire [6:0] out;//會默認wire wire div_clk; wire [3:0] count; Frequency_div u_FreqDiv (.clk(clk),.rst(rst),.div_clk(div_clk)); Counter u_counter(.div_clk(div_clk),.rst(rst),.count(count),.set(set)); Seven_display u_display(.count(count),.out(out)); endmodule ``` ## 11/25 Lab7 - frequency div ```verilog= `define TimeExpire 32'd25000000//define不要用了啦 是一秒喔喔!!!!! module clk_div(clk,rst,div_clk); input clk, rst; output reg div_clk; reg [31:0]count; always@(posedge clk)begin if (!rst)begin count <= 32'd0; div_clk <= 1'd0; end else begin if(count == 32'd25000000)begin count <= 32'd0; div_clk <= ~div_clk; end else begin count <= count + 32'd1; end end end endmodule ``` - state ```verilog= module state(div_clk, rst, In, state); input div_clk, In, rst; output reg [2:0] state; reg [2:0] next; always@(posedge div_clk or negedge rst)begin if(!rst)begin state <= 3'd0; end else begin state <= next; end end always@(*)begin//不需要等到posedge再換,因為可能會來不及算 case(state) 3'd0:begin if(In == 1'd0)begin next = 3'd1; end else begin next = 3'd3; end end 3'd1:begin if(In == 1'd0)begin next = 3'd2; end else begin next = 3'd5; end end 3'd2:begin if(In == 1'd0)begin next = 3'd3; end else begin next = 3'd0; end end 3'd3:begin if(In == 1'd0)begin next = 3'd4; end else begin next = 3'd1; end end 3'd4:begin if(In == 1'd0)begin next = 3'd5; end else begin next = 3'd2; end end 3'd5:begin if(In == 1'd0)begin next = 3'd0; end else begin next = 3'd4; end end default: next = 3'd0; endcase end endmodule ``` - seven display ```verilog= module seven_display(state, out); input [2:0] state; output reg [6:0] out; always@(state)begin case(state) 3'd0: out <= 7'b1000000; 3'd1: out <= 7'b1111001; 3'd2: out <= 7'b0100100; 3'd3: out <= 7'b0110000; 3'd4: out <= 7'b0011001; 3'd5: out <= 7'b0010010; default: out <= 7'b1000000; endcase end endmodule ``` - Top Module ```verilog= module lab(clk,rst,In,out);//要加分號 input clk; input rst; input In; //port 對接 module 用wire連接 //以判斷是否有用到always@為主,有always用reg output wire [6:0] out;//會默認wire wire div_clk; wire [2:0] state; clk_div u_ClkDiv (.clk(clk),.rst(rst),.div_clk(div_clk)); state u_state(.div_clk(div_clk),.rst(rst),.In(In), .state(state)); //變數記得宣告 seven_display u_display(.state(state),.out(out)); endmodule ``` --- ### ~期中考 Moore machine 大致從Lab6,7改要求 --- ## 12/9 Lab8 Dot matrix display controller - Top Module ```verilog= module lab(clk,rst,dot_row,dot_col); input clk,rst; output reg [7:0]dot_row; output reg [7:0]dot_col; wire div_clk; clk_div u_ClkDiv (.clk(clk),.rst(rst),.div_clk(div_clk)); dot u_dot(.div_clk(div_clk),.rst(rst),.dot_row(dot_row),.dot_col(dot_col)); endmodule ``` - frequency div (T = 1/10000sec) ```verilog= `define TimeExpire 32'd2500//define不要用了啦 是1/10000秒喔喔!!!!! module clk_div(clk,rst,div_clk); input clk, rst; output reg div_clk; reg [31:0]count; always@(posedge clk)begin if (!rst)begin count <= 32'd0; div_clk <= 1'd0; end else begin if(count == 32'd2500)begin count <= 32'd0; div_clk <= ~div_clk; end else begin count <= count + 32'd1; end end end endmodule ``` - dot matrix ```verilog= module dot(div_clk,rst,dot_row,dot_col); input rst,div_clk; output reg [7:0]dot_row; output reg [7:0]dot_col; reg [2:0] row_count; always@(posedge div_clk or negedge rst)begin if(~rst)begin dot_row <= 8'b0; dot_col <= 8'b0; row_count <= 0; end else begin row_count <= row_count +1; case(row_count) 3'd0:dot_row <= 8'b01111111; 3'd1:dot_row <= 8'b10111111; 3'd2:dot_row <= 8'b11011111; 3'd3:dot_row <= 8'b11101111; 3'd4:dot_row <= 8'b11110111; 3'd5:dot_row <= 8'b11111011; 3'd6:dot_row <= 8'b11111101; 3'd7:dot_row <= 8'b11111110; endcase case(row_count) 3'd0:dot_col <= 8'b00011000; 3'd1:dot_col <= 8'b00100100; 3'd2:dot_col <= 8'b01000010; 3'd3:dot_col <= 8'b11000011; 3'd4:dot_col <= 8'b01000010; 3'd5:dot_col <= 8'b01000010; 3'd6:dot_col <= 8'b01000010; 3'd7:dot_col <= 8'b01111110; endcase end end endmodule ``` ## 12/15 Lab9 - Final version - 7display ```verilog= module display(count, out); input [3:0]count; output reg [6:0]out; always@(count)begin case(count) 4'd0: out = 7'b1000000; //0 4'd1: out = 7'b1111001; //1 4'd2: out = 7'b0100100; //2 4'd3: out = 7'b0110000; //3 4'd4: out = 7'b0011001; //4 4'd5: out = 7'b0010010; //5 4'd6: out = 7'b0000010; //6 4'd7: out = 7'b1111000; //7 4'd8: out = 7'b0000000; //8 4'd9: out = 7'b0010000; //9 4'd10: out = 7'b0001000; //A 4'd11: out = 7'b0000011; //b 4'd12: out = 7'b1000110; //c 4'd13: out = 7'b0100001; //d 4'd14: out = 7'b0000110; //E 4'd15: out = 7'b0001110; //F endcase end endmodule ``` - dot matrix ```verilog= module dot_matrix(state,rst, matrix_f, dot_row, dot_col); input [2:0]state; input matrix_f; input rst; output reg [7:0]dot_row; output reg [7:0]dot_col; reg [2:0] row_count; always@(posedge matrix_f or negedge rst)begin//不確定要不要加or state if(!rst)begin dot_row <= 8'b11111111; row_count <= 3'd0; end else begin row_count <= row_count +1; case(row_count) 3'd0:dot_row <= 8'b01111111; 3'd1:dot_row <= 8'b10111111; 3'd2:dot_row <= 8'b11011111; 3'd3:dot_row <= 8'b11101111; 3'd4:dot_row <= 8'b11110111; 3'd5:dot_row <= 8'b11111011; 3'd6:dot_row <= 8'b11111101; 3'd7:dot_row <= 8'b11111110; endcase case(state) 2'd0:begin case(row_count) 3'd0:dot_col <= 8'b00001100; 3'd1:dot_col <= 8'b00001100; 3'd2:dot_col <= 8'b00011001; 3'd3:dot_col <= 8'b01111110; 3'd4:dot_col <= 8'b10011000; 3'd5:dot_col <= 8'b00011000; 3'd6:dot_col <= 8'b00101000; 3'd7:dot_col <= 8'b01001000; endcase end 2'd1:begin case(row_count) 3'd0:dot_col <= 8'b00000000; 3'd1:dot_col <= 8'b00100100; 3'd2:dot_col <= 8'b00111100; 3'd3:dot_col <= 8'b10111101; 3'd4:dot_col <= 8'b11111111; 3'd5:dot_col <= 8'b00111100; 3'd6:dot_col <= 8'b00111100; 3'd7:dot_col <= 8'b00000000; endcase end default:begin case(row_count) 3'd0:dot_col <= 8'b00011000; 3'd1:dot_col <= 8'b00011000; 3'd2:dot_col <= 8'b00111100; 3'd3:dot_col <= 8'b00111100; 3'd4:dot_col <= 8'b01011010; 3'd5:dot_col <= 8'b00011000; 3'd6:dot_col <= 8'b00011000; 3'd7:dot_col <= 8'b00100100; endcase end endcase end end endmodule ``` - state change ```verilog= module state_change(state_f, rst, state, count); input state_f, rst; output reg [1:0]state; output reg [3:0]count; always@(posedge state_f or negedge rst)begin if(!rst)begin count = 4'd15;//秒數初始化為15 state = 2'd0;//綠燈 end else begin if(count == 4'd0)begin case(state)//green 2'd0:begin state = 2'd1; count = 4'd5; end 2'd1:begin//yellow state = 2'd2; count = 4'd10; end default:begin//red state = 2'd0; count = 4'd15; end endcase end else begin count = count - 4'd1; state = state; end end end endmodule ``` - cloak2 ```verilog= module clk2(clk,rst,state_f); input clk, rst; output reg state_f; reg [31:0]count; always@(posedge clk or negedge rst)begin if (!rst)begin count <= 32'd0; state_f <= 1'd0; end else begin if(count == 32'd25000000)begin count <= 32'd0; state_f <= ~state_f; end else begin count <= count + 32'd1; end end end endmodule ``` - clock1 ```verilog= module clk1(clk,rst,matrix_f); input clk, rst; output reg matrix_f; reg [31:0]count; always@(posedge clk)begin if (!rst)begin count <= 32'd0; matrix_f <= 1'd0; end else begin if(count == 32'd2500)begin count <= 32'd0; matrix_f <= ~matrix_f; end else begin count <= count + 32'd1; end end end endmodule ``` - top module ```verilog= module lab(clk,rst,dot_row, dot_col,out); input clk, rst; output [7:0] dot_row; output [7:0] dot_col; output [6:0] out; wire matrix_f, state_f; wire [1:0] state; wire [3:0] count; clk1 u_clk1(.clk(clk), .rst(rst), .matrix_f(matrix_f)); clk2 u_clk2(.clk(clk), .rst(rst), .state_f(state_f)); state_change u_state_change(.state_f(state_f), .rst(rst), .state(state), .count(count)); dot_matrix u_dot_matrix(.state(state), .rst(rst),.matrix_f(matrix_f), .dot_row(dot_row), .dot_col(dot_col)); display u_display(.count(count),.out(out)); endmodule ``` ## lab10 - top module ```verilog= module lab(clk,rst,keypadRow,keypadCol,dot_row, dot_col); input clk, rst; output [3:0]keypadRow; input [3:0]keypadCol; output [7:0] dot_row; output [7:0] dot_col; wire [3:0]keypadBuf; wire matrix_f; wire [3:0] count; clk1 u_clk1(.clk(clk), .rst(rst), .matrix_f(matrix_f)); dot_matrix u_dot_matrix(.keypadBuf(keypadBuf), .rst(rst),.matrix_f(matrix_f), .dot_row(dot_row), .dot_col(dot_col)); checkkeypad u_checkkeypad(.clk(clk),.rst(rst),.keypadRow(keypadRow),.keypadCol(keypadCol),.keypadBuf(keypadBuf)); endmodule ``` - keypad ```verilog= module checkkeypad(clk,rst,keypadRow,keypadCol,keypadBuf); input clk,rst; input [3:0]keypadCol; output reg [3:0]keypadRow; output reg [3:0]keypadBuf; reg [31:0]keypadDelay; always@(posedge clk) begin if(!rst) begin keypadRow <= 4'b1110; keypadBuf <= 4'b0000; keypadDelay <= 31'd0; end else begin if(keypadDelay==250000) begin keypadDelay = 31'd0; case({keypadRow,keypadCol}) 8'b1110_1110:keypadBuf <= 4'h7; 8'b1110_1101:keypadBuf <= 4'h4; 8'b1110_1011:keypadBuf <= 4'h1; 8'b1110_0111:keypadBuf <= 4'h0; 8'b1101_1110:keypadBuf <= 4'h8; 8'b1101_1101:keypadBuf <= 4'h5; 8'b1101_1011:keypadBuf <= 4'h2; 8'b1101_0111:keypadBuf <= 4'ha; 8'b1011_1110:keypadBuf <= 4'h9; 8'b1011_1101:keypadBuf <= 4'h6; 8'b1011_1011:keypadBuf <= 4'h3; 8'b1011_0111:keypadBuf <= 4'hb; 8'b0111_1110:keypadBuf <= 4'hc; 8'b0111_1101:keypadBuf <= 4'hd; 8'b0111_1011:keypadBuf <= 4'he; 8'b0111_0111:keypadBuf <= 4'hf; default: keypadBuf<=keypadBuf; endcase case(keypadRow) 4'b1110:keypadRow<=4'b1101; 4'b1101:keypadRow<=4'b1011; 4'b1011:keypadRow<=4'b0111; 4'b0111:keypadRow<=4'b1110; default:keypadRow<=4'b1110; endcase end else keypadDelay <= keypadDelay + 1'b1; end end endmodule ``` - clock ```verilog= module clk1(clk,rst,matrix_f); input clk, rst; output reg matrix_f; reg [31:0]count; always@(posedge clk)begin if (!rst)begin count <= 32'd0; matrix_f <= 1'd0; end else begin if(count == 32'd2500)begin count <= 32'd0; matrix_f <= ~matrix_f; end else begin count <= count + 32'd1; end end end endmodule ``` - dot matrix ```verilog= module dot_matrix(keypadBuf,rst, matrix_f, dot_row, dot_col); input [3:0]keypadBuf; input matrix_f; input rst; output reg [7:0]dot_row; output reg [7:0]dot_col; reg [2:0] row_count; always@(posedge matrix_f or negedge rst)begin//不確定要不要加or state if(!rst)begin dot_row <= 8'b11111111; row_count <= 3'd0; end else begin row_count <= row_count +1; case(row_count) 3'd0:dot_row <= 8'b01111111; 3'd1:dot_row <= 8'b10111111; 3'd2:dot_row <= 8'b11011111; 3'd3:dot_row <= 8'b11101111; 3'd4:dot_row <= 8'b11110111; 3'd5:dot_row <= 8'b11111011; 3'd6:dot_row <= 8'b11111101; 3'd7:dot_row <= 8'b11111110; endcase case(keypadBuf) 4'd0:begin case(row_count) 3'd6:dot_col <= 8'b11000000; 3'd7:dot_col <= 8'b11000000; default: dot_col <= 8'd0; endcase end 4'd1:begin case(row_count) 3'd6:dot_col <= 8'b00110000; 3'd7:dot_col <= 8'b00110000; default: dot_col <= 8'd0; endcase end 4'd2:begin case(row_count) 3'd4:dot_col <= 8'b00110000; 3'd5:dot_col <= 8'b00110000; default: dot_col <= 8'd0; endcase end 4'd3:begin case(row_count) 3'd2:dot_col <= 8'b00110000; 3'd3:dot_col <= 8'b00110000; default: dot_col <= 8'd0; endcase end 4'd4:begin case(row_count) 3'd6:dot_col <= 8'b00001100; 3'd7:dot_col <= 8'b00001100; default: dot_col <= 8'd0; endcase end 4'd5:begin case(row_count) 3'd4:dot_col <= 8'b00001100; 3'd5:dot_col <= 8'b00001100; default: dot_col <= 8'd0; endcase end 4'd6:begin case(row_count) 3'd2:dot_col <= 8'b00001100; 3'd3:dot_col <= 8'b00001100; default: dot_col <= 8'd0; endcase end 4'd7:begin case(row_count) 3'd6:dot_col <= 8'b00000011; 3'd7:dot_col <= 8'b00000011; default: dot_col <= 8'd0; endcase end 4'd8:begin case(row_count) 3'd4:dot_col <= 8'b00000011; 3'd5:dot_col <= 8'b00000011; default: dot_col <= 8'd0; endcase end 4'd9:begin case(row_count) 3'd2:dot_col <= 8'b00000011; 3'd3:dot_col <= 8'b00000011; default: dot_col <= 8'd0; endcase end 4'd10:begin case(row_count) 3'd4:dot_col <= 8'b11000000; 3'd5:dot_col <= 8'b11000000; default: dot_col <= 8'd0; endcase end 4'd11:begin case(row_count) 3'd2:dot_col <= 8'b11000000; 3'd3:dot_col <= 8'b11000000; default: dot_col <= 8'd0; endcase end 4'd12:begin case(row_count) 3'd0:dot_col <= 8'b00000011; 3'd1:dot_col <= 8'b00000011; default: dot_col <= 8'd0; endcase end 4'd13:begin case(row_count) 3'd0:dot_col <= 8'b00001100; 3'd1:dot_col <= 8'b00001100; default: dot_col <= 8'd0; endcase end 4'd14:begin case(row_count) 3'd0:dot_col <= 8'b00110000; 3'd1:dot_col <= 8'b00110000; default: dot_col <= 8'd0; endcase end 4'd15:begin case(row_count) 3'd0:dot_col <= 8'b11000000; 3'd1:dot_col <= 8'b11000000; default: dot_col <= 8'd0; endcase end endcase end end endmodule ``` ## 12/15 Lab11 :-) VGA > HSync 訊號為 active low (0)訊號,用來告知換行 > VSync 訊號為 active low (0)訊號,用來告知換幀 - top module ```verilog= module lab (clk,rst,btnR,btnG,btnB,r,g,b,HSync,VSync); begin input clk,rst,btnR,btnG,btnB; output [3:0]r,[3:0]g,[3:0]b,HSync,VSync; wire clk_div; clk1 u_clk1(.clk(clk), .rst(rst), .clk_div(clk_div)); counterH u_counterH(.clk_div(clk_div), .HSync(HSync)); counterV u_counterV(.clk_div(clk_div), .VSync(VSync)); RGB u_RGB(.HSync(HSync),.rst(rst),.btnR(btnR),.btnG(btnG),.btnB(btnB),.r(r),.g(g),.b(b)); end ``` - clock(50Mhz to 25Mhz) ```verilog= module clk(clk,rst,clk_div); input clk, rst; output reg state_f; reg [31:0]count; always@(posedge clk or negedge rst)begin if (!rst)begin count <= 32'd0; clk_div <= 1'd0; end else begin if(count == 32'd1)begin count <= 32'd0; clk_div <= ~clk_div; end else begin count <= count + 32'd1; end end end endmodule ``` -counter for HSync ```verilog= module counterH(clk_div,HSync); input [31:0]clk_div; output reg HSync; reg [9:0]count; always@(clk_div)begin if(count == 10'd800)begin count = 10'd0; HSync = 1'b0; end else begin count = count + 10'd1; HSync = 1'b1; end end endmodule ``` -counter for VSync ```verilog= module counterV(clk_div,VSync); input [31:0]clk_div; output reg VSync; reg [31:0]count; always@(clk_div)begin if(count == 31'd420000)begin count = 31'd0; VSync = 1'b0; end else begin count = count + 31'd1; VSync = 1'b1; end end endmodule ``` - RGB ```verilog= module RGB(HSync,rst,btnR,btnG,btnB,r,g,b); input rst,HSync; input btnR,btnG,btnB; output reg [3:0]r,[3:0]g,[3:0]b; //for state reg [3:0]sr,[3:0]sg,[3:0]sb; always@(*)begin if(!rst)begin sr=4'd0; sg=4'd0; sb=4'd0; end else if(!HSync)begin r=4'd0; g=4'd0; b=4'd0; sr = sr; sg = sg; sb = sb; end else begin if (!btnR)begin sr = sr + 4'd1; r = sr; end else if (!btnG)begin sg = sg + 4'd1; g = sg; end else if(!btnB)begin sb <= sb + 4'd1; b = sb; end else begin sr = sr; sg = sg; sb = sb; r = r; g = g; b = b; end end end endmodule ``` ```verilog= module RGB(HSync,rst,btnR,btnG,btnB,r,g,b); input rst,HSync; input btnR,btnG,btnB; output reg [3:0]r; output reg[3:0]g; output reg[3:0]b; //for state reg state; always@(*)begin if(!rst)begin end else begin if(!HSync)begin state = end end end endmodule ```