有時(shí)候在復(fù)雜系統(tǒng)設(shè)計(jì)的時(shí)候會用遇到讓“計(jì)數(shù)器在某個(gè)區(qū)間內(nèi)來回不停遞增遞減”的問題。
話不多說,我們直接上代碼。
以0-10的循環(huán)計(jì)數(shù)為例。
工具:Modelsim, VScode
1.準(zhǔn)備工作
首先在電腦上新建三個(gè)文件夾,SRC、TB以及SIM,用來放置源代碼、仿真文件以及仿真工程文件。
一定不要怕麻煩,特別是新手一定要注意代碼的分類工作!良好的分類能夠大大的提高工作效率。
剛接觸代碼量小,幾十行代碼一個(gè)文件就搞定了。但是隨著從業(yè)時(shí)間的增加,工作復(fù)雜度的提升,代碼的難度也會隨之提升,如果不做好分類管理,面對幾十個(gè)源代碼,十幾個(gè)仿真文件……崩潰是必然的。
請注意:一定不能有中文路徑?。?/p> 這樣是錯誤的
應(yīng)該這樣修改
2.工程建立
- 在src文件中添加一個(gè).v文件,名字自擬,最好能夠體現(xiàn)出文件的特性。
module test (
input sys_clk,
input rst_n,
);
reg flag;
reg [7:0] adc_data;
always @(posedge sys_clk or negedge rst_n) begin
if (~rst_n)
flag <= 1'd0;
else
case (flag)
1'd0:
if (adc_data == 8'd9) // -1
flag <= 1'd1;
else
flag <= 1'd0;
1'd1:
if (adc_data == 8'd1) // +1
flag <= 1'd0;
else
flag <= 1'd1;
default: flag <= flag;
endcase
end
always @(posedge sys_clk or negedge rst_n) begin
if (~rst_n) begin
adc_data <= 8'd0;
end
else if (flag == 1'd0)
adc_data <= adc_data + 8'd1;
else if (flag == 1'd1)
adc_data <= adc_data - 8'd1;
else
adc_data <= adc_data;
end
endmodule
- 在tb文件夾中新建文件,給出仿真所需要的激勵。我們此次所需的只有時(shí)鐘和復(fù)位。時(shí)鐘設(shè)置為50Mhz,復(fù)位1000ns。
`timescale 1 ns /1 ps
module tb_test;
reg sys_clk;
reg rst_n;
test u_tb_test(
.sys_clk (sys_clk),
.rst_n (rst_n)
);
initial begin
sys_clk = 0;
rst_n = 0;
#1000;
rst_n = 1;
#20000;
end
always #10 sys_clk = ~ sys_clk;
endmodule
- 在sim文件夾中新建一個(gè)Modelsim仿真工程,添加src,tb中的文件,此過程不再展示。
3.仿真驗(yàn)證
仿真1us,觀察波形。實(shí)現(xiàn)了0-10直接的循環(huán)計(jì)數(shù),設(shè)計(jì)成功。
審核編輯:符乾江
-
FPGA
+關(guān)注
關(guān)注
1624文章
21573瀏覽量
600705 -
仿真分析
+關(guān)注
關(guān)注
3文章
104瀏覽量
33610
發(fā)布評論請先 登錄
相關(guān)推薦
評論