北郵22信通一枚~
跟隨課程進度更新北郵信通院數字系統設計的筆記、代碼和文章
持續關注作者 迎接數電實驗學習~
獲取更多文章,請訪問專欄:
北郵22級信通院數電實驗_青山如墨雨如畫的博客-CSDN博客
目錄
一.代碼部分
1.1一些更新和講解
1.2改正后的代碼
?二.管腳分配
三.實驗效果
一.代碼部分
1.1一些更新和講解
12.03更新:
pwm……很抽象 原先版本的代碼運行之后應該是亮白燈()我班大佬幫改了一下之后目前如下這個樣子,,,,
邏輯都一樣就是寫法不同,,,不知道為啥就好使了,,,
還有佬能給解釋一下不,,,
然后:借鑒的時候別忘了把我前面的注釋刪下去()
12.03更新2:
感謝評論區各位uu!!
明白原先是怎么錯的了 例化的時候函數參數調用順序錯了
原先那么寫也是可以的,,例化的時候調一下函數參數順序就可以了
//完了C++知識是忘光了()
//12.03更新:我班大佬幫改出來了::
//原先的這段不行 但不知道為啥不行(
//借鑒的時候別忘了把這段刪下去(
/*
module pwm
(input [7:0] duty,input clk,output reg out
);reg [7:0] buffer;always @ (posedge clk)begin buffer <= buffer + 1;if(buffer < duty)begin out <= 0;endelsebegin out <= 1;endend
endmodule
*/
/*
12.03更新2:
原pwm模塊書寫沒有問題,例化的時候函數參數調用順序出了問題
例化時應改為:pwm pwm_red(red,clk,red_buffer);
*/
// 模塊定義: pwm
// 該模塊實現一個簡單的脈寬調制(PWM)發生器。
module pwm(out,duty,clk);input [7:0] duty; // 輸入,表示占空比,范圍從0到255input clk; // 輸入,時鐘信號用于同步output reg out; // 輸出信號,表示PWM波形reg [7:0] buffer; // 8位寄存器,用于存儲當前計數值always @ (posedge clk)begin buffer <= buffer + 1;// 在每個時鐘上升沿遞增緩沖區值if (buffer < duty)// 將緩沖區值與占空比進行比較:如果緩沖區小于占空比,則將輸出設置為0;否則,設置為1。beginout <= 0;endelsebeginout <= 1;endend
endmodule module rainbow_breathing_light(clk,red,green,blue);input clk;output red,green,blue;reg [15:0] wheel_position;reg [7:0] wheel_position_buffer;reg [7:0] red_buffer,green_buffer,blue_buffer;reg [31:0] divide_buffer;wire clk;reg divide_clk;pwm pwm_red(red,red_buffer,clk);pwm pwm_green(green,green_buffer,clk);pwm pwm_blue(blue,blue_buffer,clk);always @ (posedge clk)begin if(divide_buffer < 50000)begin divide_buffer <= divide_buffer + 1;endelsebegin divide_clk <= ~divide_clk;divide_buffer <= 0;endendalways @ (posedge divide_clk)begin if(wheel_position < 765)wheel_position <= wheel_position + 1;elsewheel_position <= 0;if(wheel_position < 255)begin red_buffer <= 255 - wheel_position;green_buffer <= 0;blue_buffer <= wheel_position;endelse if(wheel_position < 510)begin red_buffer <= 0;green_buffer <= wheel_position - 255;blue_buffer <= 255 - (wheel_position - 255);endelsebeginred_buffer <= wheel_position - 510;green_buffer <= 255 - (wheel_position - 510);blue_buffer <= 0;endend
endmodule
1.2改正后的代碼
將模塊定義(類比C++函數接口定義)中的形參順序改動:
rainbow_breathing_light.v
// 模塊定義: pwm
// 該模塊實現一個簡單的脈寬調制(PWM)發生器。
module pwm(out,duty,clk);input [7:0] duty; // 輸入,表示占空比,范圍從0到255input clk; // 輸入,時鐘信號用于同步output reg out; // 輸出信號,表示PWM波形reg [7:0] buffer; // 8位寄存器,用于存儲當前計數值always @ (posedge clk)begin buffer <= buffer + 1;// 在每個時鐘上升沿遞增緩沖區值if (buffer < duty)// 將緩沖區值與占空比進行比較:如果緩沖區小于占空比,則將輸出設置為0;否則,設置為1。beginout <= 0;endelsebeginout <= 1;endend
endmodule module rainbow_breathing_light(clk,red,green,blue);input clk;output red,green,blue;reg [15:0] wheel_position;reg [7:0] wheel_position_buffer;reg [7:0] red_buffer,green_buffer,blue_buffer;reg [31:0] divide_buffer;wire clk;reg divide_clk;pwm pwm_red(red,red_buffer,clk);pwm pwm_green(green,green_buffer,clk);pwm pwm_blue(blue,blue_buffer,clk);always @ (posedge clk)begin if(divide_buffer < 50000)begin divide_buffer <= divide_buffer + 1;endelsebegin divide_clk <= ~divide_clk;divide_buffer <= 0;endendalways @ (posedge divide_clk)begin if(wheel_position < 765)wheel_position <= wheel_position + 1;elsewheel_position <= 0;if(wheel_position < 255)begin red_buffer <= 255 - wheel_position;green_buffer <= 0;blue_buffer <= wheel_position;endelse if(wheel_position < 510)begin red_buffer <= 0;green_buffer <= wheel_position - 255;blue_buffer <= 255 - (wheel_position - 255);endelsebeginred_buffer <= wheel_position - 510;green_buffer <= 255 - (wheel_position - 510);blue_buffer <= 0;endend
endmodule
?二.管腳分配
三.實驗效果
彩虹呼吸燈。?