今天一個下午都在這個問題上掙紮,令PicoBlaze讀取四個switches的狀态值,顯示在LCD上,但是無論怎麼改變鍵值,始終讀回來的值是0xF,這說明沒有讀回來的值是錯誤的。
造成錯誤的原因無非有兩個,一個psm軟體程式的問題,另一個當然是hdl邏輯的錯誤。
首先我測試了彙程式設計式的原因,INPUT 是PicoBlaze的讀指令,測試的程式是這樣的(測試部分後用;注釋掉了)
display_sw:
INPUT s6, SW ;read the value of switches
;LOAD s6,aa
;OUTPUT s6,LED
我把讀到的鍵值顯示在LED上,發現顯示也是不變,進而得知是HDL的問題。
開始時的INPUT INTERFACE是這樣定義的
reg [7:0] in_port_data;
always @(posedge clk)
if(reset)
in_port_data <= 0;
else if(read_strobe==1 && port_id[0]==1)
in_port_data<={4'b0000,sw};
else in_port_data<=8'hzz;
assign in_port = in_port_data;
我的INPUT INTERFACE是最後是這樣定義的才得到正确結果
//----------------------------------------------------------------------------------------------------------------------------------
// Input interface
//----------------------------------------------------------------------------------------------------------------------------------
reg [7:0] in_port_data;
always @*
if(port_id[0])
//error: sw的port_id是01,是以此處[]為0,錯作1
in_port_data={4'b0000,sw};
else in_port_data=0;
assign in_port = in_port_data;
放一張read operation timing 圖
user guide 曰: The external circuit must ensure that the input data is stable during the sampling edge to avoid a timing violation.
這樣看來我的電路設計可能是造成了timing violation.看了别人的設計是這樣的,恍然大悟。
continuous access ports
OPTIMISM, PASSION & HARDWORK