iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Software Development

超簡單的 Verilog 入門講解系列 第 28

[Day 28] Verilog E-1 難度丁 P2海域的斬殺3 - Rs232訊號協議 TB設計3(初始化輸入數據)

  • 分享至 

  • xImage
  •  

我們要先來設計一個訊號,隨便寫一個吧

https://ithelp.ithome.com.tw/upload/images/20221011/20135862HjFMXLPs1x.png

最前面為 16個 High,所以就是 16'b1111111111111111 簡化一點好了用 Hex寫 16'hffff

1.最前面為 16個 High 就是 16'hffff

再來是 Start
https://ithelp.ithome.com.tw/upload/images/20221011/20135862Aa9IUeUBrS.png

2.Start 就是 2'b10

再來是 開始的 0
https://ithelp.ithome.com.tw/upload/images/20221011/20135862V7gJrKuGbY.png

3.開始的 0 就是 1'b0

我們隨便想一下要輸入甚麼,那就輸入 F0好了
https://ithelp.ithome.com.tw/upload/images/20221011/20135862qZFoMorEkC.png

4.輸入 F0 就是 8'hF0

最後再把它抬起來,設成1
https://ithelp.ithome.com.tw/upload/images/20221011/201358629xUcpxTYCN.png

5.輸入 1 就是 1'b1

我們來組起來吧

再組起來前我們要先想,發送的位置,我們將 第0位做為發送
我們將 Data_Test_input的第0位接到Data_tb1,但是接線就要用到 Wire 所以步驟為

  1. Data_tb1改為Wire

  2. Data_Test_input的第0位接到Data_tb1

  3. Data_tb1改為Wire


module tb1();

//Data_tb1改為Wire
Wire Data_tb1;
reg clk_tb1;
reg reset_tb1;
        
reg[???] Data_Test_input

  1. Data_Test_input的第0位接到Data_tb1

module tb1();

//Data_tb1改為Wire
Wire Data_tb1;
reg clk_tb1;
reg reset_tb1;
        
reg[???] Data_Test_input


assign Data_tb1 = Data_Test_input[0];

我們設定 第0位做為發送,使用右移的方式,那要看看怎麼組出
https://ithelp.ithome.com.tw/upload/images/20221011/201358628WGjVzw8RV.png

所以步驟是:
1.最前面為 16個 High 就是 16'hffff
2.Start 就是 2'b10
3.開始的 0 就是 1'b0
4.輸入 F0 就是 8'hF0
5.輸入 1 就是 1'b1

https://ithelp.ithome.com.tw/upload/images/20221011/20135862fMdMGVtbJY.png

1.簡化一點好了用 Hex寫 16'hffff
雖然是右移但是 一開始前面 16位都是1 所以沒差

Data_Test_input<={ ,16'hffff};

https://ithelp.ithome.com.tw/upload/images/20221011/201358628g6Zd6wE4a.png

2.Start 就是 2'b10

但是右移所以是 2'b01 (右邊先輸出 2'b01 先輸出 0 在輸出1 就是 2'b10)

Data_Test_input<={ 2'b01,16'hffff};

https://ithelp.ithome.com.tw/upload/images/20221011/201358623GiYyYxTcM.png

3.開始的 0 就是 1'b0

Data_Test_input<={1'b0, 2'b01,16'hffff};

https://ithelp.ithome.com.tw/upload/images/20221011/20135862008CBqLYWH.png

4.輸入 F0 就是 8'hF0

這時重新看一下這張圖
https://ithelp.ithome.com.tw/upload/images/20221011/20135862ptQzat8aRf.png

8'hF0 = {1,1,1,1,0,0,0,0}

https://ithelp.ithome.com.tw/upload/images/20221011/20135862VXr5wNTVtw.png

先輸出 F0 的 b0 在輸出 Data_Test_input<={1'b0, 1'b0,2'b01,16'hffff};
在輸出 F0 的 b1 在輸出 Data_Test_input<={2'b00, 1'b0,2'b01,16'hffff};
先輸出 F0 的 b2 在輸出 Data_Test_input<={3'b000, 1'b0,2'b01,16'hffff};
在輸出 F0 的 b3 在輸出 Data_Test_input<={4'b0000, 1'b0,2'b01,16'hffff};
先輸出 F0 的 b4 在輸出 Data_Test_input<={5'b10000, 1'b0,2'b01,16'hffff};
在輸出 F0 的 b5 在輸出 Data_Test_input<={6'b110000, 1'b0,2'b01,16'hffff};
先輸出 F0 的 b6 在輸出 Data_Test_input<={7'b111000, 1'b0,2'b01,16'hffff};
在輸出 F0 的 b7 在輸出 Data_Test_input<={8'b11110000, 1'b0,2'b01,16'hffff};

5.輸入 1 就是 1'b1

Data_Test_input<={1'b1,8'b11110000, 1'b0,2'b01,16'hffff};

我們來算一下喔
1(1'b1)+8(8'b11110000)+1(1'b0)+2(2'b01)+16(16'hffff)

= 1 + 8 + 1 + 2 + 16 =28

reg[???] Data_Test_input → reg[27:0] Data_Test_input

好啦來初始化到 Data_Test_input

module tb1();

//Data_tb1改為Wire
Wire Data_tb1;
reg clk_tb1;
reg reset_tb1;
        
reg[27:0] Data_Test_input;


assign Data_tb1 = Data_Test_input[0];

Wire[7:0] Out_tb1;
Wire En_out_tb1;

Rs232_test1 Rs232_test_tb1(
    .Data1(Data_tb1),.clk(clk_tb1),.reset1(reset_tb1),
    .Out1(Out_tb1),.En_out(En_out_tb1)
    );
    
    
    
initial begin

Data_tb1<=0; clk_tb1<=0; reset_tb1<=0;

//初始化Data_Test_input
Data_Test_input<={1'b1,8'b11110000, 1'b0,2'b01,16'hffff};


end


always #5 clk<=~clk;


always@(posedge clk) begin
    
    
    if( Count_Test >= 287 ) begin
         Count_Test<=0;
    end
    else begin
         Count_Test <= Count_Test + 1 ;
    end
    
    if( Count_Test == 0 ) begin

       ?????????? 
       
    end
    
end

endmodule

明天再來寫 如何右移輸出入 也就是 ??????????


上一篇
[Day 27] Verilog E-1 難度丁 P2海域的斬殺2 - Rs232訊號協議 TB設計2(計算輸入資料的 clk數量)
下一篇
[Day 29] Verilog E-1 難度丁 P2海域的斬殺4 - Rs232訊號協議 TB設計4(設計右移)
系列文
超簡單的 Verilog 入門講解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言